The last few days I've been working on implementing copyArea acceleration, which is really a useful feature for faster scrolling. Instead of re-painting the whole scrolled area, only a small image of the "uncovered" are is sent to the browser - while the content already on screen is simply moved.
Supporting accelerated operations like this required quite a bit of tinkering with the code-base - accalerated operations require invalidated regions to be preserved before (which is why it wouldn't be wise to accelerate other primitives like fillRect too).
Long talk ... it still needs more work, because there are still artifacts. Other than that I am pleased with the performance results.
Now the ugly - keyboard events for now only work for basic characters on german keyboards.
Browsers are really broken in this regard. Sometimes the same keyCode is generated for different keys, sometimes keys can only differentiate by the order the keyPressed/Typed/Released events are generated.
All this is of course highly browser specific and without having an idea what keyboard layout is used actually, there isn't really a cure for the mess. Not so great idea to make a scripted document viewer the dominant runtime for distributed applications :/
Thanks a lot to the Joel Martin (Author of noVNC) who allows me to base my code on top of noVNC's input handling.