mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	 4cd2176155
			
		
	
	
		4cd2176155
		
			
		
	
	
	
	
		
			
			This patch introduces hidden commands to control container lifecycle: - `npx playwright docker install-server-deps` to install fluxbox, vnc, novnc & to configure them. - `npx playwright docker run-server` to run a server inside the container. Drive-by: remove old version of container image when building a new version with the same name. This way we won't pile up untagged container images.
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| export NOVNC_REF='1.3.0'
 | |
| export WEBSOCKIFY_REF='0.10.0'
 | |
| export DEBIAN_FRONTEND=noninteractive
 | |
| 
 | |
| # Install FluxBox, VNC & noVNC
 | |
| mkdir -p /opt/bin && chmod +x /dev/shm \
 | |
|     && apt-get update && apt-get install -y unzip fluxbox x11vnc \
 | |
|     && curl -L -o noVNC.zip "https://github.com/novnc/noVNC/archive/v${NOVNC_REF}.zip" \
 | |
|     && unzip -x noVNC.zip \
 | |
|     && rm -rf noVNC-${NOVNC_REF}/{docs,tests} \
 | |
|     && mv noVNC-${NOVNC_REF} /opt/bin/noVNC \
 | |
|     && cp /opt/bin/noVNC/vnc.html /opt/bin/noVNC/index.html \
 | |
|     && rm noVNC.zip \
 | |
|     && curl -L -o websockify.zip "https://github.com/novnc/websockify/archive/v${WEBSOCKIFY_REF}.zip" \
 | |
|     && unzip -x websockify.zip \
 | |
|     && rm websockify.zip \
 | |
|     && rm -rf websockify-${WEBSOCKIFY_REF}/{docs,tests} \
 | |
|     && mv websockify-${WEBSOCKIFY_REF} /opt/bin/noVNC/utils/websockify
 | |
| 
 | |
| # Patch noVNC
 | |
| 
 | |
| cat <<'EOF' > /opt/bin/noVNC/clip.patch
 | |
| diff --git a/app/ui.js b/app/ui.js
 | |
| index cb6a9fd..dbe42e0 100644
 | |
| --- a/app/ui.js
 | |
| +++ b/app/ui.js
 | |
| @@ -951,6 +951,7 @@ const UI = {
 | |
|      clipboardReceive(e) {
 | |
|          Log.Debug(">> UI.clipboardReceive: " + e.detail.text.substr(0, 40) + "...");
 | |
|          document.getElementById('noVNC_clipboard_text').value = e.detail.text;
 | |
| +        navigator.clipboard.writeText(e.detail.text).catch(() => {});
 | |
|          Log.Debug("<< UI.clipboardReceive");
 | |
|      },
 | |
|  
 | |
| diff --git a/core/rfb.js b/core/rfb.js
 | |
| index ea3bf58..fad57bc 100644
 | |
| --- a/core/rfb.js
 | |
| +++ b/core/rfb.js
 | |
| @@ -176,6 +176,7 @@ export default class RFB extends EventTargetMixin {
 | |
|              handleMouse: this._handleMouse.bind(this),
 | |
|              handleWheel: this._handleWheel.bind(this),
 | |
|              handleGesture: this._handleGesture.bind(this),
 | |
| +            handleFocus: () => navigator.clipboard.readText().then(this.clipboardPasteFrom.bind(this)).catch(() => {})
 | |
|          };
 | |
|  
 | |
|          // main setup
 | |
| @@ -515,6 +516,7 @@ export default class RFB extends EventTargetMixin {
 | |
|          this._canvas.addEventListener("gesturestart", this._eventHandlers.handleGesture);
 | |
|          this._canvas.addEventListener("gesturemove", this._eventHandlers.handleGesture);
 | |
|          this._canvas.addEventListener("gestureend", this._eventHandlers.handleGesture);
 | |
| +        window.addEventListener('focus', this._eventHandlers.handleFocus);
 | |
|  
 | |
|          Log.Debug("<< RFB.connect");
 | |
|      }
 | |
| @@ -522,6 +524,7 @@ export default class RFB extends EventTargetMixin {
 | |
|      _disconnect() {
 | |
|          Log.Debug(">> RFB.disconnect");
 | |
|          this._cursor.detach();
 | |
| +        window.removeEventListener('focus', this._eventHandlers.handleFocus);
 | |
|          this._canvas.removeEventListener("gesturestart", this._eventHandlers.handleGesture);
 | |
|          this._canvas.removeEventListener("gesturemove", this._eventHandlers.handleGesture);
 | |
|          this._canvas.removeEventListener("gestureend", this._eventHandlers.handleGesture);
 | |
| EOF
 | |
| 
 | |
| cd /opt/bin/noVNC
 | |
| git apply clip.patch
 | |
| 
 | |
| # Configure FluxBox menus
 | |
| mkdir /root/.fluxbox
 | |
| cd /ms-playwright-agent
 | |
| cat <<'EOF' | node > /root/.fluxbox/menu
 | |
|   const { chromium, firefox, webkit } = require('playwright-core');
 | |
| 
 | |
|   console.log(`
 | |
|     [begin] (fluxbox)
 | |
|       [submenu] (Browsers) {}
 | |
|         [exec] (Chromium) { ${chromium.executablePath()} --no-sandbox --test-type= } <>
 | |
|         [exec] (Firefox) { ${firefox.executablePath()} } <>
 | |
|         [exec] (WebKit) { ${webkit.executablePath()} } <>
 | |
|       [end]
 | |
|       [include] (/etc/X11/fluxbox/fluxbox-menu)
 | |
|     [end]
 | |
|   `);
 | |
| EOF
 | |
| 
 | |
| cat <<'EOF' > /root/.fluxbox/lastwallpaper
 | |
| $center $full|/ms-playwright-agent/node_modules/playwright-core/lib/server/chromium/appIcon.png||:99
 | |
| $center $full|/ms-playwright-agent/node_modules/playwright-core/lib/server/chromium/appIcon.png||:99.0
 | |
| EOF
 | |
| 
 |