]> git.proxmox.com Git - mirror_novnc.git/commitdiff
Merge branch 'api' of https://github.com/CendioOssman/noVNC
authorPierre Ossman <ossman@cendio.se>
Fri, 10 Nov 2017 13:19:05 +0000 (14:19 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 10 Nov 2017 13:19:05 +0000 (14:19 +0100)
1  2 
app/ui.js
core/rfb.js
docs/API.md
vnc_lite.html

diff --cc app/ui.js
Simple merge
diff --cc core/rfb.js
index a16093b6aaadbc080a12eec3117c5ef8675b4a22,a3546b0029c1fd80d656b9451f4d4b5632b158c7..3d12ae4ba94825159a993fb2b18caaa705d7a7d8
@@@ -114,42 -138,6 +138,11 @@@ export default function RFB(target, url
      this._viewportDragPos = {};
      this._viewportHasMoved = false;
  
-     // QEMU Extended Key Event support - default to false
-     this._qemuExtKeyEventSupported = false;
-     // set the default value on user-facing properties
-     set_defaults(this, defaults, {
-         'target': 'null',                       // VNC display rendering Canvas object
-         'encrypt': false,                       // Use TLS/SSL/wss encryption
-         'local_cursor': false,                  // Request locally rendered cursor
-         'shared': true,                         // Request shared mode
-         'view_only': false,                     // Disable client mouse/keyboard
-         'focus_on_click': true,                 // Grab focus on canvas on mouse click
-         'xvp_password_sep': '@',                // Separator for XVP password fields
-         'disconnectTimeout': 3,                 // Time (s) to wait for disconnection
-         'wsProtocols': ['binary'],              // Protocols to use in the WebSocket connection
-         'repeaterID': '',                       // [UltraVNC] RepeaterID to connect to
-         'viewportDrag': false,                  // Move the viewport on mouse drags
-         // Callback functions
-         'onUpdateState': function () { },       // onUpdateState(rfb, state, oldstate): connection state change
-         'onNotification': function () { },      // onNotification(rfb, msg, level, options): notification for UI
-         'onDisconnected': function () { },      // onDisconnected(rfb, reason): disconnection finished
-         'onPasswordRequired': function () { },  // onPasswordRequired(rfb, msg): VNC password is required
-         'onClipboard': function () { },         // onClipboard(rfb, text): RFB clipboard contents received
-         'onBell': function () { },              // onBell(rfb): RFB Bell message received
-         'onFBUReceive': function () { },        // onFBUReceive(rfb, rect): RFB FBU rect received but not yet processed
-         'onFBUComplete': function () { },       // onFBUComplete(rfb): RFB FBU received and processed
-         'onFBResize': function () { },          // onFBResize(rfb, width, height): frame buffer resized
-         'onDesktopName': function () { },       // onDesktopName(rfb, name): desktop name received
-         'onXvpInit': function () { }            // onXvpInit(version): XVP extensions active for this connection
-     });
 +    // Bound event handlers
 +    this._eventHandlers = {
 +        focusCanvas: this._focusCanvas.bind(this),
 +    };
 +
      // main setup
      Log.Debug(">> RFB.constructor");
  
  };
  
  RFB.prototype = {
-     // Public methods
-     connect: function (host, port, password, path) {
-         this._rfb_host = host;
-         this._rfb_port = port;
-         this._rfb_password = (password !== undefined) ? password : "";
-         this._rfb_path = (path !== undefined) ? path : "";
+     // ===== PROPERTIES =====
  
-         if (!this._rfb_host) {
-             return this._fail(
-                 _("Must set host"));
-         }
+     dragViewport: false,
++    focusOnClick: true,
  
-         this._rfb_init_state = '';
-         this._updateConnectionState('connecting');
-         return true;
+     _viewOnly: false,
+     get viewOnly() { return this._viewOnly; },
+     set viewOnly(viewOnly) {
+         this._viewOnly = viewOnly;
+         if (this._rfb_connection_state === "connecting" ||
+             this._rfb_connection_state === "connected") {
+             if (viewOnly) {
+                 this._keyboard.ungrab();
+                 this._mouse.ungrab();
+             } else {
+                 this._keyboard.grab();
+                 this._mouse.grab();
+             }
+         }
      },
  
+     get capabilities() { return this._capabilities; },
+     get touchButton() { return this._mouse.touchButton; },
+     set touchButton(button) { this._mouse.touchButton = button; },
+     get viewportScale() { return this._display.scale; },
+     set viewportScale(scale) { this._display.scale = scale; },
+     get clipViewport() { return this._display.clipViewport; },
+     set clipViewport(viewport) { this._display.clipViewport = viewport; },
+     get isClipped() { return this._display.isClipped; },
+     // ===== PUBLIC METHODS =====
      disconnect: function () {
          this._updateConnectionState('disconnecting');
          this._sock.off('error');
diff --cc docs/API.md
index 2a9e93e9236ba6b8a91e37cfee9bc26720171b2d,983d73571b0483ac23a844207e3d03a7c83c699e..8f565e93cf4138b6bd285eea764bf66f1dffb6b6
- # 1. Modules / API
+ # noVNC API
  
- The noVNC client is a composed of several modular components that handle
- rendering, input, networking, etc. Each of the modules is designed to
- be cross-browser and be useful as a standalone library in other
- projects (see LICENSE.txt).
+ The interface of the noVNC client consists of a single RFB object that
+ is instantiated once per connection.
  
+ ## RFB
  
- ## 1.1 Module List
+ The `RFB` object represents a single connection to a VNC server. It
+ communicates using a WebSocket that must provide a standard RFB
+ protocol stream.
  
- * __Mouse__ (core/input/mouse.js): Mouse input event handler with
- limited touch support.
+ ### Constructor
  
- * __Keyboard__ (core/input/keyboard.js): Keyboard input event handler with
- non-US keyboard support. Translates keyDown and keyUp events to X11
- keysym values.
+ [`RFB()`](#rfb-1)
+   - Creates and returns a new `RFB` object.
  
- * __Display__ (core/display.js): Efficient 2D rendering abstraction
- layered on the HTML5 canvas element.
+ ### Properties
  
- * __Websock__ (core/websock.js): Websock client from websockify
- with transparent binary data support.
- [Websock API](https://github.com/novnc/websockify/wiki/websock.js) wiki page.
+ `viewOnly`
+   - Is a `boolean` indicating if any events (e.g. key presses or mouse
+     movement) should be prevented from being sent to the server.
+     Disabled by default.
  
- * __RFB__ (core/rfb.js): Main class that implements the RFB
- protocol and stitches the other classes together.
++`focusOnClick`
++  - Is a `boolean` indicating if keyboard focus should automatically be
++    moved to the canvas when a `mousedown` or `touchstart` event is
++    received.
 +
+ `touchButton`
+   - Is a `long` controlling the button mask that should be simulated
+     when a touch event is recieved. Uses the same values as
+     [`MouseEvent.button`](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button).
+     Is set to `1` by default.
  
- ## 1.2 Configuration Attributes
+ `viewportScale`
+   - Is a `double` indicating how the framebuffer contents should be
+     scaled before being rendered on to the canvas. See also
+     [`RFB.autoscale()`](#rfbautoscale). Is set to `1.0` by default.
  
- The Mouse, Keyboard, Display and RFB classes have a similar API for
- configuration options. Each configuration option has a default value,
- which can be overridden by a a configuration object passed to the
- constructor. Configuration options can then be read and modified after
- initialization with "get_*" and "set_*" methods respectively. For
- example, the following initializes an RFB object with the 'encrypt'
- configuration option enabled, then confirms it was set, then disables
- it.
+ `clipViewport`
+   - Is a `boolean` indicating if the canvas should be clipped to its
+     container. When disabled the container must be able to handle the
+     resulting overflow. Disabled by default.
  
-     var rfb = new RFB({'encrypt': true});
-     if (rfb.get_encrypt()) {
-         alert("Encryption is set");
-     }
-     rfb.set_encrypt(false);
+ `dragViewport`
+   - Is a `boolean` indicating if mouse events should control the
+     relative position of a clipped canvas. Only relevant if
+     `clipViewport` is enabled. Disabled by default.
  
- Some attributes are read-only and cannot be changed. For example, the
- Display 'render_mode' option will throw an exception if an attempt is
- made to set it. The attribute mode is one of the following:
+ `isClipped` *Read only*
+   - Is a `boolean` indicating if the framebuffer is larger than the
+     current canvas, i.e. it is being clipped.
  
-     RO - read only
-     RW - read write
-     WO - write once
+ `capabilities` *Read only*
+   - Is an `Object` indicating which optional extensions are available
+     on the server. Some methods may only be called if the corresponding
+     capability is set. The following capabilities are defined:
  
+     | name     | type      | description
+     | -------- | --------- | -----------
+     | `power`  | `boolean` | Machine power control is available
+     | `resize` | `boolean` | The framebuffer can be resized
  
- ## 1.3 Methods
+ ### Events
  
- In addition to the getter and setter methods to modify configuration
- attributes, each of the modules has other methods that are available
- in the object instance. For example, the Display module has method
- named 'blitImage' which takes an array of pixel data and draws it to
- the 2D canvas.
+ [`updatestate`](#updatestate)
+   - The `updatestate` event is fired when the connection state of the
+     `RFB` object changes.
  
- ## 1.4 Callbacks
+ [`notification`](#notification)
+   - The `notification` event is fired when the `RFB` usage has a
+     message to display to the user.
  
- Each of the modules has certain events that can be hooked with
- callback functions. For the Mouse, Keyboard, Display and RFB classes
- the callback functions are assigned to configuration attributes. The
- WebSock module has a method named 'on' that takes two parameters: the
- callback event name, and the callback function.
+ [`disconnect`](#disconnected)
+   - The `disconnect` event is fired when the `RFB` object disconnects.
  
- ## 2. Modules
+ [`credentialsrequired`](#credentialsrequired)
+   - The `credentialsrequired` event is fired when more credentials must
+     be given to continue.
  
- ## 2.1 Mouse Module
+ [`clipboard`](#clipboard)
+   - The `clipboard` event is fired when clipboard data is received from
+     the server.
  
- ### 2.1.1 Configuration Attributes
+ [`bell`](#bell)
+   - The `bell` event is fired when a audible bell request is received
+     from the server.
  
- | name        | type | mode | default  | description
- | ----------- | ---- | ---- | -------- | ------------
- | target      | DOM  | WO   | document | DOM element that captures mouse input
- | touchButton | int  | RW   | 1        | Button mask (1, 2, 4) for which click to send on touch devices. 0 means ignore clicks.
+ [`fbresize`](#fbresize)
+   - The `fbresize` event is fired when the framebuffer size is changed.
  
- ### 2.1.2 Methods
+ [`desktopname`](#desktopname)
+   - The `desktopname` event is fired when the remote desktop name
+     changes.
  
- | name   | parameters | description
- | ------ | ---------- | ------------
- | grab   | ()         | Begin capturing mouse events
- | ungrab | ()         | Stop capturing mouse events
+ [`capabilities`](#capabilities)
+   - The `capabilities` event is fired when `RFB.capabilities` is
+     updated.
  
- ### 2.1.2 Callbacks
+ ### Methods
  
- | name          | parameters          | description
- | ------------- | ------------------- | ------------
- | onMouseButton | (x, y, down, bmask) | Handler for mouse button click/release
- | onMouseMove   | (x, y)              | Handler for mouse movement
+ [`RFB.disconnect()`](#rfbdisconnect)
+   - Disconnect from the server.
  
+ [`RFB.sendCredentials()`](#rfbsendcredentials)
+   - Send credentials to server. Should be called after the
+     [`credentialsrequired`](#credentialsrequired) event has fired.
  
- ## 2.2 Keyboard Module
+ [`RFB.sendKey()`](#rfbsendKey)
+   - Send a key event.
  
- ### 2.2.1 Configuration Attributes
- | name    | type | mode | default  | description
- | ------- | ---- | ---- | -------- | ------------
- | target  | DOM  | WO   | document | DOM element that captures keyboard input
- ### 2.2.2 Methods
- | name   | parameters | description
- | ------ | ---------- | ------------
- | grab   | ()         | Begin capturing keyboard events
- | ungrab | ()         | Stop capturing keyboard events
- ### 2.2.3 Callbacks
- | name       | parameters           | description
- | ---------- | -------------------- | ------------
- | onKeyPress | (keysym, code, down) | Handler for key press/release
- ## 2.3 Display Module
- ### 2.3.1 Configuration Attributes
- | name        | type  | mode | default | description
- | ----------- | ----- | ---- | ------- | ------------
- | target      | DOM   | WO   |         | Canvas element for rendering
- | context     | raw   | RO   |         | Canvas 2D context for rendering
- | logo        | raw   | RW   |         | Logo to display when cleared: {"width": width, "height": height, "type": mime-type, "data": data}
- | scale       | float | RW   | 1.0     | Display area scale factor 0.0 - 1.0
- | viewport    | bool  | RW   | false   | Use viewport clipping
- | width       | int   | RO   |         | Display area width
- | height      | int   | RO   |         | Display area height
- | render_mode | str   | RO   | ''      | Canvas rendering mode
- | prefer_js   | str   | RW   |         | Prefer JavaScript over canvas methods
- | cursor_uri  | raw   | RW   |         | Can we render cursor using data URI
- ### 2.3.2 Methods
- | name               | parameters                                              | description
- | ------------------ | ------------------------------------------------------- | ------------
- | viewportChangePos  | (deltaX, deltaY)                                        | Move the viewport relative to the current location
- | viewportChangeSize | (width, height)                                         | Change size of the viewport
- | absX               | (x)                                                     | Return X relative to the remote display
- | absY               | (y)                                                     | Return Y relative to the remote display
- | resize             | (width, height)                                         | Set width and height
- | flip               | (from_queue)                                            | Update the visible canvas with the contents of the rendering canvas
- | clear              | ()                                                      | Clear the display (show logo if set)
- | pending            | ()                                                      | Check if there are waiting items in the render queue
- | flush              | ()                                                      | Resume processing the render queue unless it's empty
- | fillRect           | (x, y, width, height, color, from_queue)                | Draw a filled in rectangle
- | copyImage          | (old_x, old_y, new_x, new_y, width, height, from_queue) | Copy a rectangular area
- | imageRect          | (x, y, mime, arr)                                       | Draw a rectangle with an image
- | startTile          | (x, y, width, height, color)                            | Begin updating a tile
- | subTile            | (tile, x, y, w, h, color)                               | Update a sub-rectangle within the given tile
- | finishTile         | ()                                                      | Draw the current tile to the display
- | blitImage          | (x, y, width, height, arr, offset, from_queue)          | Blit pixels (of R,G,B,A) to the display
- | blitRgbImage       | (x, y, width, height, arr, offset, from_queue)          | Blit RGB encoded image to display
- | blitRgbxImage      | (x, y, width, height, arr, offset, from_queue)          | Blit RGBX encoded image to display
- | drawImage          | (img, x, y)                                             | Draw image and track damage
- | changeCursor       | (pixels, mask, hotx, hoty, w, h)                        | Change cursor appearance
- | defaultCursor      | ()                                                      | Restore default cursor appearance
- | disableLocalCursor | ()                                                      | Disable local (client-side) cursor
- | clippingDisplay    | ()                                                      | Check if the remote display is larger than the client display
- | autoscale          | (containerWidth, containerHeight, downscaleOnly)        | Scale the display
- ### 2.3.3 Callbacks
- | name    | parameters | description
- | ------- | ---------- | ------------
- | onFlush | ()         | A display flush has been requested and we are now ready to resume FBU processing
- ## 2.4 RFB Module
- ### 2.4.1 Configuration Attributes
- | name              | type | mode | default    | description
- | ----------------- | ---- | ---- | ---------- | ------------
- | target            | DOM  | WO   | null       | Canvas element for rendering (passed to Display, Mouse and Keyboard)
- | encrypt           | bool | RW   | false      | Use TLS/SSL encryption
- | local_cursor      | bool | RW   | false      | Request locally rendered cursor
- | shared            | bool | RW   | true       | Request shared VNC mode
- | view_only         | bool | RW   | false      | Disable client mouse/keyboard
- | focus_on_click    | bool | RW   | true       | Grab focus on canvas on mouse click
- | xvp_password_sep  | str  | RW   | '@'        | Separator for XVP password fields
- | disconnectTimeout | int  | RW   | 3          | Time (in seconds) to wait for disconnection
- | wsProtocols       | arr  | RW   | ['binary'] | Protocols to use in the WebSocket connection
- | repeaterID        | str  | RW   | ''         | UltraVNC RepeaterID to connect to
- | viewportDrag      | bool | RW   | false      | Move the viewport on mouse drags
- ### 2.4.2 Methods
- | name               | parameters                   | description
- | ------------------ | ---------------------------- | ------------
- | connect            | (host, port, password, path) | Connect to the given host:port/path. Optional password and path.
- | disconnect         | ()                           | Disconnect
- | sendPassword       | (passwd)                     | Send password after onPasswordRequired callback
- | sendCtrlAltDel     | ()                           | Send Ctrl-Alt-Del key sequence
- | xvpOp              | (ver, op)                    | Send a XVP operation (2=shutdown, 3=reboot, 4=reset)
- | xvpShutdown        | ()                           | Send XVP shutdown.
- | xvpReboot          | ()                           | Send XVP reboot.
- | xvpReset           | ()                           | Send XVP reset.
- | sendKey            | (keysym, code, down)         | Send a key press event. If down not specified, send a down and up event.
- | clipboardPasteFrom | (text)                       | Send a clipboard paste event
- | requestDesktopSize | (width, height)              | Send a request to change the remote desktop size.
- ### 2.4.3 Callbacks
- | name               | parameters                 | description
- | ------------------ | -------------------------- | ------------
- | onUpdateState      | (rfb, state, oldstate)     | Connection state change (see details below)
- | onNotification     | (rfb, msg, level, options) | Notification for the UI (optional options)
- | onDisconnected     | (rfb, reason)              | Disconnection finished with an optional reason. No reason specified means normal disconnect.
- | onPasswordRequired | (rfb, msg)                 | VNC password is required (use sendPassword), optionally comes with a message.
- | onClipboard        | (rfb, text)                | RFB clipboard contents received
- | onBell             | (rfb)                      | RFB Bell message received
- | onFBUReceive       | (rfb, fbu)                 | RFB FBU received but not yet processed (see details below)
- | onFBUComplete      | (rfb, fbu)                 | RFB FBU received and processed (see details below)
- | onFBResize         | (rfb, width, height)       | Frame buffer (remote desktop) size changed
- | onDesktopName      | (rfb, name)                | VNC desktop name recieved
- | onXvpInit          | (version)                  | XVP extensions active for this connection.
- __RFB onUpdateState callback details__
- The RFB module has an 'onUpdateState' callback that is invoked after
- the noVNC connection state changes. Here is a list of the states that
- are reported. Note that the RFB module can not transition from the
- disconnected state in any way, a new instance of the object has to be
- created for new connections.
- | connection state | description
- | ---------------- | ------------
- | connecting       | starting to connect
- | connected        | connected normally
- | disconnecting    | starting to disconnect
- | disconnected     | disconnected - permanent end-state for this RFB object
- __RFB onFBUReceive and on FBUComplete callback details__
- The onFBUReceive callback is invoked when a frame buffer update
- message has been received from the server but before the RFB class has
- done any additional handling. The onFBUComplete callback is invoked
- with the same information but after the RFB class has handled the
- message.
- The 'fbu' parameter is an object with the following structure:
-     {
-         x:            FBU_x_position,
-         y:            FBU_y_position,
-         width:        FBU_width,
-         height:       FBU_height,
-         encoding:     FBU_encoding_number,
-         encodingName: FBU_encoding_string
-     }
+ [`RFB.sendCtrlAltDel()`](#rfbsendctrlaltdel)
+   - Send Ctrl-Alt-Del key sequence.
+ [`RFB.machineShutdown()`](#rfbmachineshutdown)
+   - Request a shutdown of the remote machine.
+ [`RFB.machineReboot()`](#rfbmachinereboot)
+   - Request a reboot of the remote machine.
+ [`RFB.machineReset()`](#rfbmachinereset)
+   - Request a reset of the remote machine.
+ [`RFB.clipboardPasteFrom()`](#rfbclipboardPasteFrom)
+   - Send clipboard contents to server.
+ [`RFB.autoscale()`](#rfbautoscale)
+   - Set `RFB.viewportScale` so that the framebuffer fits a specified
+     container.
+ [`RFB.requestDesktopSize()`](#rfbrequestDesktopSize)
+   - Send a request to change the remote desktop size.
+ [`RFB.viewportChangeSize()`](#rfbviewportChangeSize)
+   - Change size of the viewport.
+ ### Details
+ #### RFB()
+ The `RFB()` constructor returns a new `RFB` object and initiates a new
+ connection to a specified VNC server.
+ ##### Syntax
+     var rfb = new RFB( target, url [, options] );
+ ###### Parameters
+ **`target`**
+   - A [`HTMLCanvasElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement)
+     that specifies where graphics should be rendered and input events
+     should be monitored.
+ **`url`**
+   - A `DOMString` specifying the VNC server to connect to. This must be
+     a valid WebSocket URL.
+ **`options`** *Optional*
+   - An `Object` specifying extra details about how the connection
+     should be made.
+     Possible options:
+     `shared`
+       - A `boolean` indicating if the remote server should be shared or
+         if any other connected clients should be disconnected. Enabled
+         by default.
+     `credentials`
+       - An `Object` specifying the credentials to provide to the server
+         when authenticating. The following credentials are possible:
+         | name         | type        | description
+         | ------------ | ----------- | -----------
+         | `"username"` | `DOMString` | The user that authenticates
+         | `"password"` | `DOMString` | Password for the user
+         | `"target"`   | `DOMString` | Target machine or session
+     `repeaterID`
+       - A `DOMString` specifying the ID to provide to any VNC repeater
+         encountered.
+ #### updatestate
+ The `updatestate` event is fired after the noVNC connection state
+ changes. The `detail` property is an `Object` containg the property
+ `state` with the new connection state.
+ Here is a list of the states that are reported:
+ | connection state  | description
+ | ----------------- | ------------
+ | `"connecting"`    | starting to connect
+ | `"connected"`     | connected normally
+ | `"disconnecting"` | starting to disconnect
+ | `"disconnected"`  | disconnected
+ Note that a `RFB` objects can not transition from the disconnected
+ state in any way, a new instance of the object has to be created for
+ new connections.
+ #### notification
+ The `notification` event is fired when the `RFB` object wants a message
+ displayed to the user. The `detail` property is an `Object` containing
+ the following properties:
+ | Property  | Type        | Description
+ | --------- | ----------- | -----------
+ | `message` | `DOMString` | The message to display
+ | `level`   | `DOMString` | The severity of the message
+ The following levels are currently defined:
+   - `"normal"`
+   - `"warn"`
+   - `"error"`
+ #### disconnect
+ The `disconnect` event is fired when the connection has been
+ terminated. The `detail` property is an `Object` the optionally
+ contains the property `reason`. `reason` is a `DOMString` specifying
+ the reason in the event of an unexpected termination. `reason` will be
+ omitted for a clean termination.
+ #### credentialsrequired
+ The `credentialsrequired` event is fired when the server requests more
+ credentials than were specified to [`RFB()`](#rfb-1). The `detail`
+ property is an `Object` containing the property `types` which is an
+ `Array` of `DOMString` listing the credentials that are required.
+ #### clipboard
+ The `clipboard` event is fired when the server has sent clipboard data.
+ The `detail` property is an `Object` containing the property `text`
+ which is a `DOMString` with the clipboard data.
+ #### bell
+ The `bell` event is fired when the server has requested an audible
+ bell.
+ #### fbresize
+ The `fbresize` event is fired when the framebuffer has changed
+ dimensions. The `detail` property is an `Object` with the properties
+ `width` and `height` specifying the new dimensions.
+ #### desktopname
+ The `desktopname` event is fired when the name of the remote desktop
+ changes. The `detail` property is an `Object` with the property `name`
+ which is a `DOMString` specifying the new name.
+ #### capabilities
+ The `capabilities` event is fired whenever an entry is added or removed
+ from `RFB.capabilities`. The `detail` property is an `Object` with the
+ property `capabilities` containing the new value of `RFB.capabilities`.
+ #### RFB.disconnect()
+ The `RFB.disconnect()` method is used to disconnect from the currently
+ connected server.
+ ##### Syntax
+     RFB.disconnect( );
+ #### RFB.sendCredentials()
+ The `RFB.sendCredentials()` method is used to provide the missing
+ credentials after a `credentialsrequired` event has been fired.
+ ##### Syntax
+     RFB.sendCredentials( credentials );
+ ###### Parameters
+ **`credentials`**
+   - An `Object` specifying the credentials to provide to the server
+     when authenticating. See [`RFB()`](#rfb-1) for details.
+ #### RFB.sendKey()
+ The `RFB.sendKey()` method is used to send a key event to the server.
+ ##### Syntax
+     RFB.sendKey( keysym, code [, down] );
+ ###### Parameters
+ **`keysym`**
+   - A `long` specifying the RFB keysym to send. Can be `0` if a valid
+     **`code`** is specified.
+ **`code`**
+   - A `DOMString` specifying the physical key to send. Valid values are
+     those that can be specified to
+     [`KeyboardEvent.code`](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code).
+     If the physical key cannot be determined then `null` shall be
+     specified.
+ **`down`** *Optional*
+   - A `boolean` specifying if a press or a release event should be
+     sent. If omitted then both a press and release event are sent.
+ #### RFB.sendCtrlAltDel()
+ The `RFB.sendCtrlAltDel()` method is used to send the key sequence
+ *left Control*, *left Alt*, *Delete*. This is a convenience wrapper
+ around [`RFB.sendKey()`](#rfbsendkey).
+ ##### Syntax
+     RFB.sendCtrlAltDel( );
+ #### RFB.machineShutdown()
+ The `RFB.machineShutdown()` method is used to request to shut down the
+ remote machine. The capability `power` must be set for this method to
+ have any effect.
+ ##### Syntax
+     RFB.machineShutdown( );
+ #### RFB.machineReboot()
+ The `RFB.machineReboot()` method is used to request a clean reboot of
+ the remote machine. The capability `power` must be set for this method
+ to have any effect.
+ ##### Syntax
+     RFB.machineReboot( );
+ #### RFB.machineReset()
+ The `RFB.machineReset()` method is used to request a forced reset of
+ the remote machine. The capability `power` must be set for this method
+ to have any effect.
+ ##### Syntax
+     RFB.machineReset( );
+ #### RFB.clipboardPasteFrom()
+ The `RFB.clipboardPasteFrom()` method is used to send clipboard data
+ to the remote server.
+ ##### Syntax
+     RFB.clipboardPasteFrom( text );
+ ###### Parameters
+ **`text`**
+   - A `DOMString` specifying the clipboard data to send. Currently only
+   characters from ISO 8859-1 are supported.
+ #### RFB.autoscale()
+ The `RFB.autoscale()` method is used to automatically adjust
+ `RFB.viewportScale` to fit given dimensions.
+ ##### Syntax
+     RFB.autoscale( width, height );
+ ###### Parameters
+ **`width`**
+   - A `long` specifying the maximum width of the canvas in CSS pixels.
+ **`height`**
+   - A `long` specifying the maximum height of the canvas in CSS pixels.
+ #### RFB.requestDesktopSize()
+ The `RFB.requestDesktopSize()` method is used to request a change of
+ the framebuffer. The capability `resize` must be set for this method to
+ have any effect.
+ Note that this is merely a request and the server may deny it.
+ The [`fbresize`](#fbresize) event will be fired when the framebuffer
+ actually changes dimensions.
+ ##### Syntax
+     RFB.requestDesktopSize( width, height );
+ ###### Parameters
+ **`width`**
+   - A `long` specifying the new requested width in CSS pixels.
+ **`height`**
+   - A `long` specifying the new requested height in CSS pixels.
+ #### RFB.viewportChangeSize()
+ The `RFB.viewportChangeSize()` method is used to change the size of the
+ canvas rather than the underlying framebuffer.
+ This method has no effect if `RFB.clipViewport` is set to `false`.
+ ##### Syntax
+     RFB.viewportChangeSize( width, height );
+ ###### Parameters
+ **`width`**
+   - A `long` specifying the new width in CSS pixels.
+ **`height`**
+   - A `long` specifying the new height in CSS pixels.
diff --cc vnc_lite.html
index 671d78e67d778275ddfd47439cdb8920d46f8796,6575b4631b34d2dfa168d73d7cb4e8bb92c71acb..d817885d30fb6e4383b47b8190d7156995fdc9c6
                  default:
                      level = "warn";
              }
 -            document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_" + level);
 +            document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level;
              document.getElementById('noVNC_status').textContent = text;
          }
-         function updateState(rfb, state, oldstate) {
+         function updateState(e) {
              var cad = document.getElementById('sendCtrlAltDelButton');
-             switch (state) {
+             switch (e.detail.state) {
                  case 'connecting':
                      status("Connecting", "normal");
                      break;
              }, 500);
          };
  
-         function xvpInit(ver) {
-             var xvpbuttons;
-             xvpbuttons = document.getElementById('noVNC_xvp_buttons');
-             if (ver >= 1) {
+         function updatePowerButtons() {
+             var powerbuttons;
+             powerbuttons = document.getElementById('noVNC_power_buttons');
+             if (rfb.capabilities.power) {
 -                powerbuttons.style.display = 'inline';
 +                xvpbuttons.className= "noVNC_shown";
              } else {
 -                powerbuttons.style.display = 'none';
 +                xvpbuttons.className = "noVNC_hidden";
              }
          }
  
 -        document.getElementById('sendCtrlAltDelButton').style.display = "inline";
          document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
-         document.getElementById('xvpShutdownButton').onclick = xvpShutdown;
-         document.getElementById('xvpRebootButton').onclick = xvpReboot;
-         document.getElementById('xvpResetButton').onclick = xvpReset;
+         document.getElementById('machineShutdownButton').onclick = machineShutdown;
+         document.getElementById('machineRebootButton').onclick = machineReboot;
+         document.getElementById('machineResetButton').onclick = machineReset;
  
          WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
          document.title = WebUtil.getConfigVar('title', 'noVNC');
      </script>
  </head>
  
 -<body style="margin: 0px;">
 -    <div id="noVNC_container">
 -            <div id="noVNC_status_bar" class="noVNC_status_bar" style="margin-top: 0px;">
 -                <table border=0 width="100%"><tr>
 -                    <td><div id="noVNC_status" style="position: relative; height: auto;">
 -                        Loading
 -                    </div></td>
 -                    <td width="1%"><div id="noVNC_buttons">
 -                        <input type=button value="Send CtrlAltDel"
 -                            id="sendCtrlAltDelButton">
 -                        <span id="noVNC_power_buttons">
 -                        <input type=button value="Shutdown"
 -                            id="machineShutdownButton">
 -                        <input type=button value="Reboot"
 -                            id="machineRebootButton">
 -                        <input type=button value="Reset"
 -                            id="machineResetButton">
 -                        </span>
 -                            </div></td>
 -                </tr></table>
 -            </div>
 -            <canvas id="noVNC_canvas" width="640px" height="20px">
 -                Canvas not supported.
 -            </canvas>
 -        </div>
 -
 -    </body>
 +<body>
 +  <div id="noVNC_status_bar">
 +    <div id="noVNC_left_dummy_elem"></div>
 +    <div id="noVNC_status">Loading</div>
 +    <div id="noVNC_buttons">
 +      <input type=button value="Send CtrlAltDel"
 +             id="sendCtrlAltDelButton" class="noVNC_shown">
-       <span id="noVNC_xvp_buttons" class="noVNC_hidden">
++      <span id="noVNC_power_buttons" class="noVNC_hidden">
 +        <input type=button value="Shutdown"
-                id="xvpShutdownButton">
++               id="machineShutdownButton">
 +        <input type=button value="Reboot"
-                id="xvpRebootButton">
++               id="machineRebootButton">
 +        <input type=button value="Reset"
-                id="xvpResetButton">
++               id="machineResetButton">
 +      </span>
 +    </div>
 +  </div>
 +  <canvas id="noVNC_canvas" width="0" height="0">
 +    Canvas not supported.
 +  </canvas>
 +
 +</body>
  </html>