Commit Graph

496 Commits

Author SHA1 Message Date
Joel Martin 0ce93900ae Add message panel when hosted at kanaka.github.com.
Add a helpful popup/panel message for when noVNC is used at
kanaka.github.com (e.g. where novnc.com redirects).
2012-02-15 14:12:27 -06:00
Joel Martin 9e6e6662c7 Set $D on window directly.
Addresses: https://github.com/kanaka/websockify/issues/29
2012-02-14 17:23:14 -06:00
Joel Martin 32f135d730 Add array map function for IE9. 2012-02-14 07:53:39 -06:00
Joel Martin 1af3e54bef Make WebSocket encrypt setting default to page protocol.
I.e. if the page is https:// then the WebSocket encrypt setting will
default to wss:// (TLS encryption).

Note that since noVNC settings are saved in cookies, this will only
affect first load. If you have already loaded the page, then the
encrypt setting will be whatever you last set it to.
2012-02-02 09:29:02 -06:00
Joel Martin 6a02f88e4d Default path to 'websockify' in include/ui.js 2012-01-31 13:37:20 -06:00
Mike Tinglof 9b75bcaada add tight zlib stream reset; add error if tight encoding is used w/o true color 2012-01-31 00:15:56 -05:00
Mike Tinglof a14b8fae2a comment out per-decompress checksum and logging 2012-01-30 02:26:36 -05:00
Mike Tinglof 2cedf48397 add last rect special encoding; fix tight fill subencoding color handling; fix mono indexed rect handling 2012-01-30 02:19:18 -05:00
Mike Tinglof c514fd5e1c don't need to copy palette data until we have all data for rect; change a few comments 2012-01-29 02:10:25 -05:00
Mike Tinglof 5ca5e2d8cd implement tight indexed rectangle; remove some debug code 2012-01-29 01:55:41 -05:00
Mike Tinglof 6fbc37489f fix handling of min compression size 2012-01-28 02:56:19 -05:00
Mike Tinglof b0ac240f31 re-enable history buffer (used as sliding window for decompress) 2012-01-28 01:56:55 -05:00
Mike Tinglof 0fa6748c52 fix issue with parsing distance of more then 8 bits; convert to just supporting arrays for buffers 2012-01-26 14:35:36 -05:00
Mike Tinglof a820f1267a added rgb image drawing, some zlib changes (huffman coding working, but lz77 not so much) 2012-01-25 18:09:55 -05:00
Mike Tinglof c577ca2305 keep zlib history so we can decode as a stream 2012-01-24 21:18:29 -05:00
Mike T de84e09854 basic framing for tight is working (decode not complete) 2012-01-24 13:56:33 -05:00
Mike 682f33a790 add javascript zlib 2012-01-24 13:49:49 -05:00
Joel Martin e79917c3db Merge remote branch 'origin/issue-70'
Conflicts:
	include/display.js
	include/rfb.js

This merges in the fix for https://github.com/kanaka/noVNC/issues/70

This changes noVNC to use the preferred color ordering that most VNC
server prefer and that VMWare VNC requires. It's possible this may
break some VNC servers out there in which case we might have to do
something a bit more subtle such as having alternate render functions
for little and big endian color ordering.
2012-01-12 17:17:11 -06:00
Joel Martin a9a7f0e18c Fix Intel AMT KVM: disable true color.
Issue: https://github.com/kanaka/noVNC/issues/118
Reporter @maxnet also found and suggested the fix.

Probably could be more intelligent/generic by keying off the depth
sent by the server, but this will do for now.
2012-01-12 12:52:09 -06:00
Joel Martin ff4bfcb773 Linting.
Switched to using: http://www.jshint.com/
2012-01-12 12:38:55 -06:00
Joel Martin f2d856767d websockify: better multi-python version support.
Pull from websockify: 008a5118e728.

Should address issue https://github.com/kanaka/noVNC/issues/107

- Also add ability to force use of web-socket-js using
  window.WEB_SOCKET_FORCE_FLASH

- in websock.js, for rQshift*, assume length is the full length if not
  specified.
2011-12-15 15:26:16 -06:00
Joel Martin b688a909b0 Show close code and reason.
Also add commented out web-socket-js debug variable in
include/websock.js
2011-12-15 13:59:35 -06:00
Joel Martin 06a9ef0c6c Add View Only mode setting.
Resolve issue: https://github.com/kanaka/noVNC/pull/101

Based on proposal from @mightpenguin:
Matthew Balman <emperor@mightypenguin.org>

If view_only option is set then do not send mouse and keyboard events.
This is not a secure/enforced way to make a client view only. To
enforce view only at the server, most VNC servers support setting
a view only password.
2011-12-01 09:05:16 -06:00
Joel Martin c3a172b98c Typo in Opera 11.60 fix. 2011-11-19 17:59:06 -06:00
Joel Martin aa67056785 Fix issue #102 - Opera 11.60 doesn't work.
Opera presto engine version detection is broken. For now, just return
true or false. That should cover most cases.
2011-11-19 17:37:18 -06:00
Joel Martin f4bce78307 Re-organize CSS. Remove broken IE filter statement. 2011-09-29 12:09:32 -05:00
Joel Martin 5299db1a00 Formatting. Image renames/cleanup.
- Remove the images using the old font.

- Simplify the naming of the new control bar icon images.

- Change keyboard input type to 'email'. 'url' type doesn't have
  a space bar.

- Some clarifications to main LICENSE.txt file.
2011-09-29 09:32:09 -05:00
Chris Gordon 938daad1c9 Mobile icons.
- CSS highlighting of buttons when selected.
- Keyboard button tweaked to allow show/hide toggle of keyboard.

Signed-off-by: Chris Gordon <snorkeyg@gmail.com>
2011-09-29 09:05:15 -05:00
Joel Martin 479bfa9964 Add local copy of Orbitron font.
Instead of using Google Font API, use local copy of Orbitron for speed
and also in case Internet connection is flaky or unavailable.

More info about Orbitron font here:
http://www.google.com/webfonts/specimen/Orbitron

Orbitron font is:
Copyright (c) 2009, Matt McInerney <matt@pixelspread.com>

Licensed under SIL Open Font License 1.1
see docs/LICENSE.OFL-1.1 or http://scripts.sil.org/OFL
2011-09-27 16:53:09 -05:00
Joel Martin 6209639f2c Add WebSocket URL path to UI settings. 2011-09-27 12:36:06 -05:00
Joel Martin 7cd6118ce5 Move viewport functions.
Move viewportChange(), getCleanDirtyReset(), absX() and absY() to the
public API section. Also add some function comments.
2011-09-26 17:09:29 -05:00
Joel Martin 490d471c53 Remove support for non-HTML5 browsers.
Display API change:
    - getTile -> startTile (no longer returns a tile)
    - setSubTile -> subTile (drop img/tile first parameter)
    - putTile -> finishTile (no longer takes img/tile paramter)

The Display tile logic uses canvas image data directly and
caches/reuses a 16x16 imageData tile (for other sizes, the tile is
create for each call). This gives a 30% speedup on Chrome
13 (and no significant change for Firefox 3.6/4.0).

Other:

- Remove rgbxImageFill and cmapImageFill routines.

- Simplify constructor tests and just error if createImageData is not
  supported by canvas instead of .

- Remove webkit canvas bug workaround that effects Chrome 7. Chrome
  7 usage share is now less than 0.5 percent and the workaround is
  ugly. Drop the function wrapping in the constructor and the canvas
  flush() routine.

- Remove support for getImageData (Opera 11+ now required)

Update browser support list:

    - Chrome 8+ (really any except 7)
    - Firefox 3.6+
    - Safari 4+
    - Opera 11+
    - IE9+
    - iOS 4.2+
2011-09-26 11:28:24 -05:00
Joel Martin 859fc7f18f include/ui.js: remove console.log debug. 2011-09-26 11:16:16 -05:00
Joel Martin a7db50597c Fixing iOS clipping, keyboard issues.
- Make sure that on iOS the clipping setting is always forced to be
  enabled.
- Hide the showKeyboard button unless connected.
- Use the URL text entry method and disable autocorrect and
  autocapitalize in the show keyboard input box.
2011-09-23 00:51:55 -05:00
Joel Martin c506a48154 Only show move/drag button when clipping. Cleanup.
Cleanup:

- remove unused changeViewportMeta function from include/ui.js
- remove some debug output and debug CSS.
- rename panel toggle functions and put them in same location in the
  code.
- refactor some code from updateState to updateVisualState routine
  (renamed from updateSettingsState).
2011-09-23 00:04:01 -05:00
Joel Martin a5df24b488 Viewport clip/drag for mobile/touchscreen devices.
API changes (forward compatible):

- Display: add 'viewport' conf option to turn on and off viewport
  mode.
- RFB: add 'viewportDrag' option to enable/disable viewport dragging
  mode.

Other:

- Add clip mode setting to default UI. For touch devices, clipping is
  forced on.
- Use CSS media queries to adjust visual elements based on screen
  size. Especially disconnected logo size/position and button text size.
