├── .gitignore ├── Dockerfile ├── README.md ├── build ├── docker-compose.yml ├── elixir-intellij-noVNC.jpg ├── intellij-elixir.zip ├── intellij └── run ├── jdk.table.xml ├── license ├── noVNC-master.zip ├── noVNC ├── .gitignore ├── .gitmodules ├── .npmignore ├── .travis.yml ├── LICENSE.txt ├── README.md ├── app │ ├── images │ │ ├── alt.svg │ │ ├── clipboard.svg │ │ ├── connect.svg │ │ ├── ctrl.svg │ │ ├── ctrlaltdel.svg │ │ ├── disconnect.svg │ │ ├── drag.svg │ │ ├── error.svg │ │ ├── esc.svg │ │ ├── fullscreen.svg │ │ ├── handle.svg │ │ ├── handle_bg.svg │ │ ├── icons │ │ │ ├── Makefile │ │ │ ├── novnc-120x120.png │ │ │ ├── novnc-144x144.png │ │ │ ├── novnc-152x152.png │ │ │ ├── novnc-16x16.png │ │ │ ├── novnc-192x192.png │ │ │ ├── novnc-24x24.png │ │ │ ├── novnc-32x32.png │ │ │ ├── novnc-48x48.png │ │ │ ├── novnc-60x60.png │ │ │ ├── novnc-64x64.png │ │ │ ├── novnc-72x72.png │ │ │ ├── novnc-76x76.png │ │ │ ├── novnc-96x96.png │ │ │ ├── novnc-icon-sm.svg │ │ │ └── novnc-icon.svg │ │ ├── info.svg │ │ ├── keyboard.svg │ │ ├── mouse_left.svg │ │ ├── mouse_middle.svg │ │ ├── mouse_none.svg │ │ ├── mouse_right.svg │ │ ├── power.svg │ │ ├── settings.svg │ │ ├── tab.svg │ │ ├── toggleextrakeys.svg │ │ └── warning.svg │ ├── sounds │ │ ├── CREDITS │ │ ├── bell.mp3 │ │ └── bell.oga │ ├── styles │ │ ├── Orbitron700.ttf │ │ ├── Orbitron700.woff │ │ └── base.css │ ├── ui.js │ └── webutil.js ├── core │ ├── base64.js │ ├── des.js │ ├── display.js │ ├── inflator.js │ ├── input │ │ ├── keysym.js │ │ ├── keysymdef.js │ │ ├── util.js │ │ └── xtscancodes.js │ ├── rfb.js │ └── websock.js ├── docs │ ├── LICENSE.BSD-2-Clause │ ├── LICENSE.BSD-3-Clause │ ├── LICENSE.MPL-2.0 │ ├── LICENSE.OFL-1.1 │ ├── flash_policy.txt │ ├── links │ ├── notes │ ├── rfb_notes │ ├── rfbproto-3.3.pdf │ ├── rfbproto-3.7.pdf │ └── rfbproto-3.8.pdf ├── karma.conf.js ├── package.json ├── tests │ ├── assertions.js │ ├── fake.websocket.js │ ├── playback.js │ ├── test.base64.js │ ├── test.display.js │ ├── test.helper.js │ ├── test.keyboard.js │ ├── test.rfb.js │ ├── test.util.js │ ├── test.websock.js │ └── vnc_playback.html ├── utils │ ├── README.md │ ├── b64-to-binary.pl │ ├── img2js.py │ ├── json2graph.py │ ├── launch.sh │ ├── u2x11 │ └── use_require.js └── vnc.html ├── openbox-config └── .config │ ├── gtk-2.0 │ └── gtkfilechooser.ini │ ├── gtk-3.0 │ └── settings.ini │ ├── libfm │ ├── dir-settings.conf │ └── libfm.conf │ ├── libreoffice │ └── 4 │ │ └── user │ │ ├── autotext │ │ └── mytexts.bau │ │ ├── basic │ │ ├── Standard │ │ │ ├── Module1.xba │ │ │ ├── dialog.xlb │ │ │ └── script.xlb │ │ ├── dialog.xlc │ │ └── script.xlc │ │ ├── config │ │ ├── arrowhd.soe │ │ ├── autotbl.fmt │ │ ├── classic.sog │ │ ├── cmyk.soc │ │ ├── gallery.soc │ │ ├── hatching.soh │ │ ├── html.soc │ │ ├── javasettings_Linux_X86_64.xml │ │ ├── libreoffice.soc │ │ ├── modern.sog │ │ ├── palette.soc │ │ ├── scribus.soc │ │ ├── standard.sob │ │ ├── standard.soc │ │ ├── standard.sod │ │ ├── standard.soe │ │ ├── standard.sog │ │ ├── standard.soh │ │ ├── styles.sod │ │ ├── tango.soc │ │ └── web.soc │ │ ├── database │ │ ├── biblio.odb │ │ ├── biblio │ │ │ ├── biblio.dbf │ │ │ └── biblio.dbt │ │ └── evolocal.odb │ │ ├── extensions │ │ ├── buildid │ │ ├── bundled │ │ │ ├── lastsynchronized │ │ │ └── registry │ │ │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend │ │ │ │ └── backenddb.xml │ │ │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend │ │ │ │ └── backenddb.xml │ │ ├── shared │ │ │ ├── lastsynchronized │ │ │ └── registry │ │ │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend │ │ │ │ └── backenddb.xml │ │ │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend │ │ │ │ └── backenddb.xml │ │ └── tmp │ │ │ └── registry │ │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend │ │ │ └── backenddb.xml │ │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend │ │ │ └── backenddb.xml │ │ ├── gallery │ │ ├── sg30.sdv │ │ └── sg30.thm │ │ ├── psprint │ │ └── pspfontcache │ │ ├── registrymodifications.xcu │ │ └── uno_packages │ │ └── cache │ │ ├── log.txt │ │ └── registry │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend │ │ └── backenddb.xml │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend │ │ └── backenddb.xml │ ├── lxpanel │ └── LXDE │ │ ├── config │ │ └── panels │ │ └── panel │ ├── lxsession │ └── LXDE │ │ ├── autostart │ │ └── desktop.conf │ ├── lxterminal │ └── lxterminal.conf │ ├── openbox │ ├── lxde-rc.xml │ └── menu.xml │ ├── pcmanfm │ └── LXDE │ │ ├── desktop-items-0.conf │ │ └── pcmanfm.conf │ └── xarchiver │ └── xarchiverrc ├── run ├── startup.sh ├── supervisord.conf.xorg └── xorg.conf /.gitignore: -------------------------------------------------------------------------------- 1 | /noVNC/self.pem 2 | -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | sudo docker build -t stefan/phoenix . | tee build.log 2 | 3 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | # docker-compose.yml 2 | version: '2' 3 | 4 | services: 5 | web: 6 | image: stefan/phoenix 7 | environment: 8 | DATABASE_URL: postgres://rumbl:rumbl@db/rumbl_dev 9 | PORT: 5432 10 | MIX_ENV: "dev" 11 | VIRTUAL_HEIGHT: 929 12 | VIRTUAL_WIDTH: 1920 13 | # UBUNTUPASS: "override" 14 | # VNCPASS: "also override" 15 | ENABLE_HTTP: "Y" 16 | DISPLAY: $DISPLAY 17 | links: 18 | - postgres 19 | ports: 20 | - 4000:4000 21 | - 6080:6080 22 | volumes: 23 | - /var/lib/docker/volumes/volume_name_onhost/_data:/folder_name_in_container 24 | # - /var/lib/docker/volumes/intellij/_data/.IdeaIC2017.3/config:/home/ubuntu/.IdeaIC2017.3/config 25 | # - /var/lib/docker/volumes/openbox/_data:/home/ubuntu/.config/openbox 26 | - /tmp/.X11-unix:/tmp/.X11-unix 27 | stdin_open: true 28 | postgres: 29 | image: postgres 30 | environment: 31 | LC_ALL: C.UTF-8 32 | POSTGRES_USER: postgres 33 | POSTGRES_PASSWORD: postgres 34 | volumes: 35 | - "volume_name_onhost:/var/lib/postgresql/data" 36 | volumes: 37 | folder_name_in_container: 38 | volume_name_onhost: 39 | 40 | -------------------------------------------------------------------------------- /elixir-intellij-noVNC.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/elixir-intellij-noVNC.jpg -------------------------------------------------------------------------------- /intellij-elixir.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/intellij-elixir.zip -------------------------------------------------------------------------------- /intellij/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function delayedPluginInstall { 4 | sudo mkdir -p /home/ubuntu/.IdeaIC2016.2/config/plugins 5 | sudo mkdir -p /home/ubuntu/.IdeaIC2016.2/config/options 6 | sudo chown ubuntu:ubuntu -R /home/ubuntu/.IdeaIC2016.2 7 | 8 | cd /home/ubuntu/.IdeaIC2016.2/config/plugins/ 9 | 10 | echo 'Installing Markdown support plugin' 11 | wget https://plugins.jetbrains.com/files/7793/25156/markdown-2016.1.20160405.zip -O markdown.zip -q && unzip -q markdown.zip && rm markdown.zip 12 | 13 | } 14 | 15 | if [ ! -d /home/ubuntu/.IdeaIC2016.2/config/plugins/intellij-elixir ]; then 16 | # We are running with a non-Docker contained volume for IntelliJ prefs so we need to setup the plugin again 17 | delayedPluginInstall 18 | fi 19 | 20 | if [ -d /home/ubuntu/.IdeaIC2016.2 ]; then 21 | # Ensure proper permissions 22 | sudo chown ubuntu:ubuntu -R /home/ubuntu/.IdeaIC2016.2 23 | fi 24 | 25 | exec /opt/intellij/bin/idea.sh 26 | 27 | -------------------------------------------------------------------------------- /jdk.table.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | Do whatever you like with this repo. If you find anything improvements, please let me know. 2 | -------------------------------------------------------------------------------- /noVNC-master.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC-master.zip -------------------------------------------------------------------------------- /noVNC/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.o 3 | tests/data_*.js 4 | utils/rebind.so 5 | utils/websockify 6 | /node_modules 7 | /build 8 | /lib 9 | recordings 10 | *.swp 11 | *~ 12 | noVNC-*.tgz 13 | -------------------------------------------------------------------------------- /noVNC/.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/.gitmodules -------------------------------------------------------------------------------- /noVNC/.npmignore: -------------------------------------------------------------------------------- 1 | # infra JS 2 | /build/ 3 | /node_modules/ 4 | /tests/ 5 | /utils/ 6 | /recordings/ 7 | /vendor/sinon.js 8 | 9 | # noVNC application files 10 | /app 11 | /vendor/browser-es-module-loader 12 | /vendor/promise.js 13 | /vnc.html 14 | /vnc_lite.html 15 | 16 | # raw translation files 17 | /po 18 | 19 | # config files 20 | /.travis.yml 21 | /karma.conf.js 22 | 23 | # various other files 24 | /.gitmodules 25 | .* 26 | *~ 27 | *.swp 28 | *.swo 29 | 30 | # documentation (except licenses) 31 | /docs/notes 32 | /docs/links 33 | /docs/release.txt 34 | /docs/rfb_notes 35 | /docs/*.pdf 36 | /docs/flash_policy.txt 37 | /CONTRIBUTING.md 38 | -------------------------------------------------------------------------------- /noVNC/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | cache: 4 | directories: 5 | - node_modules 6 | node_js: 7 | - 6 8 | env: 9 | matrix: 10 | - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Windows 10' 11 | # FIXME Skip tests in Linux since Sauce Labs browser versions are ancient. 12 | # - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Linux' 13 | - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='OS X 10.11' 14 | - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Windows 10' 15 | # - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Linux' 16 | - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='OS X 10.11' 17 | - TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 10' 18 | - TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 7' 19 | - TEST_BROWSER_NAME=microsoftedge TEST_BROWSER_OS='Windows 10' 20 | - TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.11' 21 | before_script: npm install -g karma-cli 22 | addons: 23 | sauce_connect: 24 | username: "directxman12" 25 | jwt: 26 | secure: "d3ekMYslpn6R4f0ajtRMt9SUFmNGDiItHpqaXC5T4KI0KMEsxgvEOfJot5PiFFJWg1DSpJZH6oaW2UxGZ3duJLZrXIEd/JePY8a6NtT35BNgiDPgcp+eu2Bu3rhrSNg7/HEsD1ma+JeUTnv18Ai5oMFfCCQJx2J6osIxyl/ZVxA=" 27 | stages: 28 | - lint 29 | - test 30 | - name: deploy 31 | if: tag is PRESENT 32 | jobs: 33 | include: 34 | - stage: lint 35 | env: 36 | addons: 37 | before_script: 38 | script: npm run lint 39 | - stage: deploy 40 | script: skip 41 | before_script: skip 42 | deploy: 43 | provider: npm 44 | email: directxman12+npm@gmail.com 45 | api_key: 46 | secure: cIidkFmvkdmdwWsqBpxyPUCzBqgK8LhPiNxTrIfhwbUunMsJep9MiiBJtv8poVYG2Y4yfiZmqGn4nfetUdc/LDctd73j+/EM4Z/NUDexVAhJ+9/qCogvpJsSQ96VQo7yBceW4E1fBM3WCU0kcGToYIVSSrwvvRDtJfeYJf2Qqw0= 47 | on: 48 | tags: true 49 | repo: novnc/noVNC 50 | 51 | 52 | -------------------------------------------------------------------------------- /noVNC/LICENSE.txt: -------------------------------------------------------------------------------- 1 | noVNC is Copyright (C) 2011 Joel Martin 2 | 3 | The noVNC core library files are licensed under the MPL 2.0 (Mozilla 4 | Public License 2.0). The noVNC core library is composed of the 5 | Javascript code necessary for full noVNC operation. This includes (but 6 | is not limited to): 7 | 8 | core/**/*.js 9 | app/*.js 10 | test/playback.js 11 | 12 | The HTML, CSS, font and images files that included with the noVNC 13 | source distibution (or repository) are not considered part of the 14 | noVNC core library and are licensed under more permissive licenses. 15 | The intent is to allow easy integration of noVNC into existing web 16 | sites and web applications. 17 | 18 | The HTML, CSS, font and image files are licensed as follows: 19 | 20 | *.html : 2-Clause BSD license 21 | 22 | app/styles/*.css : 2-Clause BSD license 23 | 24 | app/styles/Orbitron* : SIL Open Font License 1.1 25 | (Copyright 2009 Matt McInerney) 26 | 27 | app/images/ : Creative Commons Attribution-ShareAlike 28 | http://creativecommons.org/licenses/by-sa/3.0/ 29 | 30 | Some portions of noVNC are copyright to their individual authors. 31 | Please refer to the individual source files and/or to the noVNC commit 32 | history: https://github.com/novnc/noVNC/commits/master 33 | 34 | The are several files and projects that have been incorporated into 35 | the noVNC core library. Here is a list of those files and the original 36 | licenses (all MPL 2.0 compatible): 37 | 38 | core/base64.js : MPL 2.0 39 | 40 | core/des.js : Various BSD style licenses 41 | 42 | vendor/pako/ : MIT 43 | 44 | vendor/browser-es-module-loader/src/ : MIT 45 | 46 | vendor/browser-es-module-loader/dist/ : Various BSD style licenses 47 | 48 | vendor/promise.js : MIT 49 | 50 | Any other files not mentioned above are typically marked with 51 | a copyright/license header at the top of the file. The default noVNC 52 | license is MPL-2.0. 53 | 54 | The following license texts are included: 55 | 56 | docs/LICENSE.MPL-2.0 57 | docs/LICENSE.OFL-1.1 58 | docs/LICENSE.BSD-3-Clause (New BSD) 59 | docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD) 60 | vendor/pako/LICENSE (MIT) 61 | 62 | Or alternatively the license texts may be found here: 63 | 64 | http://www.mozilla.org/MPL/2.0/ 65 | http://scripts.sil.org/OFL 66 | http://en.wikipedia.org/wiki/BSD_licenses 67 | https://opensource.org/licenses/MIT 68 | -------------------------------------------------------------------------------- /noVNC/README.md: -------------------------------------------------------------------------------- 1 | ## noVNC: HTML VNC Client Library and Application 2 | 3 | [![Build Status](https://travis-ci.org/novnc/noVNC.svg?branch=master)](https://travis-ci.org/novnc/noVNC) 4 | 5 | ### Description 6 | 7 | noVNC is both a HTML VNC client JavaScript library and an application built on 8 | top of that library. noVNC runs well in any modern browser including mobile 9 | browsers (iOS and Android). 10 | 11 | Many companies, projects and products have integrated noVNC including 12 | [OpenStack](http://www.openstack.org), 13 | [OpenNebula](http://opennebula.org/), 14 | [LibVNCServer](http://libvncserver.sourceforge.net), and 15 | [ThinLinc](https://cendio.com/thinlinc). See 16 | [the Projects and Companies wiki page](https://github.com/novnc/noVNC/wiki/Projects-and-companies-using-noVNC) 17 | for a more complete list with additional info and links. 18 | 19 | ### Table of Contents 20 | 21 | - [News/help/contact](#newshelpcontact) 22 | - [Features](#features) 23 | - [Screenshots](#screenshots) 24 | - [Browser Requirements](#browser-requirements) 25 | - [Server Requirements](#server-requirements) 26 | - [Quick Start](#quick-start) 27 | - [Integration and Deployment](#integration-and-deployment) 28 | - [Authors/Contributors](#authorscontributors) 29 | 30 | ### News/help/contact 31 | 32 | The project website is found at [novnc.com](http://novnc.com). 33 | Notable commits, announcements and news are posted to 34 | [@noVNC](http://www.twitter.com/noVNC). 35 | 36 | If you are a noVNC developer/integrator/user (or want to be) please join the 37 | [noVNC discussion group](https://groups.google.com/forum/?fromgroups#!forum/novnc). 38 | 39 | Bugs and feature requests can be submitted via 40 | [github issues](https://github.com/novnc/noVNC/issues). If you have questions 41 | about using noVNC then please first use the 42 | [discussion group](https://groups.google.com/forum/?fromgroups#!forum/novnc). 43 | We also have a [wiki](https://github.com/novnc/noVNC/wiki/) with lots of 44 | helpful information. 45 | 46 | If you are looking for a place to start contributing to noVNC, a good place to 47 | start would be the issues that are marked as 48 | ["patchwelcome"](https://github.com/novnc/noVNC/issues?labels=patchwelcome). 49 | Please check our 50 | [contribution guide](https://github.com/novnc/noVNC/wiki/Contributing) though. 51 | 52 | If you want to show appreciation for noVNC you could donate to a great non- 53 | profits such as: 54 | [Compassion International](http://www.compassion.com/), 55 | [SIL](http://www.sil.org), 56 | [Habitat for Humanity](http://www.habitat.org), 57 | [Electronic Frontier Foundation](https://www.eff.org/), 58 | [Against Malaria Foundation](http://www.againstmalaria.com/), 59 | [Nothing But Nets](http://www.nothingbutnets.net/), etc. 60 | Please tweet [@noVNC](http://www.twitter.com/noVNC) if you do. 61 | 62 | 63 | ### Features 64 | 65 | * Supports all modern browsers including mobile (iOS, Android) 66 | * Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG 67 | * Supports scaling, clipping and resizing the desktop 68 | * Local cursor rendering 69 | * Clipboard copy/paste 70 | * Licensed mainly under the [MPL 2.0](http://www.mozilla.org/MPL/2.0/), see 71 | [the license document](LICENSE.txt) for details 72 | 73 | ### Screenshots 74 | 75 | Running in Firefox before and after connecting: 76 | 77 |   78 | 79 | 80 | See more screenshots 81 | [here](http://novnc.com/screenshots.html). 82 | 83 | 84 | ### Browser Requirements 85 | 86 | noVNC uses many modern web technologies so a formal requirement list is 87 | not available. However these are the minimum versions we are currently 88 | aware of: 89 | 90 | * Chrome 49, Firefox 44, Safari 10, Opera 36, IE 11, Edge 12 91 | 92 | 93 | ### Server Requirements 94 | 95 | noVNC follows the standard VNC protocol, but unlike other VNC clients it does 96 | require WebSockets support. Many servers include support (e.g. 97 | [x11vnc/libvncserver](http://libvncserver.sourceforge.net/), 98 | [QEMU](http://www.qemu.org/), and 99 | [MobileVNC](http://www.smartlab.at/mobilevnc/)), but for the others you need to 100 | use a WebSockets to TCP socket proxy. noVNC has a sister project 101 | [websockify](https://github.com/novnc/websockify) that provides a simple such 102 | proxy. 103 | 104 | 105 | ### Quick Start 106 | 107 | * Use the launch script to automatically download and start websockify, which 108 | includes a mini-webserver and the WebSockets proxy. The `--vnc` option is 109 | used to specify the location of a running VNC server: 110 | 111 | `./utils/launch.sh --vnc localhost:5901` 112 | 113 | * Point your browser to the cut-and-paste URL that is output by the launch 114 | script. Hit the Connect button, enter a password if the VNC server has one 115 | configured, and enjoy! 116 | 117 | 118 | ### Integration and Deployment 119 | 120 | Please see our other documents for how to integrate noVNC in your own software, 121 | or deploying the noVNC application in production environments: 122 | 123 | * [Embedding](docs/EMBEDDING.md) - For the noVNC application 124 | * [Library](docs/LIBRARY.md) - For the noVNC JavaScript library 125 | 126 | 127 | ### Authors/Contributors 128 | 129 | * Core team: 130 | * [Joel Martin](https://github.com/kanaka) 131 | * [Samuel Mannehed](https://github.com/samhed) (Cendio) 132 | * [Peter Åstrand](https://github.com/astrand) (Cendio) 133 | * [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack) 134 | * [Pierre Ossman](https://github.com/CendioOssman) (Cendio) 135 | 136 | * Notable contributions: 137 | * UI and Icons : Pierre Ossman, Chris Gordon 138 | * Original Logo : Michael Sersen 139 | * tight encoding : Michael Tinglof (Mercuri.ca) 140 | 141 | * Included libraries: 142 | * base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net) 143 | * DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs) 144 | * Pako : Vitaly Puzrin (https://github.com/nodeca/pako) 145 | 146 | Do you want to be on this list? Check out our 147 | [contribution guide](https://github.com/novnc/noVNC/wiki/Contributing) and 148 | start hacking! 149 | -------------------------------------------------------------------------------- /noVNC/app/images/alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 82 | 86 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /noVNC/app/images/clipboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 82 | 90 | 95 | 100 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /noVNC/app/images/connect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 77 | 83 | 89 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /noVNC/app/images/ctrl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 82 | 86 | 90 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /noVNC/app/images/ctrlaltdel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 83 | 91 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /noVNC/app/images/disconnect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 84 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /noVNC/app/images/drag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 49 | 52 | 53 | 55 | 56 | 58 | image/svg+xml 59 | 61 | 62 | 63 | 64 | 65 | 70 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /noVNC/app/images/error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /noVNC/app/images/esc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 82 | 86 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /noVNC/app/images/fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 82 | 87 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /noVNC/app/images/handle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /noVNC/app/images/icons/Makefile: -------------------------------------------------------------------------------- 1 | ICONS := \ 2 | novnc-16x16.png \ 3 | novnc-24x24.png \ 4 | novnc-32x32.png \ 5 | novnc-48x48.png \ 6 | novnc-64x64.png 7 | 8 | ANDROID_LAUNCHER := \ 9 | novnc-48x48.png \ 10 | novnc-72x72.png \ 11 | novnc-96x96.png \ 12 | novnc-144x144.png \ 13 | novnc-192x192.png 14 | 15 | IPHONE_LAUNCHER := \ 16 | novnc-60x60.png \ 17 | novnc-120x120.png 18 | 19 | IPAD_LAUNCHER := \ 20 | novnc-76x76.png \ 21 | novnc-152x152.png 22 | 23 | ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER) 24 | 25 | all: $(ALL_ICONS) 26 | 27 | novnc-16x16.png: novnc-icon-sm.svg 28 | convert -density 90 \ 29 | -background transparent "$<" "$@" 30 | novnc-24x24.png: novnc-icon-sm.svg 31 | convert -density 135 \ 32 | -background transparent "$<" "$@" 33 | novnc-32x32.png: novnc-icon-sm.svg 34 | convert -density 180 \ 35 | -background transparent "$<" "$@" 36 | 37 | novnc-%.png: novnc-icon.svg 38 | convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \ 39 | -background transparent "$<" "$@" 40 | 41 | clean: 42 | rm -f *.png 43 | -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-120x120.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-144x144.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-152x152.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-16x16.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-192x192.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-24x24.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-32x32.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-48x48.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-60x60.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-64x64.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-72x72.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-76x76.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-96x96.png -------------------------------------------------------------------------------- /noVNC/app/images/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /noVNC/app/images/keyboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 81 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /noVNC/app/images/power.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /noVNC/app/images/settings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 49 | 52 | 53 | 55 | 56 | 58 | image/svg+xml 59 | 61 | 62 | 63 | 64 | 65 | 70 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /noVNC/app/images/tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /noVNC/app/images/toggleextrakeys.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 80 | 84 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /noVNC/app/images/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /noVNC/app/sounds/CREDITS: -------------------------------------------------------------------------------- 1 | bell 2 | Copyright: Dr. Richard Boulanger et al 3 | URL: http://www.archive.org/details/Berklee44v12 4 | License: CC-BY Attribution 3.0 Unported 5 | -------------------------------------------------------------------------------- /noVNC/app/sounds/bell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/sounds/bell.mp3 -------------------------------------------------------------------------------- /noVNC/app/sounds/bell.oga: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/sounds/bell.oga -------------------------------------------------------------------------------- /noVNC/app/styles/Orbitron700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/styles/Orbitron700.ttf -------------------------------------------------------------------------------- /noVNC/app/styles/Orbitron700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/styles/Orbitron700.woff -------------------------------------------------------------------------------- /noVNC/core/base64.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 | 5 | // From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js 6 | 7 | import * as Log from './util/logging.js'; 8 | 9 | export default { 10 | /* Convert data (an array of integers) to a Base64 string. */ 11 | toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), 12 | base64Pad : '=', 13 | 14 | encode: function (data) { 15 | "use strict"; 16 | let result = ''; 17 | const length = data.length; 18 | const lengthpad = (length % 3); 19 | // Convert every three bytes to 4 ascii characters. 20 | 21 | for (let i = 0; i < (length - 2); i += 3) { 22 | result += this.toBase64Table[data[i] >> 2]; 23 | result += this.toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)]; 24 | result += this.toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)]; 25 | result += this.toBase64Table[data[i + 2] & 0x3f]; 26 | } 27 | 28 | // Convert the remaining 1 or 2 bytes, pad out to 4 characters. 29 | const j = length - lengthpad; 30 | if (lengthpad === 2) { 31 | result += this.toBase64Table[data[j] >> 2]; 32 | result += this.toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)]; 33 | result += this.toBase64Table[(data[j + 1] & 0x0f) << 2]; 34 | result += this.toBase64Table[64]; 35 | } else if (lengthpad === 1) { 36 | result += this.toBase64Table[data[j] >> 2]; 37 | result += this.toBase64Table[(data[j] & 0x03) << 4]; 38 | result += this.toBase64Table[64]; 39 | result += this.toBase64Table[64]; 40 | } 41 | 42 | return result; 43 | }, 44 | 45 | /* Convert Base64 data to a string */ 46 | toBinaryTable : [ 47 | -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, 48 | -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, 49 | -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, 50 | 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, 51 | -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, 52 | 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, 53 | -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, 54 | 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 55 | ], 56 | 57 | decode: function (data, offset) { 58 | "use strict"; 59 | offset = typeof(offset) !== 'undefined' ? offset : 0; 60 | 61 | let data_length = data.indexOf('=') - offset; 62 | if (data_length < 0) { data_length = data.length - offset; } 63 | 64 | /* Every four characters is 3 resulting numbers */ 65 | const result_length = (data_length >> 2) * 3 + Math.floor((data_length % 4) / 1.5); 66 | const result = new Array(result_length); 67 | 68 | // Convert one by one. 69 | 70 | let leftbits = 0; // number of bits decoded, but yet to be appended 71 | let leftdata = 0; // bits decoded, but yet to be appended 72 | for (let idx = 0, i = offset; i < data.length; i++) { 73 | const c = this.toBinaryTable[data.charCodeAt(i) & 0x7f]; 74 | const padding = (data.charAt(i) === this.base64Pad); 75 | // Skip illegal characters and whitespace 76 | if (c === -1) { 77 | Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i); 78 | continue; 79 | } 80 | 81 | // Collect data into leftdata, update bitcount 82 | leftdata = (leftdata << 6) | c; 83 | leftbits += 6; 84 | 85 | // If we have 8 or more bits, append 8 bits to the result 86 | if (leftbits >= 8) { 87 | leftbits -= 8; 88 | // Append if not padding. 89 | if (!padding) { 90 | result[idx++] = (leftdata >> leftbits) & 0xff; 91 | } 92 | leftdata &= (1 << leftbits) - 1; 93 | } 94 | } 95 | 96 | // If there are any bits left, the base64 string was corrupted 97 | if (leftbits) { 98 | const err = new Error('Corrupted base64 string'); 99 | err.name = 'Base64-Error'; 100 | throw err; 101 | } 102 | 103 | return result; 104 | } 105 | }; /* End of Base64 namespace */ 106 | -------------------------------------------------------------------------------- /noVNC/core/inflator.js: -------------------------------------------------------------------------------- 1 | import { inflateInit, inflate, inflateReset } from "../vendor/pako/lib/zlib/inflate.js"; 2 | import ZStream from "../vendor/pako/lib/zlib/zstream.js"; 3 | 4 | Inflate.prototype = { 5 | inflate: function (data, flush, expected) { 6 | this.strm.input = data; 7 | this.strm.avail_in = this.strm.input.length; 8 | this.strm.next_in = 0; 9 | this.strm.next_out = 0; 10 | 11 | // resize our output buffer if it's too small 12 | // (we could just use multiple chunks, but that would cause an extra 13 | // allocation each time to flatten the chunks) 14 | if (expected > this.chunkSize) { 15 | this.chunkSize = expected; 16 | this.strm.output = new Uint8Array(this.chunkSize); 17 | } 18 | 19 | this.strm.avail_out = this.chunkSize; 20 | 21 | inflate(this.strm, flush); 22 | 23 | return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); 24 | }, 25 | 26 | reset: function () { 27 | inflateReset(this.strm); 28 | } 29 | }; 30 | 31 | export default function Inflate() { 32 | this.strm = new ZStream(); 33 | this.chunkSize = 1024 * 10 * 10; 34 | this.strm.output = new Uint8Array(this.chunkSize); 35 | this.windowBits = 5; 36 | 37 | inflateInit(this.strm, this.windowBits); 38 | } 39 | -------------------------------------------------------------------------------- /noVNC/core/input/util.js: -------------------------------------------------------------------------------- 1 | import keysyms from "./keysymdef.js"; 2 | import vkeys from "./vkeys.js"; 3 | import fixedkeys from "./fixedkeys.js"; 4 | import DOMKeyTable from "./domkeytable.js"; 5 | import * as browser from "../util/browser.js"; 6 | 7 | // Get 'KeyboardEvent.code', handling legacy browsers 8 | export function getKeycode(evt){ 9 | // Are we getting proper key identifiers? 10 | // (unfortunately Firefox and Chrome are crappy here and gives 11 | // us an empty string on some platforms, rather than leaving it 12 | // undefined) 13 | if (evt.code) { 14 | // Mozilla isn't fully in sync with the spec yet 15 | switch (evt.code) { 16 | case 'OSLeft': return 'MetaLeft'; 17 | case 'OSRight': return 'MetaRight'; 18 | } 19 | 20 | return evt.code; 21 | } 22 | 23 | // The de-facto standard is to use Windows Virtual-Key codes 24 | // in the 'keyCode' field for non-printable characters. However 25 | // Webkit sets it to the same as charCode in 'keypress' events. 26 | if ((evt.type !== 'keypress') && (evt.keyCode in vkeys)) { 27 | let code = vkeys[evt.keyCode]; 28 | 29 | // macOS has messed up this code for some reason 30 | if (browser.isMac() && (code === 'ContextMenu')) { 31 | code = 'MetaRight'; 32 | } 33 | 34 | // The keyCode doesn't distinguish between left and right 35 | // for the standard modifiers 36 | if (evt.location === 2) { 37 | switch (code) { 38 | case 'ShiftLeft': return 'ShiftRight'; 39 | case 'ControlLeft': return 'ControlRight'; 40 | case 'AltLeft': return 'AltRight'; 41 | } 42 | } 43 | 44 | // Nor a bunch of the numpad keys 45 | if (evt.location === 3) { 46 | switch (code) { 47 | case 'Delete': return 'NumpadDecimal'; 48 | case 'Insert': return 'Numpad0'; 49 | case 'End': return 'Numpad1'; 50 | case 'ArrowDown': return 'Numpad2'; 51 | case 'PageDown': return 'Numpad3'; 52 | case 'ArrowLeft': return 'Numpad4'; 53 | case 'ArrowRight': return 'Numpad6'; 54 | case 'Home': return 'Numpad7'; 55 | case 'ArrowUp': return 'Numpad8'; 56 | case 'PageUp': return 'Numpad9'; 57 | case 'Enter': return 'NumpadEnter'; 58 | } 59 | } 60 | 61 | return code; 62 | } 63 | 64 | return 'Unidentified'; 65 | } 66 | 67 | // Get 'KeyboardEvent.key', handling legacy browsers 68 | export function getKey(evt) { 69 | // Are we getting a proper key value? 70 | if (evt.key !== undefined) { 71 | // IE and Edge use some ancient version of the spec 72 | // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/ 73 | switch (evt.key) { 74 | case 'Spacebar': return ' '; 75 | case 'Esc': return 'Escape'; 76 | case 'Scroll': return 'ScrollLock'; 77 | case 'Win': return 'Meta'; 78 | case 'Apps': return 'ContextMenu'; 79 | case 'Up': return 'ArrowUp'; 80 | case 'Left': return 'ArrowLeft'; 81 | case 'Right': return 'ArrowRight'; 82 | case 'Down': return 'ArrowDown'; 83 | case 'Del': return 'Delete'; 84 | case 'Divide': return '/'; 85 | case 'Multiply': return '*'; 86 | case 'Subtract': return '-'; 87 | case 'Add': return '+'; 88 | case 'Decimal': return evt.char; 89 | } 90 | 91 | // Mozilla isn't fully in sync with the spec yet 92 | switch (evt.key) { 93 | case 'OS': return 'Meta'; 94 | } 95 | 96 | // iOS leaks some OS names 97 | switch (evt.key) { 98 | case 'UIKeyInputUpArrow': return 'ArrowUp'; 99 | case 'UIKeyInputDownArrow': return 'ArrowDown'; 100 | case 'UIKeyInputLeftArrow': return 'ArrowLeft'; 101 | case 'UIKeyInputRightArrow': return 'ArrowRight'; 102 | case 'UIKeyInputEscape': return 'Escape'; 103 | } 104 | 105 | // IE and Edge have broken handling of AltGraph so we cannot 106 | // trust them for printable characters 107 | if ((evt.key.length !== 1) || (!browser.isIE() && !browser.isEdge())) { 108 | return evt.key; 109 | } 110 | } 111 | 112 | // Try to deduce it based on the physical key 113 | const code = getKeycode(evt); 114 | if (code in fixedkeys) { 115 | return fixedkeys[code]; 116 | } 117 | 118 | // If that failed, then see if we have a printable character 119 | if (evt.charCode) { 120 | return String.fromCharCode(evt.charCode); 121 | } 122 | 123 | // At this point we have nothing left to go on 124 | return 'Unidentified'; 125 | } 126 | 127 | // Get the most reliable keysym value we can get from a key event 128 | export function getKeysym(evt){ 129 | const key = getKey(evt); 130 | 131 | if (key === 'Unidentified') { 132 | return null; 133 | } 134 | 135 | // First look up special keys 136 | if (key in DOMKeyTable) { 137 | let location = evt.location; 138 | 139 | // Safari screws up location for the right cmd key 140 | if ((key === 'Meta') && (location === 0)) { 141 | location = 2; 142 | } 143 | 144 | if ((location === undefined) || (location > 3)) { 145 | location = 0; 146 | } 147 | 148 | return DOMKeyTable[key][location]; 149 | } 150 | 151 | // Now we need to look at the Unicode symbol instead 152 | 153 | // Special key? (FIXME: Should have been caught earlier) 154 | if (key.length !== 1) { 155 | return null; 156 | } 157 | 158 | const codepoint = key.charCodeAt(); 159 | if (codepoint) { 160 | return keysyms.lookup(codepoint); 161 | } 162 | 163 | return null; 164 | } 165 | -------------------------------------------------------------------------------- /noVNC/docs/LICENSE.BSD-2-Clause: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 17 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /noVNC/docs/LICENSE.BSD-3-Clause: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the nor the 12 | names of its contributors may be used to endorse or promote products 13 | derived from this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /noVNC/docs/LICENSE.OFL-1.1: -------------------------------------------------------------------------------- 1 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 2 | This license is copied below, and is also available with a FAQ at: 3 | http://scripts.sil.org/OFL 4 | 5 | 6 | ----------------------------------------------------------- 7 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 8 | ----------------------------------------------------------- 9 | 10 | PREAMBLE 11 | The goals of the Open Font License (OFL) are to stimulate worldwide 12 | development of collaborative font projects, to support the font creation 13 | efforts of academic and linguistic communities, and to provide a free and 14 | open framework in which fonts may be shared and improved in partnership 15 | with others. 16 | 17 | The OFL allows the licensed fonts to be used, studied, modified and 18 | redistributed freely as long as they are not sold by themselves. The 19 | fonts, including any derivative works, can be bundled, embedded, 20 | redistributed and/or sold with any software provided that any reserved 21 | names are not used by derivative works. The fonts and derivatives, 22 | however, cannot be released under any other type of license. The 23 | requirement for fonts to remain under this license does not apply 24 | to any document created using the fonts or their derivatives. 25 | 26 | DEFINITIONS 27 | "Font Software" refers to the set of files released by the Copyright 28 | Holder(s) under this license and clearly marked as such. This may 29 | include source files, build scripts and documentation. 30 | 31 | "Reserved Font Name" refers to any names specified as such after the 32 | copyright statement(s). 33 | 34 | "Original Version" refers to the collection of Font Software components as 35 | distributed by the Copyright Holder(s). 36 | 37 | "Modified Version" refers to any derivative made by adding to, deleting, 38 | or substituting -- in part or in whole -- any of the components of the 39 | Original Version, by changing formats or by porting the Font Software to a 40 | new environment. 41 | 42 | "Author" refers to any designer, engineer, programmer, technical 43 | writer or other person who contributed to the Font Software. 44 | 45 | PERMISSION & CONDITIONS 46 | Permission is hereby granted, free of charge, to any person obtaining 47 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 48 | redistribute, and sell modified and unmodified copies of the Font 49 | Software, subject to the following conditions: 50 | 51 | 1) Neither the Font Software nor any of its individual components, 52 | in Original or Modified Versions, may be sold by itself. 53 | 54 | 2) Original or Modified Versions of the Font Software may be bundled, 55 | redistributed and/or sold with any software, provided that each copy 56 | contains the above copyright notice and this license. These can be 57 | included either as stand-alone text files, human-readable headers or 58 | in the appropriate machine-readable metadata fields within text or 59 | binary files as long as those fields can be easily viewed by the user. 60 | 61 | 3) No Modified Version of the Font Software may use the Reserved Font 62 | Name(s) unless explicit written permission is granted by the corresponding 63 | Copyright Holder. This restriction only applies to the primary font name as 64 | presented to the users. 65 | 66 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 67 | Software shall not be used to promote, endorse or advertise any 68 | Modified Version, except to acknowledge the contribution(s) of the 69 | Copyright Holder(s) and the Author(s) or with their explicit written 70 | permission. 71 | 72 | 5) The Font Software, modified or unmodified, in part or in whole, 73 | must be distributed entirely under this license, and must not be 74 | distributed under any other license. The requirement for fonts to 75 | remain under this license does not apply to any document created 76 | using the Font Software. 77 | 78 | TERMINATION 79 | This license becomes null and void if any of the above conditions are 80 | not met. 81 | 82 | DISCLAIMER 83 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 84 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 85 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 86 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 87 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 88 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 89 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 90 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 91 | OTHER DEALINGS IN THE FONT SOFTWARE. 92 | -------------------------------------------------------------------------------- /noVNC/docs/flash_policy.txt: -------------------------------------------------------------------------------- 1 | Manual setup: 2 | 3 | DATA="echo \'\'" 4 | /usr/bin/socat -T 1 TCP-L:843,reuseaddr,fork,crlf SYSTEM:"$DATA" 5 | -------------------------------------------------------------------------------- /noVNC/docs/links: -------------------------------------------------------------------------------- 1 | New tight PNG protocol: 2 | http://wiki.qemu.org/VNC_Tight_PNG 3 | http://xf.iksaif.net/blog/index.php?post/2010/06/14/QEMU:-Tight-PNG-and-some-profiling 4 | 5 | RFB protocol and extensions: 6 | http://tigervnc.org/cgi-bin/rfbproto 7 | 8 | Canvas Browser Compatibility: 9 | http://philip.html5.org/tests/canvas/suite/tests/results.html 10 | 11 | WebSockets API standard: 12 | http://www.whatwg.org/specs/web-apps/current-work/complete.html#websocket 13 | http://dev.w3.org/html5/websockets/ 14 | http://www.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-00.txt 15 | 16 | Browser Keyboard Events detailed: 17 | http://unixpapa.com/js/key.html 18 | 19 | ActionScript (Flash) WebSocket implementation: 20 | http://github.com/gimite/web-socket-js 21 | 22 | ActionScript (Flash) crypto/TLS library: 23 | http://code.google.com/p/as3crypto 24 | http://github.com/lyokato/as3crypto_patched 25 | 26 | TLS Protocol: 27 | http://en.wikipedia.org/wiki/Transport_Layer_Security 28 | 29 | Generate self-signed certificate: 30 | http://docs.python.org/dev/library/ssl.html#certificates 31 | 32 | Cursor appearance/style (for Cursor pseudo-encoding): 33 | http://en.wikipedia.org/wiki/ICO_(file_format) 34 | http://www.daubnet.com/en/file-format-cur 35 | https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property 36 | http://www.fileformat.info/format/bmp/egff.htm 37 | 38 | Icon/Cursor file format: 39 | http://msdn.microsoft.com/en-us/library/ms997538 40 | http://msdn.microsoft.com/en-us/library/aa921550.aspx 41 | http://msdn.microsoft.com/en-us/library/aa930622.aspx 42 | 43 | 44 | RDP Protocol specification: 45 | http://msdn.microsoft.com/en-us/library/cc240445(v=PROT.10).aspx 46 | 47 | 48 | Related projects: 49 | 50 | guacamole: http://guacamole.sourceforge.net/ 51 | 52 | - Web client, but Java servlet does pre-processing 53 | 54 | jsvnc: http://code.google.com/p/jsvnc/ 55 | 56 | - No releases 57 | 58 | webvnc: http://code.google.com/p/webvnc/ 59 | 60 | - Jetty web server gateway, no updates since April 2008. 61 | 62 | RealVNC Java applet: http://www.realvnc.com/support/javavncviewer.html 63 | 64 | - Java applet 65 | 66 | Flashlight-VNC: http://www.wizhelp.com/flashlight-vnc/ 67 | 68 | - Adobe Flash implementation 69 | 70 | FVNC: http://osflash.org/fvnc 71 | 72 | - Adbove Flash implementation 73 | 74 | CanVNC: http://canvnc.sourceforge.net/ 75 | 76 | - HTML client with REST to VNC python proxy. Mostly vapor. 77 | -------------------------------------------------------------------------------- /noVNC/docs/notes: -------------------------------------------------------------------------------- 1 | Rebuilding inflator.js 2 | 3 | - Download pako from npm 4 | - Install browserify using npm 5 | - browserify core/inflator.mod.js -o core/inflator.js -s Inflator 6 | -------------------------------------------------------------------------------- /noVNC/docs/rfb_notes: -------------------------------------------------------------------------------- 1 | 5.1.1 ProtocolVersion: 12, 12 bytes 2 | 3 | - Sent by server, max supported 4 | 12 ascii - "RFB 003.008\n" 5 | - Response by client, version to use 6 | 12 ascii - "RFB 003.003\n" 7 | 8 | 5.1.2 Authentication: >=4, [16, 4] bytes 9 | 10 | - Sent by server 11 | CARD32 - authentication-scheme 12 | 0 - connection failed 13 | CARD32 - length 14 | length - reason 15 | 1 - no authentication 16 | 17 | 2 - VNC authentication 18 | 16 CARD8 - challenge (random bytes) 19 | 20 | - Response by client (if VNC authentication) 21 | 16 CARD8 - client encrypts the challenge with DES, using user 22 | password as key, sends resulting 16 byte response 23 | 24 | - Response by server (if VNC authentication) 25 | CARD32 - 0 - OK 26 | 1 - failed 27 | 2 - too-many 28 | 29 | 5.1.3 ClientInitialisation: 1 byte 30 | - Sent by client 31 | CARD8 - shared-flag, 0 exclusive, non-zero shared 32 | 33 | 5.1.4 ServerInitialisation: >=24 bytes 34 | - Sent by server 35 | CARD16 - framebuffer-width 36 | CARD16 - framebuffer-height 37 | 16 byte PIXEL_FORMAT - server-pixel-format 38 | CARD8 - bits-per-pixel 39 | CARD8 - depth 40 | CARD8 - big-endian-flag, non-zero is big endian 41 | CARD8 - true-color-flag, non-zero then next 6 apply 42 | CARD16 - red-max 43 | CARD16 - green-max 44 | CARD16 - blue-max 45 | CARD8 - red-shift 46 | CARD8 - green-shift 47 | CARD8 - blue-shift 48 | 3 bytes - padding 49 | CARD32 - name-length 50 | 51 | CARD8[length] - name-string 52 | 53 | 54 | 55 | Client to Server Messages: 56 | 57 | 5.2.1 SetPixelFormat: 20 bytes 58 | CARD8: 0 - message-type 59 | ... 60 | 61 | 5.2.2 FixColourMapEntries: >=6 bytes 62 | CARD8: 1 - message-type 63 | ... 64 | 65 | 5.2.3 SetEncodings: >=8 bytes 66 | CARD8: 2 - message-type 67 | CARD8 - padding 68 | CARD16 - numer-of-encodings 69 | 70 | CARD32 - encoding-type in preference order 71 | 0 - raw 72 | 1 - copy-rectangle 73 | 2 - RRE 74 | 4 - CoRRE 75 | 5 - hextile 76 | 77 | 5.2.4 FramebufferUpdateRequest (10 bytes) 78 | CARD8: 3 - message-type 79 | CARD8 - incremental (0 for full-update, non-zero for incremental) 80 | CARD16 - x-position 81 | CARD16 - y-position 82 | CARD16 - width 83 | CARD16 - height 84 | 85 | 86 | 5.2.5 KeyEvent: 8 bytes 87 | CARD8: 4 - message-type 88 | CARD8 - down-flag 89 | 2 bytes - padding 90 | CARD32 - key (X-Windows keysym values) 91 | 92 | 5.2.6 PointerEvent: 6 bytes 93 | CARD8: 5 - message-type 94 | CARD8 - button-mask 95 | CARD16 - x-position 96 | CARD16 - y-position 97 | 98 | 5.2.7 ClientCutText: >=9 bytes 99 | CARD8: 6 - message-type 100 | ... 101 | 102 | 103 | Server to Client Messages: 104 | 105 | 5.3.1 FramebufferUpdate 106 | CARD8: 0 - message-type 107 | 1 byte - padding 108 | CARD16 - number-of-rectangles 109 | 110 | CARD16 - x-position 111 | CARD16 - y-position 112 | CARD16 - width 113 | CARD16 - height 114 | CARD16 - encoding-type: 115 | 0 - raw 116 | 1 - copy rectangle 117 | 2 - RRE 118 | 4 - CoRRE 119 | 5 - hextile 120 | 121 | raw: 122 | - width x height pixel values 123 | 124 | copy rectangle: 125 | CARD16 - src-x-position 126 | CARD16 - src-y-position 127 | 128 | RRE: 129 | CARD32 - N number-of-subrectangles 130 | Nxd bytes - background-pixel-value (d bits-per-pixel) 131 | 132 | ... 133 | 134 | 5.3.2 SetColourMapEntries (no support) 135 | CARD8: 1 - message-type 136 | ... 137 | 138 | 5.3.3 Bell 139 | CARD8: 2 - message-type 140 | 141 | 5.3.4 ServerCutText 142 | CARD8: 3 - message-type 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /noVNC/docs/rfbproto-3.3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/docs/rfbproto-3.3.pdf -------------------------------------------------------------------------------- /noVNC/docs/rfbproto-3.7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/docs/rfbproto-3.7.pdf -------------------------------------------------------------------------------- /noVNC/docs/rfbproto-3.8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/docs/rfbproto-3.8.pdf -------------------------------------------------------------------------------- /noVNC/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | 3 | module.exports = function(config) { 4 | const customLaunchers = {}; 5 | let browsers = []; 6 | let useSauce = false; 7 | let transpileToES5 = ['internet explorer'].includes(process.env.TEST_BROWSER_NAME); 8 | 9 | // use Sauce when running on Travis 10 | if (process.env.TRAVIS_JOB_NUMBER) { 11 | useSauce = true; 12 | } 13 | 14 | if (useSauce && process.env.TEST_BROWSER_NAME && process.env.TEST_BROWSER_NAME != 'PhantomJS') { 15 | const names = process.env.TEST_BROWSER_NAME.split(','); 16 | const platforms = process.env.TEST_BROWSER_OS.split(','); 17 | const versions = process.env.TEST_BROWSER_VERSION 18 | ? process.env.TEST_BROWSER_VERSION.split(',') 19 | : [null]; 20 | 21 | for (let i = 0; i < names.length; i++) { 22 | for (let j = 0; j < platforms.length; j++) { 23 | for (let k = 0; k < versions.length; k++) { 24 | let launcher_name = 'sl_' + platforms[j].replace(/[^a-zA-Z0-9]/g, '') + '_' + names[i]; 25 | if (versions[k]) { 26 | launcher_name += '_' + versions[k]; 27 | } 28 | 29 | customLaunchers[launcher_name] = { 30 | base: 'SauceLabs', 31 | browserName: names[i], 32 | platform: platforms[j], 33 | }; 34 | 35 | if (versions[i]) { 36 | customLaunchers[launcher_name].version = versions[k]; 37 | } 38 | } 39 | } 40 | } 41 | 42 | browsers = Object.keys(customLaunchers); 43 | } else { 44 | useSauce = false; 45 | //browsers = ['PhantomJS']; 46 | browsers = []; 47 | } 48 | 49 | const my_conf = { 50 | 51 | // base path that will be used to resolve all patterns (eg. files, exclude) 52 | basePath: '', 53 | 54 | // frameworks to use 55 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 56 | frameworks: ['requirejs', 'mocha', 'chai'], 57 | 58 | // list of files / patterns to load in the browser (loaded in order) 59 | files: [ 60 | { pattern: 'vendor/sinon.js', included: false }, 61 | { pattern: 'node_modules/sinon-chai/lib/sinon-chai.js', included: false }, 62 | { pattern: 'app/localization.js', included: false }, 63 | { pattern: 'app/webutil.js', included: false }, 64 | { pattern: 'core/**/*.js', included: false }, 65 | { pattern: 'vendor/pako/**/*.js', included: false }, 66 | { pattern: 'tests/test.*.js', included: false }, 67 | { pattern: 'tests/fake.*.js', included: false }, 68 | { pattern: 'tests/assertions.js', included: false }, 69 | 'tests/karma-test-main.js', 70 | ], 71 | 72 | client: { 73 | mocha: { 74 | // replace Karma debug page with mocha display 75 | 'reporter': 'html', 76 | 'ui': 'bdd' 77 | } 78 | }, 79 | 80 | // list of files to exclude 81 | exclude: [ 82 | ], 83 | 84 | customLaunchers: customLaunchers, 85 | 86 | // start these browsers 87 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 88 | browsers: browsers, 89 | 90 | // preprocess matching files before serving them to the browser 91 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 92 | preprocessors: { 93 | 'app/localization.js': ['babel'], 94 | 'app/webutil.js': ['babel'], 95 | 'core/**/*.js': ['babel'], 96 | 'tests/test.*.js': ['babel'], 97 | 'tests/fake.*.js': ['babel'], 98 | 'tests/assertions.js': ['babel'], 99 | 'vendor/pako/**/*.js': ['babel'], 100 | }, 101 | 102 | babelPreprocessor: { 103 | options: { 104 | presets: transpileToES5 ? ['es2015'] : [], 105 | plugins: ['transform-es2015-modules-amd', 'syntax-dynamic-import'], 106 | sourceMap: 'inline', 107 | }, 108 | }, 109 | 110 | // test results reporter to use 111 | // possible values: 'dots', 'progress' 112 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 113 | reporters: ['mocha'], 114 | 115 | 116 | // web server port 117 | port: 9876, 118 | 119 | 120 | // enable / disable colors in the output (reporters and logs) 121 | colors: true, 122 | 123 | 124 | // level of logging 125 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 126 | logLevel: config.LOG_INFO, 127 | 128 | 129 | // enable / disable watching file and executing tests whenever any file changes 130 | autoWatch: false, 131 | 132 | // Continuous Integration mode 133 | // if true, Karma captures browsers, runs the tests and exits 134 | singleRun: true, 135 | 136 | // Increase timeout in case connection is slow/we run more browsers than possible 137 | // (we currently get 3 for free, and we try to run 7, so it can take a while) 138 | captureTimeout: 240000, 139 | 140 | // similarly to above 141 | browserNoActivityTimeout: 100000, 142 | }; 143 | 144 | if (useSauce) { 145 | my_conf.reporters.push('saucelabs'); 146 | my_conf.captureTimeout = 0; // use SL timeout 147 | my_conf.sauceLabs = { 148 | testName: 'noVNC Tests (all)', 149 | startConnect: false, 150 | tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER 151 | }; 152 | } 153 | 154 | config.set(my_conf); 155 | }; 156 | -------------------------------------------------------------------------------- /noVNC/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@novnc/novnc", 3 | "version": "1.0.0", 4 | "description": "An HTML5 VNC client", 5 | "directories": { 6 | "doc": "docs", 7 | "test": "tests" 8 | }, 9 | "scripts": { 10 | "lint": "eslint app core po tests utils", 11 | "test": "karma start karma.conf.js", 12 | "prepare": "node ./utils/use_require.js --as commonjs --clean" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/novnc/noVNC.git" 17 | }, 18 | "author": "Joel Martin (https://github.com/kanaka)", 19 | "contributors": [ 20 | "Solly Ross (https://github.com/directxman12)", 21 | "Peter Åstrand (https://github.com/astrand)", 22 | "Samuel Mannehed (https://github.com/samhed)", 23 | "Pierre Ossman (https://github.com/CendioOssman)" 24 | ], 25 | "license": "MPL-2.0", 26 | "bugs": { 27 | "url": "https://github.com/novnc/noVNC/issues" 28 | }, 29 | "homepage": "https://github.com/novnc/noVNC", 30 | "devDependencies": { 31 | "babel-core": "^6.22.1", 32 | "babel-plugin-add-module-exports": "^0.2.1", 33 | "babel-plugin-import-redirect": "*", 34 | "babel-plugin-syntax-dynamic-import": "^6.18.0", 35 | "babel-plugin-transform-es2015-modules-amd": "^6.22.0", 36 | "babel-plugin-transform-es2015-modules-commonjs": "^6.18.0", 37 | "babel-plugin-transform-es2015-modules-systemjs": "^6.22.0", 38 | "babel-plugin-transform-es2015-modules-umd": "^6.22.0", 39 | "babel-preset-es2015": "^6.24.1", 40 | "babelify": "^7.3.0", 41 | "browserify": "^13.1.0", 42 | "chai": "^3.5.0", 43 | "commander": "^2.9.0", 44 | "es-module-loader": "^2.1.0", 45 | "eslint": "^4.16.0", 46 | "fs-extra": "^1.0.0", 47 | "jsdom": "*", 48 | "karma": "^1.3.0", 49 | "karma-babel-preprocessor": "^6.0.1", 50 | "karma-chai": "^0.1.0", 51 | "karma-mocha": "^1.3.0", 52 | "karma-mocha-reporter": "^2.2.0", 53 | "karma-requirejs": "^1.1.0", 54 | "karma-sauce-launcher": "^1.0.0", 55 | "mocha": "^3.1.2", 56 | "node-getopt": "*", 57 | "po2json": "*", 58 | "requirejs": "^2.3.2", 59 | "rollup": "^0.41.4", 60 | "rollup-plugin-node-resolve": "^2.0.0", 61 | "sinon-chai": "^2.8.0" 62 | }, 63 | "dependencies": {}, 64 | "keywords": [ 65 | "vnc", 66 | "rfb", 67 | "novnc", 68 | "websockify" 69 | ] 70 | } 71 | -------------------------------------------------------------------------------- /noVNC/tests/assertions.js: -------------------------------------------------------------------------------- 1 | // Assertions that make it easier to use sinon 2 | import sinonChai from '../node_modules/sinon-chai/lib/sinon-chai.js'; 3 | chai.use(sinonChai); 4 | 5 | // noVNC specific assertions 6 | chai.use(function (_chai, utils) { 7 | _chai.Assertion.addMethod('displayed', function (target_data) { 8 | const obj = this._obj; 9 | const ctx = obj._target.getContext('2d'); 10 | const data_cl = ctx.getImageData(0, 0, obj._target.width, obj._target.height).data; 11 | // NB(directxman12): PhantomJS 1.x doesn't implement Uint8ClampedArray, so work around that 12 | const data = new Uint8Array(data_cl); 13 | const len = data_cl.length; 14 | new chai.Assertion(len).to.be.equal(target_data.length, "unexpected display size"); 15 | let same = true; 16 | for (let i = 0; i < len; i++) { 17 | if (data[i] != target_data[i]) { 18 | same = false; 19 | break; 20 | } 21 | } 22 | if (!same) { 23 | // eslint-disable-next-line no-console 24 | console.log("expected data: %o, actual data: %o", target_data, data); 25 | } 26 | this.assert(same, 27 | "expected #{this} to have displayed the image #{exp}, but instead it displayed #{act}", 28 | "expected #{this} not to have displayed the image #{act}", 29 | target_data, 30 | data); 31 | }); 32 | 33 | _chai.Assertion.addMethod('sent', function (target_data) { 34 | const obj = this._obj; 35 | obj.inspect = function () { 36 | const res = { _websocket: obj._websocket, rQi: obj._rQi, _rQ: new Uint8Array(obj._rQ.buffer, 0, obj._rQlen), 37 | _sQ: new Uint8Array(obj._sQ.buffer, 0, obj._sQlen) }; 38 | res.prototype = obj; 39 | return res; 40 | }; 41 | const data = obj._websocket._get_sent_data(); 42 | let same = true; 43 | if (data.length != target_data.length) { 44 | same = false; 45 | } else { 46 | for (let i = 0; i < data.length; i++) { 47 | if (data[i] != target_data[i]) { 48 | same = false; 49 | break; 50 | } 51 | } 52 | } 53 | if (!same) { 54 | // eslint-disable-next-line no-console 55 | console.log("expected data: %o, actual data: %o", target_data, data); 56 | } 57 | this.assert(same, 58 | "expected #{this} to have sent the data #{exp}, but it actually sent #{act}", 59 | "expected #{this} not to have sent the data #{act}", 60 | Array.prototype.slice.call(target_data), 61 | Array.prototype.slice.call(data)); 62 | }); 63 | 64 | _chai.Assertion.addProperty('array', function () { 65 | utils.flag(this, 'array', true); 66 | }); 67 | 68 | _chai.Assertion.overwriteMethod('equal', function (_super) { 69 | return function assertArrayEqual(target) { 70 | if (utils.flag(this, 'array')) { 71 | const obj = this._obj; 72 | 73 | let same = true; 74 | 75 | if (utils.flag(this, 'deep')) { 76 | for (let i = 0; i < obj.length; i++) { 77 | if (!utils.eql(obj[i], target[i])) { 78 | same = false; 79 | break; 80 | } 81 | } 82 | 83 | this.assert(same, 84 | "expected #{this} to have elements deeply equal to #{exp}", 85 | "expected #{this} not to have elements deeply equal to #{exp}", 86 | Array.prototype.slice.call(target)); 87 | } else { 88 | for (let i = 0; i < obj.length; i++) { 89 | if (obj[i] != target[i]) { 90 | same = false; 91 | break; 92 | } 93 | } 94 | 95 | this.assert(same, 96 | "expected #{this} to have elements equal to #{exp}", 97 | "expected #{this} not to have elements equal to #{exp}", 98 | Array.prototype.slice.call(target)); 99 | } 100 | } else { 101 | _super.apply(this, arguments); 102 | } 103 | }; 104 | }); 105 | }); 106 | -------------------------------------------------------------------------------- /noVNC/tests/fake.websocket.js: -------------------------------------------------------------------------------- 1 | import Base64 from '../core/base64.js'; 2 | 3 | // PhantomJS can't create Event objects directly, so we need to use this 4 | function make_event(name, props) { 5 | const evt = document.createEvent('Event'); 6 | evt.initEvent(name, true, true); 7 | if (props) { 8 | for (let prop in props) { 9 | evt[prop] = props[prop]; 10 | } 11 | } 12 | return evt; 13 | } 14 | 15 | export default function FakeWebSocket (uri, protocols) { 16 | this.url = uri; 17 | this.binaryType = "arraybuffer"; 18 | this.extensions = ""; 19 | 20 | if (!protocols || typeof protocols === 'string') { 21 | this.protocol = protocols; 22 | } else { 23 | this.protocol = protocols[0]; 24 | } 25 | 26 | this._send_queue = new Uint8Array(20000); 27 | 28 | this.readyState = FakeWebSocket.CONNECTING; 29 | this.bufferedAmount = 0; 30 | 31 | this.__is_fake = true; 32 | } 33 | 34 | FakeWebSocket.prototype = { 35 | close: function (code, reason) { 36 | this.readyState = FakeWebSocket.CLOSED; 37 | if (this.onclose) { 38 | this.onclose(make_event("close", { 'code': code, 'reason': reason, 'wasClean': true })); 39 | } 40 | }, 41 | 42 | send: function (data) { 43 | if (this.protocol == 'base64') { 44 | data = Base64.decode(data); 45 | } else { 46 | data = new Uint8Array(data); 47 | } 48 | this._send_queue.set(data, this.bufferedAmount); 49 | this.bufferedAmount += data.length; 50 | }, 51 | 52 | _get_sent_data: function () { 53 | const res = new Uint8Array(this._send_queue.buffer, 0, this.bufferedAmount); 54 | this.bufferedAmount = 0; 55 | return res; 56 | }, 57 | 58 | _open: function (data) { 59 | this.readyState = FakeWebSocket.OPEN; 60 | if (this.onopen) { 61 | this.onopen(make_event('open')); 62 | } 63 | }, 64 | 65 | _receive_data: function (data) { 66 | this.onmessage(make_event("message", { 'data': data })); 67 | } 68 | }; 69 | 70 | FakeWebSocket.OPEN = WebSocket.OPEN; 71 | FakeWebSocket.CONNECTING = WebSocket.CONNECTING; 72 | FakeWebSocket.CLOSING = WebSocket.CLOSING; 73 | FakeWebSocket.CLOSED = WebSocket.CLOSED; 74 | 75 | FakeWebSocket.__is_fake = true; 76 | 77 | FakeWebSocket.replace = function () { 78 | if (!WebSocket.__is_fake) { 79 | const real_version = WebSocket; 80 | // eslint-disable-next-line no-global-assign 81 | WebSocket = FakeWebSocket; 82 | FakeWebSocket.__real_version = real_version; 83 | } 84 | }; 85 | 86 | FakeWebSocket.restore = function () { 87 | if (WebSocket.__is_fake) { 88 | // eslint-disable-next-line no-global-assign 89 | WebSocket = WebSocket.__real_version; 90 | } 91 | }; 92 | -------------------------------------------------------------------------------- /noVNC/tests/test.base64.js: -------------------------------------------------------------------------------- 1 | const expect = chai.expect; 2 | 3 | import Base64 from '../core/base64.js'; 4 | 5 | describe('Base64 Tools', function() { 6 | "use strict"; 7 | 8 | const BIN_ARR = new Array(256); 9 | for (let i = 0; i < 256; i++) { 10 | BIN_ARR[i] = i; 11 | } 12 | 13 | const B64_STR = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="; 14 | 15 | 16 | describe('encode', function() { 17 | it('should encode a binary string into Base64', function() { 18 | const encoded = Base64.encode(BIN_ARR); 19 | expect(encoded).to.equal(B64_STR); 20 | }); 21 | }); 22 | 23 | describe('decode', function() { 24 | it('should decode a Base64 string into a normal string', function() { 25 | const decoded = Base64.decode(B64_STR); 26 | expect(decoded).to.deep.equal(BIN_ARR); 27 | }); 28 | 29 | it('should throw an error if we have extra characters at the end of the string', function() { 30 | expect(function () { Base64.decode(B64_STR+'abcdef'); }).to.throw(Error); 31 | }); 32 | }); 33 | }); 34 | -------------------------------------------------------------------------------- /noVNC/tests/test.util.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const expect = chai.expect; 3 | 4 | import * as Log from '../core/util/logging.js'; 5 | 6 | import sinon from '../vendor/sinon.js'; 7 | 8 | describe('Utils', function() { 9 | "use strict"; 10 | 11 | describe('logging functions', function () { 12 | beforeEach(function () { 13 | sinon.spy(console, 'log'); 14 | sinon.spy(console, 'debug'); 15 | sinon.spy(console, 'warn'); 16 | sinon.spy(console, 'error'); 17 | sinon.spy(console, 'info'); 18 | }); 19 | 20 | afterEach(function () { 21 | console.log.restore(); 22 | console.debug.restore(); 23 | console.warn.restore(); 24 | console.error.restore(); 25 | console.info.restore(); 26 | Log.init_logging(); 27 | }); 28 | 29 | it('should use noop for levels lower than the min level', function () { 30 | Log.init_logging('warn'); 31 | Log.Debug('hi'); 32 | Log.Info('hello'); 33 | expect(console.log).to.not.have.been.called; 34 | }); 35 | 36 | it('should use console.debug for Debug', function () { 37 | Log.init_logging('debug'); 38 | Log.Debug('dbg'); 39 | expect(console.debug).to.have.been.calledWith('dbg'); 40 | }); 41 | 42 | it('should use console.info for Info', function () { 43 | Log.init_logging('debug'); 44 | Log.Info('inf'); 45 | expect(console.info).to.have.been.calledWith('inf'); 46 | }); 47 | 48 | it('should use console.warn for Warn', function () { 49 | Log.init_logging('warn'); 50 | Log.Warn('wrn'); 51 | expect(console.warn).to.have.been.called; 52 | expect(console.warn).to.have.been.calledWith('wrn'); 53 | }); 54 | 55 | it('should use console.error for Error', function () { 56 | Log.init_logging('error'); 57 | Log.Error('err'); 58 | expect(console.error).to.have.been.called; 59 | expect(console.error).to.have.been.calledWith('err'); 60 | }); 61 | }); 62 | 63 | // TODO(directxman12): test the conf_default and conf_defaults methods 64 | // TODO(directxman12): test decodeUTF8 65 | // TODO(directxman12): test the event methods (addEvent, removeEvent, stopEvent) 66 | // TODO(directxman12): figure out a good way to test getPosition and getEventPosition 67 | // TODO(directxman12): figure out how to test the browser detection functions properly 68 | // (we can't really test them against the browsers, except for Gecko 69 | // via PhantomJS, the default test driver) 70 | }); 71 | /* eslint-enable no-console */ 72 | -------------------------------------------------------------------------------- /noVNC/tests/vnc_playback.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | VNC Playback 5 | 6 | 7 | 8 | 9 | 10 | Iterations:   11 | Perftest:  12 | Realtime:   13 | 14 |   15 | 16 |

17 | 18 | Results:
19 | 20 | 21 |

22 | 23 |
24 |
25 | 26 | 27 |
Loading
28 |
29 |
30 | 31 | 32 | 33 | 37 | 38 |