- Catch page unload while connected and give a confirm dialog.
- Change mouse button selector to a single button that changes between
  ' ', 'L', 'M', 'R' when clicked (empty means mouse is just being
  moved and doesn't send clicks).
- include/ui.js:setViewClip() routine sets the clipping of the
  viewport to the current size of the viewport area (if clipping is
  enabled).
- include/ui.js:setViewDrag() toggles/enables/disables viewport
  dragging mode.
- Add several images for the UI and for Apple devices:
    - images/clipboard.png: clipboard menu icon
    - images/connect.png: connect menu icon
    - images/disconnect.png: disconnect button icon
    - images/keyboard.png: show keyboard button
    - images/move.png: viewport drag/move toggle button
    - images/settings.png: settings menu icon
    - images/screen_320x460.png: iOS app/desktop link start image
    - images/screen_57x57.png: iOS app icon
    - images/screen_700x700.png: full size noVNC image
2011-09-22 10:36:23 -05:00
Joel Martin e0b23efe95 Fix fbUpdateRequest undefined parameter logic. 2011-09-14 10:42:15 -05:00
Joel Martin 608e0f52ee Some CSS style and DOM id/class cleanup. 2011-09-14 09:24:30 -05:00
Joel Martin 7e5f81f255 Merge branch 'master' into mobile 2011-09-13 16:53:04 -05:00
Joel Martin 832c744578 Framebuffer requests based on clean/dirty areas.
New routine fbUpdateRequests that builds the update request messages
based on the result of display.getCleanDirtyReset().

- Also, fix fbUpdateRequest to properly accept x,y,xw,yw parameters.
2011-09-13 14:42:38 -05:00
Joel Martin b70ce07706 Fix window/document sizing in firefox.
Another firefox issue is that height: 100% is calculated as 100% of
the containing element even when the containing element is the window.
This means that the size of any sibling element shifts the window size
down by that much and causes the vertical scroll bars to appear. This
doesn't happen in Chrome.

- So instead, put a pad element inside the noVNC_screen element that
  is the size of the control bar. This is hidden by the control bar,
  however, it causes things to be sized correctly.

- Also, rename noVNC_defaultScreen to noVNC_logo.

- Clean some style specification out of the HTML.
2011-09-13 13:14:11 -05:00
Joel Martin 1c3df652de Firefox offset bug: use margin instead of padding.
For some reason, the position calculation is broken in firefox when
a DOM object in the ancestry change uses padding. So use margin to
shift the view area down.
2011-09-13 12:17:44 -05:00
Joel Martin 9192cbe39c Merge branch 'master' into mobile
Conflicts:
	include/rfb.js
2011-09-13 10:14:53 -05:00
Joel Martin 54e7cbdf8f Viewport handling in include/display.js
Part of mobile device support:
https://github.com/kanaka/noVNC/issues/48

The Display object is redefined as a larger display region with
an equal or smaller visible viewport. The size of the full display
region is set/changed using resize(). The viewport is set/changed
using viewportChange().

All exposed routines that draw on the display now take coordinates
that are absolute (relative to the full display region). For example,
the result of fillRect(100, 100, 10, 10, [255,0,0]) will appear in the
canvas at (0,0) if the viewport is set to (100,100).

Details:

- Move the generic part of the viewport code from tests/viewport.html
  into include/display.

- Add two new routines to the Display interface:

    - viewportChange(deltaX, deltaY, width, height)
        - This adjusts the position of the visible viewport and/or the
          size of the viewport.

        - deltaX and deltaY specify how the position of the viewport
          should be shifted. The position of the viewport is clamped
          to the full region size (i.e. cannot outside the display
          region).

        - The clean and dirty regions of the display are updated based
          on calls to this routine. For example, if the viewport width
          is increased, then there is now a dirty box on the right
          side of the viewport. Another example, if the viewport is
          shifted down and to the left over the display region, there
          are now two dirty boxes: one on the left side and one
          on the bottom of the viewport.

    - getCleanDirtyReset()
        - This returns an object with the clean box and a list of
          dirty boxes (that need to be redrawn).

            {'cleanBox':
                {'x': x, 'y': y, 'w': w, 'h': h},
             'dirtyBoxes':
                [{'x': x, 'y': y, 'w': w, 'h': h}, ...]
             }

        - The coordinates in the clean and dirty boxes are absolute
          coordinates (relative to the full display region) but they
          are clipped to the visible viewport.

        - Calling this function also resets the clean rectangle to be
          the whole viewport (i.e. nothing visible needs to be redrawn
          dirty) so the caller of this routine is responsible for
          redrawing any
2011-09-13 09:54:44 -05:00
Joel Martin 6ea8bece9b Fix setBarPosotion runtime errors. 2011-09-08 10:10:46 -05:00
Joel Martin 01a9eee991 HTML, CSS and Javascript indent/formatting.
- 4 space indenting for HTML and Javascript.
- 2 space indenting for CSS
- Use hanging start curly for conditional blocks
2011-09-08 10:00:09 -05:00
Joel Martin 0911173a89 Disable static canvas logo. 2011-09-08 09:29:05 -05:00
Joel Martin 42e04907ff Merge remote branch 'kanaka/master' into mobile 2011-09-08 08:50:18 -05:00
Joel Martin d29c54c476 Remove unused include/plain.css. 2011-09-08 08:41:50 -05:00
Chris Gordon 89a76c785c New theme. File: include/blue.css 2011-09-08 08:38:36 -05:00
Chris Gordon a7eb596d89 Updated to use CSS3 gradients instead of images.
Fixed display bug with keyboard textbox.
2011-09-08 08:36:42 -05:00
Chris Gordon 8e0f008841 Fixed bugs with connection panel, and moved functions into UI class. 2011-09-08 08:35:27 -05:00
Chris Gordon c327865b4b Add base.css. Bar position formatting. 2011-09-08 08:29:49 -05:00
Chris Gordon 53fc7392bb Modifed UI. Move HTML from ui.js to vnc.html. 2011-09-08 08:26:30 -05:00
Chris Gordon 1734b5e465 Helper function for viewport meta changes.
changeViewportMeta() now does viewport changes.
2011-09-08 08:21:46 -05:00
Chris Gordon 7825b9ee9f Added support for native iOS and Android keyboards.
Tested with Safari on iPad for iOS and Asus Transformer for Android.
2011-09-08 08:20:38 -05:00
Joel Martin 1150d0f70f Only output debug colourMap table once. 2011-09-06 17:46:57 -05:00
Joel Martin ec40268e55 Working viewport test.
Tested on iOS (iPhone and iPad).

The viewport is correctly clipped to the screen/browser size and
resizing works correctly.

This uses the CSS3 Flexible Box Layout model.
2011-08-22 11:21:55 -05:00
Joel Martin ce3bdbccc2 Catch Mozilla prefixing of WebSocket.
Pull 475cfae from websockify.

In Firefox 7 Mozilla has added Websockets support but prefixed the
constructor with "Moz".
2011-08-02 08:02:51 -05:00
Joel Martin ad3f762409 Touch events and mouse button selectors.
First crack at supporting touch screen for devices like Android and
iOS tablets. Part of https://github.com/kanaka/noVNC/issues/48.

This change detects touch screen support and uses the touchstart,
touchmove, touchend events in place of the normal mouse events.

In order to support middle and right mouse clicks, if the device is
a touch device, then three toggle buttons are added to the UI
representing the left, middle and right mouse buttons. These select
which mouse button will be sent when the screen is touched. All the
buttons can be toggled off, in which case then the touch events only
move the mouse cursor rather than sending a mouse down and mouse up
for touchstart and touchend events respectively. This allows fairly
full control with the mouse on touch screens.
2011-07-23 21:24:59 -05:00
Joel Martin ac99a1f791 Change default PixelFormat. Fix canvas test.
Instead of R,G,B (red-shift of 0, green-shift of 8, and blue-shift
of 16), use the default ordering of B,G,R (red-shift of 16, green-shift of 8, and blue-shift
of 0) that tightvncserver uses (and that VMWare's VNC server seems to
require). Also, warn in the console if the server does not default to
the new format.

Fix the tests/canvas.html test. This is a general fix with regards to
the rename/refactor of canvas.js into display.js and not specific to
the color re-ordering.
2011-07-18 12:17:47 -05:00
Joel Martin c0c143a153 Version 0.1, debian packaging, license text.
noVNC version 0.1

Add debian packaging directory loosely based on
http://trac.zentyal.org/browser/trunk/extra/novnc/debian

Show web root directory on startup (pulled from websockify f1c8223).

Lintian fixups:
    - Some license text clarifications.
    - remove executable permission on utils/launch.sh and
      include/web-socket-js/web_socket.js
    - Add executable permission to utils/launch.sh
2011-07-14 15:57:01 -05:00
Joel Martin a4ff1f573d Fix ordering of tightPNG fills.
This addresses issue #65:
https://github.com/kanaka/noVNC/issues/65

When tightPNG encoded rects were received, any fill types were
immediately drawn to the canvas while images (PNG, JPEGs) were queued
for loading. This can cause screen corruption when things are changing
rapidly due to the misordering of fills vs images.

Also, remove the onload setting in each image on the queue and instead
decrease the tight image queue scanning interval (to 40ms or 25
scans per second).
2011-07-06 16:32:42 -05:00
Joel Martin c6fd71536f Show full pixelFormat received from server.
For debugging issue #70: https://github.com/kanaka/noVNC/issues/70
2011-07-01 13:17:20 -05:00
Joel Martin 61fc1f2287 Remove extraneous question mark.
Part of https://github.com/kanaka/noVNC/issues/69

Pull from websockify b590289de5.
2011-06-28 16:29:29 -05:00
Joel Martin 96513f5645 Merge branch 'master' of git@github.com:kanaka/noVNC 2011-06-28 16:23:57 -05:00
Joel Martin 0b7bc4e986 Only append random string to swf path in IE.
Issue https://github.com/kanaka/noVNC/issues/69

Thanks https://github.com/EdSchouten for the catch.

Import from websockify 9a2b50d8.
2011-06-28 16:22:50 -05:00
Ed Schouten 3b8caa4b09 Add support for passing the file name to get.
This change allows one to implement a single WebSockets proxy, which
multiplexes connections to different hosts.
2011-06-27 10:55:03 +02:00
Joel Martin fa8f14d56d Fix playback of recorded VNC.
- Update test mode calls to work with separate websock module.

- Pull in include/websock.js update 7f487fdbd from websockify.
2011-06-26 14:17:42 -05:00
Joel Martin 5210330a6c Refactor configuration attributes.
- Add conf_defaults which accepts an array of configuration
  attributes.
- Split out user configuration defaults from the actual configuration
  object.
- Add mode field and enforce read-only, write-once, read-write modes.
2011-05-11 17:31:53 -05:00
Joel Martin d890e8640f API changes/cleanup.
API changes:
    - include/canvas.js renamed to include/display.js
    - Display.rescale() method removed from API. Use Display.set_scale() instead.
    - Make logo configuration attribute of Display and display it when
      clear() is called if it is set.

API deprecations:
    - use RFB onUpdateState instead of updateState.
    - use RFB onClipboard instead of clipboardReceive.

See https://github.com/kanaka/noVNC/wiki/ModuleAPI for detailed noVNC
modules and API description.

Expand and normalize the event/callback interfaces. Standize on
"onEventName" form for callbacks.

    Callback Renames:
        - RFB updateState -> onUpdateState
        - RFB clipboardReceive -> onClipboard
        - Keyboard keyPress -> onKeyPress
        - Mouse mouseButton -> onMouseButton
        - Mouse mouseMove -> onMouseMove

    Callback Additions:
        - RFB onPasswordRequired
        - RFB onBell
        - RFB onFBUReceive
        - RFB onFBUComplete

Other:
- Add array type support to Util.conf_default()
- Removed a bunch of routines from the Display API that were just used
  internally and not actually by noVNC: flush, setFillColor,
  imageDataGet, imageDataCreate, rgbxImageData, rgbxImageFill,
  cmapImageData, cmapImageFill.
- More keyboard/mouse logging when debug turned on.
- Some JSLinting
2011-05-11 15:55:44 -05:00
Joel Martin 2fb665ec94 Merge branch 'master' of git@github.com:kanaka/noVNC 2011-05-09 18:09:59 -05:00
Joel Martin f31eeaa8ab Stop sending empty frames.
Pull from websockify a339a4856.
2011-05-09 17:22:02 -05:00
Joel Martin 1a2371fcd2 include/canvas.js: missed scale fix. 2011-04-29 14:04:40 -05:00
Joel Martin 58b4c53661 Fix scale/rescale attribute/hooks.
Still buggy so not yet activated in the UI, but the hooks are at least
here.
2011-04-29 14:01:40 -05:00
Joel Martin eb6426b4bc input.js: remove redundant switch case statments.
Issue #21 - non-US key handling.
2011-04-15 08:48:04 -06:00
Joel Martin dc4131b14a input.js: uncomment special key handling for non-US keys.
Issue #21 - non-US keyboard layouts.

The code section for tab, backspace and enter was commented out for
testing but got checked in that way. Fix that.
2011-04-15 08:40:20 -06:00
Joel Martin b7c9657b83 include/input.js: change to LGPL-2 or later.
Requested by Alexander Larsson at Red Hat to allow incorporation of
solution into HTML5 gtk 3.0 backend.
2011-04-14 11:25:11 -06:00
Joel Martin fac149ddbe input.js: adjust special key handling for non-US keys.
Issue #21 - non-US keyboard layouts.

Only identify some keys as special during the keyDown event so that
when using non-US keyboards the values don't overlap with the values
for normal keys.

Some keys have to still be identified in both keyDown and keyPress
since they generate both: backspace and enter for Firefox and Opera,
tab for Opera.
2011-04-12 09:06:11 -05:00
Joel Martin 0a92014700 include/webutil.js: fix dirObj undefined attribute. 2011-04-05 14:46:22 -05:00
Joel Martin d0c29bb679 Fix copyright year to 2011. 2011-04-05 14:44:47 -05:00
Joel Martin c96f900336 Refactor keyboard event handling.
This is part of addressing issue #21 - non-US keyboard layouts.

There are several challenges when dealing with keyboard events:
  - The meaning and use of keyCode, charCode and which depends on
    both the browser and the event type (keyDown/Up vs keyPress).
  - We cannot automatically determine the keyboard layout
  - The keyDown and keyUp events have a keyCode value that has not
    been translated by modifier keys.
  - The keyPress event has a translated (for layout and modifiers)
    character code but the attribute containing it differs. keyCode
    contains the translated value in WebKit (Chrome/Safari), Opera
    11 and IE9. charCode contains the value in WebKit and Firefox.
    The which attribute contains the value on WebKit, Firefox and
    Opera 11.
  - The keyDown/Up keyCode value indicates (sort of) the physical
    key was pressed but only for standard US layout. On a US
    keyboard, the '-' and '_' characters are on the same key and
    generate a keyCode value of 189. But on an AZERTY keyboard even
    though they are different physical keys they both still
    generate a keyCode of 189!
  - To prevent a key event from propagating to the browser and
    causing unwanted default actions (such as closing a tab,
    opening a menu, shifting focus, etc) we must suppress this
    event in both keyDown and keyPress because not all key strokes
    generate on a keyPress event. Also, in WebKit and IE9
    suppressing the keyDown prevents a keyPress but other browsers
    still generated a keyPress even if keyDown is suppressed.

For safe key events, we wait until the keyPress event before
reporting a key down event. For unsafe key events, we report a key
down event when the keyDown event fires and we suppress any further
actions (including keyPress).

In order to report a key up event that matches what we reported
for the key down event, we keep a list of keys that are currently
down. When the keyDown event happens, we add the key event to the
list. If it is a safe key event, then we update the which attribute
in the most recent item on the list when we received a keyPress
event (keyPress should immediately follow keyDown). When we
received a keyUp event we search for the event on the list with
a matching keyCode and we report the character code using the value
in the 'which' attribute that was stored with that key.

For character codes above 255 we use a character code to keysym lookup
table. This is generated using the util/u2x11 script contributed by
Colin Dean (xvpsource.org).
2011-04-05 14:26:54 -05:00
Joel Martin d1bd5ec7d4 Fix focus/clipboard related to mouse/keyboard refactor. 2011-04-03 17:51:47 -05:00
Joel Martin d3796c149e API change: Mouse/kbd handling to include/input.js
API change: for intergrators that explicitly include the Javascript
files (that do not use include/vnc.js)js, include/input.js is a new
file that must also be included.

The mouse and keyboard handling could be useful on its own so split it
out into a Keyboard and Mouse class in include/input.js.

This refactoring is preparation to deal with issue #21 - non-US
keyboard layouts.
2011-04-03 17:30:45 -05:00
Joel Martin f899070482 IE9 fixes: mouse, doctype. Adobe Flash link.
Fix mouse button mapping in IE9. All browsers have converged on
a standard left=0, middle=1, right=2 ... all except IE that is.

Add html5 doctype to tests.

In vnc_perf test, use do_test instead of start for function name since
start is a keyword in IE.

In error about Flash give a link to Adobe's download page.
2011-03-29 15:44:03 -05:00
Joel Martin 0b6292b8c0 No exception if noVNC_logo is undefined. 2011-03-25 09:01:53 -05:00
Joel Martin 81bcf70fdc Higher connectTimeout default with web-socket-js.
Current timeout is 2 seconds for connect timeout. Use 5 seconds if
web-socket-js (Flash WebSockets emulator) is being used. On Windows XP
with Flash 10.2.152.26, connecting seems to take quite a bit longer
than it probably should. This should make it work more consistently.
2011-03-22 14:24:55 -05:00
Joel Martin bbd21ca7b5 Update web-socket-js to bb5797cad.
Syncs with same change to websockify (7534574a2f).

Primary change is removal of FABridge interface.

Seems to improve overall latency by perhaps 10%. Also, the slowdown
over time in Opera is about half as bad (but still there).
2011-03-16 10:33:01 -05:00
Joel Martin 43cf7bd83b Some JSLint'ing 2011-02-19 16:44:10 -06:00
Joel Martin 159ad55d03 Add logo, favicon.
Thanks to Michael Sersen for creating images/Logo.svg.

- Add images directory with original SVG logo, favicon, and some
  derivative PNGs of the logo for different purpose.

- Note that license on images/* is CC BY-SA.

- Add utils/img2js.py to take an image and generate a base64 encoded
  data URI string.

- Add base64 encoded data URI screen logo to display in canvas when
  disconnected.
2011-02-03 11:04:32 -06:00
Joel Martin 0f354fb682 Fix CSS sizes with HTML5 doctype.
Using HTML5 doctype means CSS pixels sizes must have "px" suffix which
many of them did not. Fix that.
2011-02-02 10:48:29 -06:00
Joel Martin 0981845ec4 IE9 fixes. Works but slow. API change.
API change: changed include path variable from VNC_uri_prefix to
URI_INCLUDE since websock.js uses the variable and websock.js is no
longer just for noVNC (i.e. websockify is really the canonical
location for websock.js).

Changes to get web-socket-js to work. Right now it's a hack to get
around: https://github.com/gimite/web-socket-js/issues#issue/41. The
hack is to disable caching of the flash objects by appending
"?" + Math.random() to the end of the flash object path (but only when
using IE).
2011-01-30 22:58:22 -06:00
Joel Martin 7cc5fbc52e Opera 11 WebSockets and Opera '-' key mapping fix.
Opera 11 native WebSockets (if enabled) seems to have bad behavior for
the bufferedAmount so add change from websockify project to allow max
bufferedAmount (before send queue is delay) to be configured.

Also, Opera 11 and 10.60 behave like Mozilla regarding the '-' key so
translate it correctly.
2011-01-23 19:36:11 -06:00
Joel Martin 1756a30a48 websock.send returns true/false.
If all send data was flushed from the send queue then return true,
otherwise false. This doesn't mean the data won't be sent, just that
it wasn't sent this time and is queued.
2011-01-23 19:21:04 -06:00
Joel Martin 8b502df2a1 Tolerate some bufferedAmount.
Only delay sending data if bufferedAmount is greater than 1000.

This seems to match the intention of the spec better. bufferedAmount
does not mean that we can't send, it's just an indication that the
network is becoming saturated. But Opera 11 native WebSockets seems to
have a bug that bufferedAmount isn't set back to zero correctly so
we'll be a bit more tolerant.
2011-01-23 19:17:59 -06:00
Joel Martin cabecf8964 canvas.js: prevent Opera keyboard event bubbling.
Issue #8: https://github.com/kanaka/noVNC/issues#issue/8
2011-01-19 13:09:32 -06:00
Joel Martin b43c9838a5 web-socket-js: Add function invocation fix.
Related to this issue:
https://github.com/gimite/web-socket-js/issues/#issue/50

This prevents the "Uncaught exception: TypeError:
'this.__handleEvents' is not a function" everytime the timer fires.

Yay, one of Javascript's worst behaviors; the way it sets "this".
2011-01-19 13:01:28 -06:00
Joel Martin 9a23006e7a include/canvas.js: fix changeCursor data format.
Issues #27 (safari cursor rendering messed up) and #29 (firefox 3.6.10
segault).

Finally found some better reference on the icon/cursor format which is
added to the docs/links file.

It seems like I was missing the XOR section. So setting the cursor
would cause corruptin in Safari rendering or the segfault for firefox.
2011-01-18 23:22:25 -06:00
Joel Martin 2840026468 include/canvas.js: add numpad support to getKeysym.
Check keyLocation and translate numpad keys into numbers. keyLocation
is not widely supported yet, but it should start percolating into
browsers eventually:
http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent

This change is based on:
8e59e3772c
2011-01-18 12:16:50 -06:00
Joel Martin 24d01a5aa4 Update gimite/web-socket-js build.
Update to a build based on 20f837425d4 from gimite/web-socket-js.

This changes the event handling code and fixes the frequent recursive
call into Flash errors.
2011-01-16 19:05:58 -06:00
Joel Martin 1b097a63a3 Fix strict mode complaints in firefox 4. 2011-01-16 18:57:45 -06:00
Joel Martin 72f1348b35 Convert to Websock library.
Copy in include/websock.js from websockify and use that instead. Still
some cleanup of network code but it's a good start.
2011-01-13 00:30:08 -06:00
Joel Martin f2538f337d wsproxy, wstelnet: wrap command, WS telnet client.
wswrapper:

    Getting the wswrapper.c LD_PRELOAD model working has turned out to
    involve too many dark corners of the glibc/POSIX file descriptor
    space. I realized that 95% of what I want can be accomplished by
    adding a "wrap command" mode to wsproxy.

    The code is still there for now, but consider it experimental at
    best. Minor fix to dup2 and add dup and dup3 logging.

wsproxy Wrap Command:

    In wsproxy wrap command mode, a command line is specified instead
    of a target address and port. wsproxy then uses a much simpler
    LD_PRELOAD library, rebind.so, to move intercept any bind() system
    calls made by the program. If the bind() call is for the wsproxy
    listen port number then the real bind() system call is issued for
    an alternate (free high) port on loopback/localhost.  wsproxy then
    forwards from the listen address/port to the moved port.

    The --wrap-mode argument takes three options that determine the
    behavior of wsproxy when the wrapped command returns an exit code
    (exit or daemonizing): ignore, exit, respawn.

    For example, this runs vncserver on turns port 5901 into
    a WebSockets port (rebind.so must be built first):

        ./utils/wsproxy.py --wrap-mode=ignore 5901 -- vncserver :1

    The vncserver command backgrounds itself so the wrap mode is set
    to "ignore" so that wsproxy keeps running even after it receives
    an exit code from vncserver.

wstelnet:

    To demonstrate the wrap command mode, I added WebSockets telnet
    client.

    For example, this runs telnetd (krb5-telnetd) on turns port 2023
    into a WebSockets port (using "respawn" mode since telnetd exits
    after each connection closes):

        sudo ./utils/wsproxy.py --wrap-mode=respawn 2023 -- telnetd -debug 2023

    Then the utils/wstelnet.html page can be used to connect to the
    telnetd server on port 2023. The telnet client includes VT100.js
    (from http://code.google.com/p/sshconsole) which handles the
    terminal emulation and rendering.

rebind:

    The rebind LD_PRELOAD library is used by wsproxy in wrap command
    mode to intercept bind() system calls and move the port to
    a different port on loopback/localhost. The rebind.so library can
    be built by running make in the utils directory.

    The rebind library can be used separately from wsproxy by setting
    the REBIND_OLD_PORT and REBIND_NEW_PORT environment variables
    prior to executing a command. For example:

        export export REBIND_PORT_OLD="23"
        export export REBIND_PORT_NEW="65023"
        LD_PRELOAD=./rebind.so telnetd -debug 23

    Alternately, the rebind script does the same thing:

        rebind 23 65023 telnetd -debug 23

Other changes/notes:

- wsproxy no longer daemonizes by default. Remove -f/--foreground
  option and add -D/--deamon option.

- When wsproxy is used to wrap a command in "respawn" mode, the
  command will not be respawn more often than 3 times within 10
  seconds.

- Move getKeysym routine out of Canvas object so that it can be called
  directly.
2011-01-12 13:15:11 -06:00
Joel Martin 9b940131d3 include/canvas.js: show full user agent in console. 2011-01-04 10:30:26 -06:00
Joel Martin e3716842ef include/rfb.js: show Flash version in console. 2011-01-04 10:27:25 -06:00
Joel Martin bf5ee68828 Expose getKeysym and add keyboard test.
Related to issue Non-US keyboard layout option issue:
https://github.com/kanaka/noVNC/issues#issue/21
2011-01-03 12:34:41 -06:00
Joel Martin fce6ac5cb4 Fix to "Tolerate fragmented ServerInit".
Issue #39: https://github.com/kanaka/noVNC/issues/issue/39
2010-12-24 17:39:13 -07:00
Joel Martin 318d473438 Tolerate fragmented ServerInit.
Issue #39: https://github.com/kanaka/noVNC/issues/issue/39
2010-12-24 15:02:48 -07:00
Joel Martin e46719100c Make compatible with jQuery. Slight API change.
Rename the $() selector to $D() so that it doesn't collide with
the jQuery name.

The API change is that the 'target' option for Canvas and RFB objects
must now be a DOM Canvas element. A string is no longer accepted
because this requires that a DOM lookup is done and the Canvas and RFB
should have no UI code in them. Modularity.
2010-12-10 08:25:36 -06:00
Joel Martin 79f0a095b6 rfb.js: avoid multiple b64 sequences per frame.
Only call encode_message when the WebSockets object is actually
ready to send. Otherwise multiple base64 encode sequences can be
encoded into the same WebSockets frame. This causes the C version of
wsproxy to crash and the python version to ignore the subsequent
base64 sequence(s).

Thanks to Colin Dean (xvpsource.org) for finding this and helping
track it down.
2010-11-15 13:43:26 -05:00
Joel Martin f7ec5b2cb6 Rename default_controls.js to ui.js.
And DefaultControls to UI.
2010-11-10 16:02:19 -06:00
Joel Martin e66f3f89f2 Add Chrome Frame support. Close requests in web.py.
- Add meta tag to vnc.html and vnc_auto.html so that if Chrome Frame
  is installed, it is used.

- Add detection to default_controls.js that shows a message with
  a Chrome Frame install link if the user is using a version of IE
  without Canvas support.

- Fix web.py so that requests have their connection closed after they
  are completed.  This has been a bug for a while but it prevents
  Chrome Frame from working because Chrome Frame doesn't activate
  until the initial request connection closes.
2010-11-09 12:06:03 -06:00
Joel Martin c1d008f1ee Fix flush with strict DOCTYPE.
- With a strict doctype, the margin size needs a "px" suffix.
2010-11-06 14:11:30 -05:00
Joel Martin cdb55d26e5 canvas.js: workaround WebKit bug, issue #28.
This is WebKit bug https://bugs.webkit.org/show_bug.cgi?id=46319

The workaround is to wrap Canvas render functions with a function that
sets a flush timer. The flush function sets the right margin and then
1ms later sets it back. This triggers the canvas to redraw with the
correct contents.

Two downsides:
- rendering is slower, but only on the busted versions of webkit.
  Correct and useful is better than fast and useless.
- There is a barely perceptible jitter of the control buttons because
  the canvas size is changing by one pixel.

To support this functionality, we also have to read out the exact
webkit version from the user agent in the render engine detection code
in include/util.js.
2010-11-06 12:23:23 -05:00
Joel Martin 455e4657f6 default_controls.js: canvas fail fix. Misc cleanup.
- Make sure that canvas exists (i.e. didn't throw an error) before
  trying to call canvas method get_canvas_uri.

- Typos in HTML render engine debug output.
2010-11-06 12:15:08 -05:00
Joel Martin 1f758e87d3 Issue #34: fix RFB 3.3/3.7 with no auth scheme.
- Split out ClientInitialisation state.

- In version 3.3 and 3.7, when the server has no auth (scheme
  1), then we should skip from Authentication to ClientInitialisation.
2010-10-28 16:30:41 -05:00
Joel Martin f1a9971c82 Expose VNC shared mode setting in UIs.
If shared mode is false, then the server should disconnect other
connections before the current connection is allowed to proceed.
2010-10-24 18:34:50 -05:00
Joel Martin 65bca0c904 Fix style caching. Canvas cleanup from Diet-noVNC.
- Style caching gives a small performance speedup in firefox, but not
  much. Might not be worth complexity, but leave it in for now.
2010-10-18 14:30:50 -05:00
Joel Martin 028b26f14b Fix reason_len not defined bug. 2010-10-14 11:07:54 -05:00
Joel Martin ce2b6909cd rfb.js: fail() wrapper for common failed pattern. 2010-10-14 10:09:33 -05:00
Joel Martin 60440cee15 rfb.js: rQwait, cuttext simplification.
- rQwait checks the receive queue to see if there is enough data to
  satisfy the following request. If not it returns true (which is
  almost always translated into an immediate return false by the
  caller).

- rQwait is called quite a bit and this generally allows 4 lines to
  become 1 line where it is called.

- rQwait allows simplification of cuttext processing. No global
  tracking needed anymore.

Overall, about 60 lines less code.
2010-10-01 11:50:22 -05:00
Joel Martin a99959719d include/des.js: trim some fat.
DES is just used once during authentication and is not performance
sensitive so we save some space by generating and/or removing some
lookup tables. Also, shorten some very frequently used variables.

Shaves off about 100 lines.
2010-09-30 11:17:52 -05:00
Joel Martin a59f1cd269 webutil.js, util.js: split cleanup. 2010-09-29 15:05:27 -05:00
Joel Martin 5a00c9d18a Merge branch 'master' of git@github.com:kanaka/noVNC 2010-09-29 15:01:01 -05:00
Antoine Mercadal 8d5d2c8230 Split util into two file:
- util.js that contains essential functions
 - webutils.js that contains the GUI utility function.js

this helps to include noVNC in other project, especially Cappuccino Application
i
2010-09-30 03:59:56 +08:00
Joel Martin 12d2e7c192 des.js: remove decrypt and simplify.
The decrypt functionality is never used so remove it. Also, we can
assume that we are always DES encrypting 16 characters which allows
several things to be simplified in DES.

Overall this removes about 80 lines of code.
2010-09-29 14:48:19 -05:00
Joel Martin a679a97d1b Show rect/enc counts, add vnc_perf.html test.
- include/rfb.js: Keep track of the number of rects of each encoding
  type and print them out when we close a connection (if 'info'
  logging level).

- tests/vnc_perf.html: first pass at a noVNC based performance
  benchmark.

- utils/wsproxy.py: Fix the output of the record filename.
2010-09-25 15:50:43 -05:00
Joel Martin 3b20e7a90f rfb.js, canvas.js: status feedback on Canvas functionality.
Read the render mode selected by canvas and report it in the initial
page loaded status message.
2010-09-24 10:47:39 -05:00
Joel Martin ff36b1270b Refactor settings object, add connectTimeout setting.
- include/util.js: Add type and desc field to conf_default routine.
  Make comment descriptions of settings into desc parameters that can
  be queried. Also, use set_FOO in conf_default to set or coerce the
  current setting so that we always have the right type for the value.

- include/rfb.js, include/default_config.js: add connectTimeout
  setting to address situations with slow connections that may need
  more than 2 seconds.
2010-09-23 09:39:24 -05:00
Joel Martin aa78706983 rfb.js: wait for SecurityResult failure reason bytes.
Yet another weird VNC server behavior: sending a failure and length
before the reason message. To calculated the length, the reason string
is already available, why not just send everything as one packet. Oh
well.
2010-09-23 09:17:09 -05:00
Joel Martin 005d9ee999 Misc cleanup: debug logging, record filename, etc.
- include/canvas.js: When 'debug' logging, show browser detection
  values.
- test/canvas.html: Only restore the canvas to it's starting state if
  the logging level is not 'debug'.
- wsproxy.py: Append the session number to the record filename so that
  multiple sessions don't stomp on each other.
2010-09-23 08:17:00 -05:00
Joel Martin 8787e49b92 util.js: detect firefox 4.X correctly.
Update the browser detection code (from mootools) with a fix that
detects firefox 4.0 correctly.
2010-09-23 08:08:08 -05:00
Joel Martin c1eba48f79 logging: add Util.get_logging(), canvas clearing.
Only clear canvas if log level is not debug instead of using
'#__debug__' in the URL.
2010-09-22 17:11:57 -05:00
Joel Martin 57c7903f60 playback.js: move to include/ for easier reference.
Easier to reference from web site (gh-pages branch).
2010-09-22 16:55:06 -05:00
Joel Martin 31a837d55e No local cursor by default due to issues #27, #29.
In Safari, local cursor rendering is corrupt. In firefox 3.6.10, local
cursor rendering causes a segfault. Probable that the .cur format is
not 100% compliant (even though it works in Chrome and firefox 3.5 and
firefox 4.0). So just disable it by default until I can figure out how
to address the problems.
2010-09-20 16:15:40 -05:00
Joel Martin 0a1184bde8 API change: add sendKey() to manually send key code.
RFB.sendKey(code, down)

If down is not specified then both a down followed by an up code will
be sent.
2010-09-15 18:14:27 -05:00
Joel Martin e3efeb32a7 rfb.js: state refactor, add 'disconnect' state.
Add a new state 'disconnect' to reflect that we are not truly
'disconnected' until we get an onclose event. Add a disconnect timer
to match.

Handle disconnected cleanup better in updateState(). Anytime we enter
in a disconnect/disconnected state, make sure all running state is
cleaned up (WebSocket, timers, canvas).
2010-09-11 15:31:50 -05:00
Joel Martin ac7bdbc22f web-socket-js (issue #37): close() when connecting
Filed this issue for this bug:
http://github.com/gimite/web-socket-js/issues/issue/37

Right now the close() call only calls __flash.close() if readyState is OPEN.
But it should really call close any time that readyState is not CLOSED or
CLOSING.

The case I ran into is when I want to do the following:
1. make a test connection
2. tell the server to setup for a connection
3. connect again

I call close on the test connection, but since it is ignored when CONNECTING,
it eventually times out with a error. But by that time I have already issued a
new connection, it causes the new connection to fail. close() should cancel
CONNECTING state too.
2010-09-11 13:52:49 -05:00
Joel Martin 071f2818a8 gimite/web-socket-js issue #35: async onclose.
Filed this bug about this issue:
http://github.com/gimite/web-socket-js/issues#issue/35

To work around the flash "recursive call" problem, WebSocket.as has
the onclose event disabled in the close() call and the javascript half
of the close() call does the onclose() call instead. This is fine, but
it needs to be asynchronous to act more like what happens with
a normal WebSockets object. The current behavior is that the onclose()
method is called inline (synchronously) when the close() is called and
this inconsistency make state handling more difficult.
2010-09-11 12:44:39 -05:00
Joel Martin 5f409eeeeb License header cleanup. 2010-09-08 15:06:34 -05:00
Joel Martin 2a6018df9f web-socket-js: 9e7663771 build and remove source.
web-socket-js now has all the functionality and fixes needed for noVNC
so remove the include/as3crypto_patched directory and the
include/web-socket-js/flash-src directory (i.e. the sources for
web-socket-js). This cleans up almost 3K from the include/ directory.

Update to web-socket-js build based on upstream (gimite/web-socket-js)
9e766377188.
2010-09-08 14:57:32 -05:00
Joel Martin b5087acc24 default_controls.js: Fix cursor setting init.
The rfb variable wasn't available at the point settingsDisabled() was
being called since it was called inline with RFB() initialization. To
solve this we pass the updateState rfb variable so that the canvas can
be queried for setting the cursor_uri value.
2010-09-08 13:46:41 -05:00
Joel Martin d595e65685 JSLint. 2010-09-08 10:11:11 -05:00
Joel Martin 3afc7a2b89 Issue #15 - rfb.js: wait for security type list.
Apparently the virtualbox VNC server send the size and then the
security type list in separate frames so we need to wait for the full
list.
2010-08-31 22:22:22 -05:00
Joel Martin 3cc74720f0 canvas.js: Fix ignore for scrolled window.
When the documement/window is scrolled, the onMouseDisable routine was
not properly calculating the position to test whether to ignore the
event or not.
2010-08-31 13:36:14 -05:00
Joel Martin d67de76770 Rename tightpng img queue variable to imgQ. 2010-08-31 12:08:47 -05:00
Joel Martin 3e7a7cefc6 More timing "history" purge. 2010-08-30 15:59:53 -05:00
Joel Martin 9c57ac3985 rfb.js: JSLint'ing
Change RQ and SQ vars to rQ and sQ since caps at the start implies
a classable entity.
2010-08-30 15:57:58 -05:00
Joel Martin 0d1e1b7281 Merge init() into the constructor.
This is logical now since the external update callback can be provided
when the object is created so we don't need a separate init function.
2010-08-30 15:16:07 -05:00
Joel Martin 55dee43279 Remove psuedo-UTF8 encoding.
It's less efficient on average that base64 (150% vs 133%). It's
non-standard (0 shifted to 256 before encoding). And I rarely use it.
2010-08-27 12:10:09 -05:00
Joel Martin e8c1698995 rfb.js: remove timing history.
Turned out not to be useful (pretty much never looked at the info once
I added it). The playback test is much more useful for measuring
performance.
2010-08-27 11:29:22 -05:00
Joel Martin eabf4670fb rfb.js/tight_png: fix indexed receive queue handling.
getCLength was not using the index (RQi) into the receive queue.
2010-08-27 11:21:30 -05:00
Joel Martin 67b4e9879a Indexed receive queue. Up to 2X speedup in Chrome.
Generally, most servers send hextile updates as single updates
containing many rects. Some servers send hextile updates as many small
framebuffer updates with a few rects each (such as QEMU). This latter
cases revealed that shifting off the beginning of the receive queue
(which happens after each hextile FBU) performs poorly.

This change switches to using an indexed receive queue (instead of
actually shifting off the array). When the receive queue has grown to
a certain size, then it is compacted all at once.

The code is not as clean, but this change results in more than 2X
speedup under Chrome for the pessimal case and 10-20% in firefox.
2010-08-26 10:22:29 -05:00
Joel Martin 1a5dd77d37 Treat RFB 3.6 as 3.3.
Apparently there are versions of UltraVNC that report version 3.6.
This is not a legal version according to the spec, but we'll just
force version 3.3 if we receive it. Thanks to Larry Rowe for the info.
2010-08-11 11:21:15 -05:00
Joel Martin 4ed717ad31 Scroll render test and perf speedup.
Turns out when Windows is running in QEMU and a window scroll happens,
there are lots of little hextile rects sent. This is slow in noVNC.

- Some recording/playback improvement.
- Add test harness to drive playback of recordings.
- By pulling off the rect header in one chunk we get a 3X speedup in
  Chrome and a 20% speedup in firefox (specifically for the scroll
  test).
- Also, get rid of some noise from creating timers for handle_message.
  Check to make sure there isn't already a pending timer first.
2010-08-06 16:43:24 -05:00
primalmotion b7155950d3 * take care of kanaka's suggestions
(cherry picked from commit 11f3271a52505dccbf38bea422e7c9a79dddd478)

Signed-off-by: Joel Martin <github@martintribe.org>
2010-08-04 15:29:42 -05:00
primalmotion 6425f611d8 * Adding a way to set the DOM document to use.
This is very usefull when you need to open a new window (with a new document) from javascript,
without having to reload the script.js.
(cherry picked from commit 8ded53c1de06d01e50d58543c19e73926f0fbbd4)

Signed-off-by: Joel Martin <github@martintribe.org>
2010-08-04 15:18:17 -05:00
Joel Martin b925c96781 JSLint: use ===. 2010-08-04 15:14:40 -05:00
Joel Martin 208c832b28 Encrypt default to off, TODO updates. 2010-08-03 13:20:44 -05:00
Joel Martin 8db09746b7 New API. Refactor Canvas and RFB objects.
New API:

To use the RFB object, you now must instantiate it (this allows more
than one instance of it on the same page).

    rfb = new RFB(settings);

The 'settings' variable is a namespace that contains initial default
settings. These can also be set and read using 'rfb.set_FOO()' and
'rfb.get_FOO()' where FOO is the setting name. The current settings
are (and defaults) are:
    - target: the DOM Canvas element to use ('VNC_canvas').
    - encrypt: whether to encrypt the connection (false)
    - true_color: true_color or palette (true)
    - b64encode: base64 encode the WebSockets data (true)
    - local_cursor: use local cursor rendering (true if supported)
    - connectTimeout: milliseconds to wait for connect (2000)
    - updateState: callback when RFB state changes (none)
    - clipboardReceive: callback when clipboard data received (none)

The parameters to the updateState callback have also changed. The
function spec is now updateState(rfb, state, oldstate, msg):
    - rfb: the RFB object that this state change is for.
    - state: the new state
    - oldstate: the previous state
    - msg: a message associate with the state (not always set).

The clipboardReceive spec is clipboardReceive(rfb, text):
    - rfb: the RFB object that this text is from.
    - text: the clipboard text received.

Changes:

- The RFB and Canvas namespaces are now more proper objects. Private
  implementation is no longer exposed and the public API has been made
  explicit. Also, instantiation allows more than one VNC connection
  on the same page (to complete this, DefaultControls will also need
  this same refactoring).

- Added 'none' logging level.

- Removed automatic stylesheet selection workaround in util.js and
  move it to defaultcontrols so that it doesn't interfere with
  intergration.

- Also, some major JSLinting.

- Fix input, canvas, and cursor tests to work with new model.
2010-08-02 17:07:27 -05:00
Joel Martin 8171f4d818 Catch exceptions in cursor detection.
If cursor Data URI scheme detection threw an exception, it would cause
canvas initialization to fail. cursor detection exceptions should just
disable local cursor change support, not cause canvas init to fail.
2010-08-02 10:11:47 -05:00
Joel Martin 125d8bbb8f Preliminary scaling code (deactivated).
Uses the CSS "scale()" operation. The main problem is that the DOM
container is not rescaled, only the size of the displayed content
within it so there will need to be some sort of mechanism to handle
this better so other elements reflow to the new size. Or it might just
not work and be removed later. The zoom property seems to do the right
behavior, but it's not widely supported. Worth exploring though.
2010-07-30 09:53:33 -05:00
Joel Martin 29ad96c526 Give other events chance to fire.
After each complete framebufferUpdate, set a short timer to continue
processing the receive queue. This gives other events a chance to
fire. Especially important when noVNC is integrated into another
website.
2010-07-29 10:47:32 -05:00
Joel Martin 42b2246c1a Issue #15: noVNC falls behind.
noVNC was never processing more than one framebufferUpdate message per
onmessage event. If noVNC receives an incomplete framebufferUpdate and
then receives the rest of the framebufferUpdate plus another complete
framebufferUpdate, then it will fall permanently behind.

If there is more to process after a completed framebufferUpdate, then
execute normal_msg again.

All the render routines must return false if there is not enough data
in the receive queue to process their current update, and true
otherwise.
2010-07-23 11:46:41 -05:00
Joel Martin a8edf9d8a5 Query string cleanup and move it to util.js 2010-07-22 11:33:21 -05:00
Joel Martin a7a8962676 JSLint. RFB obj to rfb.js; vnc.js the 'loader'.
Move the whole RFB object to rfb.js. vnc.js is now just the loader
file. This allows an integrating project to easily replace vnc.js with
an alternate loader mechanism (or just do it directly in the html
file). Thanks for the idea primalmotion (http://github.com/primalmotion).

Also, JSLint the various files.
2010-07-22 10:54:47 -05:00
Joel Martin 19463eac1f Fix logging init on first page load (not in cookie). 2010-07-22 10:46:50 -05:00
Joel Martin f7f69d8eaa Fix error when cursor Data URI scheme not supported. 2010-07-22 10:26:50 -05:00
Joel Martin da6dd8932e API changes. Client cursor and settings menu.
The following API changes may affect integrators:

    - Settings have been moved out of the RFB.connect() call. Each
      setting now has it's own setter function: setEncrypt, setBase64,
      setTrueColor, setCursor.

    - Encrypt and cursor settings now default to on.

    - CSS changes:
        - VNC_status_bar for input buttons switched to a element class.

        - VNC_buttons split into VNC_buttons_right and
          VNC_buttons_left

        - New id styles for VNC_settings_menu and VNC_setting

Note: the encrypt, true_color and cursor, logging setting can all be
  set on load using query string variables (in addition to host, port
  and password).

Client cursor (cursor pseudo-encoding) support has been polished and
activated.

The RFB settings are now presented as radio button list items in
a drop-down "Settings" menu when using the default controls.

Also, in the settings menu is the ability to select between alternate
style-sheets.

Cookie and stylesheet selection support added to util.js.
2010-07-21 20:34:23 -05:00
Joel Martin f55b6b4185 Fail if initial server connection fails. 2010-07-20 14:54:49 -05:00
Joel Martin 2c2b492c0c Add Cursor pseudo-encoding support (disabled for now).
To change the appearance of the cursor, we use the CSS cursor style
and set the url to a data URI scheme. The image data sent via the
cursor pseudo-encoding has to be encoded to a CUR format file before
being used in the data URI.

During Canvas initialization we try and set a simple cursor to see if
the browser has support. Opera is missing support for data URI scheme
in cursor URLs.

Disabled for now until we have a better way of specifying settings
overall (too many settings for control bar now).
2010-07-20 14:34:44 -05:00
Joel Martin f00b1e3776 State machine refactoring.
Add new states 'loaded', 'connect' and 'fatal':
- Loaded state is first page state. Pass WebSockets mode message using
  this state.
- Connect indicates that the user has issued a "connect" but we
  haven't gotten an WebSockets onopen yet.
- Fatal is a condition that indicates inability to continue on: right
  now, lack of WebSockets/Flash or non-working canvas.

Move much of the actual state transition code into updateState.

Handle 'password' state better in default_controls.js; instead of
disconnecting, prompt for password to send.

Add comments to updateState indicating possible states.
2010-07-15 19:38:25 -05:00
Joel Martin 754e0c0bee UTF-8: send 0 as 256 during encoding too.
0 is valid UTF-8, but in order to avoid WebSockets framing, we
encode/decode it as 256.

Also, be tolerant of 0 length messages.
2010-07-14 16:57:02 -05:00
Joel Martin 77c7a454ac TightPng fixups and thanks to Sentry Data Systems.
- Change tightpng encoding number to -260 (aliguori provided it until
  an official number can be allocated).
2010-07-13 17:51:26 -05:00
Joel Martin 447cd4ade3 Remove unneeded mootools and FABridge test.
mootools is no longer needed. The bug that the FABridge test was
testing has been resolved in web-socket-js so it's no longer needed.
2010-07-06 12:14:38 -05:00
Joel Martin 81e5adafef Refactor console logging code.
Util.Debug, Util.Info, Util.Warn, Util.Error routines instead of
direct calls to console.*. Add "logging=XXX" query variable that sets
the logging level (default is "warn").

Logging values:
    debug: code debug logging (many calls in performance path are also
           commented for performance reasons).
    info: informative messages including timing information.
    warn: significant events
    error: something has gone wrong
2010-07-06 11:56:13 -05:00
Joel Martin 351a1da304 Init updated web-socket-js correctly. TODO updates. 2010-07-05 15:54:50 -05:00
Joel Martin ae0ecca2e4 Disable excanvas experiment.
Also, move bugs from TODO to github issues.
2010-07-02 14:25:12 -05:00
Joel Martin 2ca053affc Rebuild web-socket-js swf with gimite updates.
Bug fixes, restore RFC2817 proxy for non wss://, and handle new closing
handshake from WebSockets 76.
2010-07-02 10:50:52 -05:00
Joel Martin 1144eaa37a Add global variable option for swf location.
The problem is, you can't set WebSocket.__swfLocation before you load
web_socket.js (because it creates the WebSocket global), but you also
can't reliably set WebSocket.__swfLocation after because if you are
doing dynamic script file includes then the onload (i.e.
WebSocket.__initialize) may fire before you have a chance to set
Websocket.__swfLocation.
2010-07-02 09:54:55 -05:00
Joel Martin b9633f8bfd Import/merge gimite/web-socket-js up to da7caff96496c7d7bfb3.
Bug fixes, restore RFC2817 proxy for non wss://, and handle new
closing handshake from WebSockets 76.
2010-07-02 09:52:59 -05:00
Joel Martin a94699265e Remove sequence code in client and proxies. 2010-07-01 12:13:17 -05:00
Joel Martin 2b71a4db58 Update web-socket-js binary build and README.md
Brings it up to date with the most recent web-socket-js event handling
fixes.
2010-07-01 12:04:26 -05:00
Joel Martin bc8e3d4db7 Opera fixes and big Opera performance boost.
Add message/state pollling in web-socket-js. Since Opera tends to drop
message events, we can dramatically increase performance by polling
every now for message event data.

Also, add more direct calls to update readyState so that it's not
missed when Opera drops events.
2010-07-01 11:54:44 -05:00
Joel Martin 4a96178307 Better web-socket-js dataQueue reset.
At connect and close time instead of initialization time.
2010-07-01 10:35:03 -05:00
Joel Martin 9479c72083 web-socket-js event fixes.
When using web-socket-js, the onopen event may happen inline so the
caller may not have time to set onopen before the event fires. In this
case set a short timeout and try again. In particular this affects
Opera most of the time.

Also, to get around Opera event droppings, always read the readyState
directly instead of relying on the local readyState variable to be
correct (which it isn't if stateChange event were dropped).
2010-07-01 10:32:14 -05:00
Joel Martin 6713418413 Always prefer JS ops if we have imageData.
All browsers with Canvas imageData are faster with JS ops instead of
canvas ops. This gives significant performance improvement in Opera.
Except for missing web-socet-js message notifications, Opera 10.60 is
now faster than firefox 3.5.
2010-07-01 10:30:07 -05:00
Joel Martin a93c955538 Opera works! Fix message event drops/reorders.
Instead of relying on FABridge AS -> JS event delivery, we just use
the events to notify JS of pending data. The message handler then
calls the AS readSocketData routine which sends back an array of
the pending WebSocket frames.

There is still a minor bug somewhere that happens after the first
connect where the web-socket-js throws an "INVALID_STATE_ERR: Web
Socket connection has not been established". But, Opera is now usable
and we should be able to drop the packet sequence numbering and
re-ordering code.

Another minor issue to better support Opera is to move JS script
includes to the <head> of the page instead of after the body.
2010-07-01 09:53:38 -05:00
Joel Martin 5235b29ddf Significant firefox perf improvement. Update TODOs.
Interesting. Enough has changed in the Canvas tile operations, that
Canvas.prefer_js=true is better for firefox/gecko too. Approximately
2X improvement in firefox for large hextile renders.
2010-06-29 14:36:18 -05:00
Joel Martin dfa8db8f38 Fix issue #7: security scheme list parsing.
Also, lower connect timeout to 2 seconds.
2010-06-26 17:41:39 -05:00
Joel Martin 48eed1ac05 Refactor canvas imageData test slightly. 2010-06-24 17:09:54 -05:00
Joel Martin 486cd527f2 Support WebSockets 76 (hixie-76, hybi-00).
Looks like disabling web-socket-js debug messages by default that we
get a minor speedup.

Python proxy should support both 75 and 76 (00) modes. Also, update ws
test to more reliably hit the WebSockets ordering/drop issue.
2010-06-24 17:04:57 -05:00
Joel Martin 7dfa20b8fd Remove invalid pos check from web-socket-js. 2010-06-24 17:01:58 -05:00
Joel Martin 094b489b76 Missed change web-socket-js to dd80a1807758abfab4a0fde840f94c5d649e4a24. 2010-06-24 17:00:41 -05:00
Joel Martin 2ddd6214a5 Add web-socket-js debug flag and default to off. 2010-06-24 16:59:53 -05:00
Joel Martin 76053e2bae Squelch MD5.as build warnings. 2010-06-24 16:58:24 -05:00
Joel Martin 35f5b11ce5 Update gimite/web-socket-js to dd80a1807758abfab4a0fde840f94c5d649e4a24 2010-06-24 12:42:34 -05:00
Joel Martin d93d3e09ab Various cross-browser fixes.
Now working under Arora 0.5.

But not Konqueror 4.2.2 (WebSockets never connects).

IE support with excanvas still pending.
2010-06-23 16:08:36 -05:00
Joel Martin 11bb7a4ae4 Fix browser detection code in IE. 2010-06-21 16:30:32 -05:00
Joel Martin 3915e5365e Update README.md with browser support. 2010-06-21 13:20:57 -05:00
Joel Martin 3b7575b219 Better support console debug under Opera (DragonFly). 2010-06-20 15:10:34 -05:00
Joel Martin 2a4e7d8a93 Timeout connection. 2010-06-18 15:18:41 -05:00
Joel Martin f755ca9631 Remove debug sendCtrlC function. 2010-06-16 09:48:49 -05:00
Joel Martin 160fabf65c Disabled ctrlAltDel button when N/A. 2010-06-15 17:56:38 -05:00
Joel Martin 63708ff5a8 Add CtrlAltDel send button to status bar.
Some default_controls.js jslinting.

Needs to be some modularity between controls you probably always want
(like sending CtrlAltDel) and how the interface is presented and
controlled.
2010-06-15 17:47:01 -05:00
Joel Martin 15046f0042 No mootools dep outside of default_controls.js.
Some basic functions from mootools implemented in util.js.

Also, some more DOM separation. Move clipboard focus logic into
default_controls and canvas and out of vnc.js.

JSLint cleanup.
2010-06-15 15:21:41 -05:00
Joel Martin 61dd52c983 Add mouse position routines to util.js.
On path towards removing dependency on mootools in non-UI code.
2010-06-15 11:10:18 -05:00
Joel Martin e2e7c22494 Move DOM event handling from vnc.js to canvas.js. 2010-06-15 09:36:23 -05:00
Joel Martin 96a6eaadbc Move vnc.js into include directory.
Also, allow 'include/' to be overridden in VNC_uri_prefix.
2010-06-14 14:56:19 -05:00
Joel Martin 30e5396326 Less debug output. 2010-06-14 14:42:34 -05:00
Joel Martin 3954ae149a Fix mouse focus issues. 2010-06-13 10:57:23 -05:00
Joel Martin 888d5813ed Fix scrolled mouse position. 2010-06-10 16:05:15 -05:00
Joel Martin 4b4496ad67 DesktopResize and compression level pseudo-encodings.
- Implement resizing of desktop pseudo-encoding.

- Also send lowest (fastest) compression level pseudo-encoding.
  Ought be user tweakable.
2010-06-10 15:44:42 -05:00
Joel Martin 2e041cf225 Fix Alt keysym.
From kevinychan/vnc-html5 ebfffdc36.
2010-06-03 09:28:44 -05:00
Joel Martin 913083993b Direct example. Move all DOM code default_controls.js.
Move DOM manipulation into include/default_controls.js and update
vnc.html to use it.

Add an example vnc_auto.html which automatically connects using
parameters from the query string and doesn't use default_controls.js.

Reorder functions in vnc.js to put external interface functions at the
top of the RFB namespace.
2010-06-02 17:08:25 -05:00
Joel Martin d41c33e4b7 Add colour map support (non-true-color).
In colourMap mode there are 256 colours in a colour palette sent from
the server via the SetColourMapEntries message. This reduces the
bandwidth by about 1/4. However, appearance can be somewhat less than
ideal (pinks instead of gray, etc).

It also increases client side rendering performance especially on
firefox. Rendering a full 800x600 update takes about 950ms in
firefox on my system compared to about 1400ms. Round-trip time for
a full frame buffer update is even better on firefox (due to
performance of the flash WebSocket emulator). Reduced from about
1800ms to 1100ms on firefox (for 800x600 full update).
2010-06-01 14:34:27 -05:00
Joel Martin 507b473a2e Test non-base64 (straight UTF-8) encoding.
Also add a wsencoding test client/server program to test send a set of
values between client and server and vice-versa to test encodings.

Not turned on by default.

Add support for encode/decode of UTF-8 in the proxy. This leverages
the browser for decoding the WebSocket stream directly instead of
doing base64 decode in the browser itself.

Unfortunately, in Chrome this has negligible impact (round-trip time
is increased slightly likely due to extra python processing).

In firefox, due to the use of the flash WebSocket emulator the
performance is even worse. This is because it's really annoying to get
the flash WebSocket emulator to properly decode a UTF-8 bytestream.
The problem is that the readUTFBytes and readMultiByte methods of an
ActionScript ByteArray don't treat 0x00 correctly. They return
a string that ends at the first 0x00, but the index into the ByteArray
has been advanced by however much you requested.

This is very silly for two reasons: ActionScript (and Javascript)
strings can contain 0x00 (they are not null terminated) and second,
UTF-8 can legitimately contain 0x00 values. Since UTF-8 is not
constant width there isn't a great way to determine if those methods
in fact did encounter a 0x00 or they just read the number of bytes
requested.

Doing manual decoding using readUTFByte one character at a time slows
things down quite a bit. And to top it all off, those methods don't
support the alternate UTF-8 encoding for 0x00 ("\xc0\x80"). They also
just treat that encoding as the end of string too.

So to get around this, for now I'm encoding zero as 256 ("\xc4\x80")
and then doing mod 256 in Javascript. Still doesn't result in much
benefit in firefox.

But, it's an interesting approach that could use some more exploration
so I'm leaving in the code in both places.
2010-05-28 15:39:38 -05:00
Joel Martin d38406e6b5 Fix web-socket-js: encode sent data across FABridge. 2010-05-28 15:34:54 -05:00
Joel Martin af6b17ce06 Change license to LGPL-3 and add some implementation notes.
The purpose of the code is to be incorporated into other web projects
(whether those are free or not). AGPL prevents combination with other
HTML and javascript that is under a weaker (or proprietary) license.
Better would be a lesser AGPL, but there is not GNU standard for that.
So LGPL-3 meets most of my requirements. If somebody modifies the
actual client code and conveys it, then they must release the changes
under LGPL-3 also.

Add some implementation notes in docs/notes.
2010-05-26 15:43:00 -05:00
Joel Martin a575a383fb Add mouse wheel support and input test page. 2010-05-25 11:05:55 -05:00
Joel Martin 7f4f41b0c7 Don't shift off subencoding in hextile. 2010-05-20 17:13:59 -05:00
Joel Martin 8fe2c2f915 Fix web-socket-js loading issue. 2010-05-17 17:11:13 -05:00
Joel Martin 97763d0eb8 Double Chrome hextile perf again. Add canvas test.
- By dereferencing the 'data' field of the imageData object before the
  loop, the hextile performance on Chrome is down to 140ms or so for
  a full 800x600 update. Still have to fall back to Canvas operations
  for firefox.

- Fix RQ empty after reorder bug.
2010-05-17 13:07:53 -05:00
Joel Martin 3c1bead9a0 Add styling classes for status line state. 2010-05-16 19:58:51 -05:00
Joel Martin af180155a8 Create FABridge tester. Move wstest into tests subdir. 2010-05-16 19:21:21 -05:00
Joel Martin f9583f1f98 Move canvas.js to include/canvas.js. 2010-05-15 15:45:09 -05:00
Joel Martin 56ec48bec8 Move vars into RFB namespace. Extend array in util.js. 2010-05-15 14:55:33 -05:00
Joel Martin 3a5ddcf737 Pull and modify stylesheet from kevinykchan/vnc-html5.
Pull and modify vnc.css version
b747e284c0e417df1599b1d95724518b07be8df6 to include/black.css
2010-05-11 16:58:36 -05:00
Joel Martin db504ade0c Isolate DOM references in load() and connect().
- Other misc cleanups.
2010-05-11 16:39:17 -05:00
Joel Martin ded9dfae10 Styling/integration refactoring.
- Instead of onload override, move to RFB.load function that takes
  a parameter for the target DOM ID. This allows the user to have
  their own onload function.

- Add "VNC_" prefix to all element ID names. Only create DOM elements
  if they don't already exist on the page, otherwise use the existing
  elements.

- Move all styling to separate stylesheet.

- Use list model for control styling.
2010-05-11 16:13:52 -05:00
Joel Martin c539e4dcda DES that works with KVM's VNC. RFB 3.8 fixes. 2010-05-05 15:40:05 -05:00
Joel Martin ef764d3b9b Support for RFB 3.8 handshake. 2010-05-02 14:19:13 -05:00
Joel Martin adfe6ac166 Support for SSL/TLS ('wss://') on both sides.
On the client side, this adds the as3crypto library to web-socket-js
so that the WebSocket 'wss://' scheme is supported which is WebSocket
over SSL/TLS.

Couple of downsides to the fall-back method:

    - This balloons the size of the web-socket-js object from about 12K to 172K.

    - Getting it working required disabling RFC2718 web proxy support
      in web-socket-js.

    - It makes the web-socket-js fallback even slower with the
      encryption overhead.

The server side (wsproxy.py) uses python SSL support. The proxy
automatically detects the type of incoming connection whether flash
policy request, SSL/TLS handshake ('wss://') or plain socket
('ws://').

Also added a check-box to the web page to enable/disabled 'wss://'
encryption.
2010-04-30 16:41:09 -05:00
Joel Martin 0e486e1ba0 Import as3crypto_patch: ffda6e9cd8b1d74f45472c676afda8360ae1e5aa
as3crypto is actionscript 3 crypto library with TLS engine support.

From: http://github.com/lyokato/as3crypto_patched

Which was forked from: http://code.google.com/p/as3crypto/
2010-04-30 14:13:32 -05:00
Joel Martin 8759ea6f90 Status/error refactor. Fix firefox bugs.
- All state/status updates go through updateState routine which
  updates the status line also.

- Old firefox (and opera) don't support canvas createImageData, so use
  getImageData as replacement.

- Add console.warn and console.error stubs so that firefox without
  firebug doesn't crap out.

- If no WebSockets then error if no flash or if URL is location (flash
  will refuse to load the object for security reasons).
2010-04-18 18:43:03 -05:00
Joel Martin 07f6ca751d Remove mootools-more references. 2010-04-18 16:28:54 -05:00
Joel Martin 5d8e7ec068 Add web-socket-js support with packet re-ordering.
- web-socket-js is from http://github.com/gimite/web-socket-js. It is
  a flash object that emultates WebSockets.

Unfortunately, events (or packets) from the web-socket-js object can
get re-ordered so we need to know the packet order.

- So wsproxy.py prepends the sequence number of the packet when
  sending.

- If the client receives packets out of order it queues them up and
  scans the queue for the sequence number it's looking for until
  things are back on track. Gross, but hey: It works!

- Also, add packet sequence checking to wstest.*
2010-04-17 17:24:14 -05:00
Joel Martin d920595453 Import web-socket-js: a0fb3933ce5c824bcb882f5a1cf87e46de773ea8
web-socket-js is a flash based WebSockets emulator.

From: http://github.com/gimite/web-socket-js
2010-04-17 17:23:31 -05:00
Joel Martin 14b665f1da Remove uneeded mootools functions and used compressed version. 2010-04-15 12:28:53 -05:00
Joel Martin 7345dba44c Clarify DES code origination. 2010-04-15 11:14:42 -05:00
Joel Martin b5537b60b0 Switch to MPL/GPL base64 from Mozilla.
- Also slightly better performance.
2010-04-15 11:01:40 -05:00
Joel Martin b7ec54870a Switch to much faster console.log and separate utils into util.js. 2010-04-13 09:28:53 -05:00
Joel Martin cc0410a39b Cleanup of files and vnc.js namespace.
- Trim unused code in base64.js
2010-04-06 16:44:45 -05:00
Joel Martin 8580b98979 Got DES encryption of password working and colors corrected.
- DES encryption for VNC bit mirrors every bytes of the password. This
  commit has a hard-coded mirrored password. Need to ask user and bit
  mirror it.

- With image data across the wire it's Blue,Green,Red, so twiddle
  things around a bit.
2010-04-06 10:35:25 -05:00
Joel Martin a793fa460f Base64 Javascript encode/decode library.
From http://www.webtoolkit.info/
2010-04-02 19:17:01 -05:00
Joel Martin 8b945f2a94 Add RFB specs and move *.js files into include/ 2010-03-31 19:43:09 -05:00