From 355b5692ff64a3604ddad9ea4a8076f6fb9545cd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 14:36:48 -0700 Subject: [PATCH] Add version check to service worker Try to make sure our page is talking to the expected version of the service worker --- .../contrib/webview/browser/pre/index.html | 99 ++++++++++++++----- .../contrib/webview/browser/pre/main.js | 28 +----- .../webview/browser/pre/service-worker.js | 16 ++- 3 files changed, 94 insertions(+), 49 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 9727c148c3f..4128a65be4a 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -16,38 +16,91 @@ - + + \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index caef053b16f..c30f0c79592 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -99,7 +99,8 @@ * postMessage: (channel: string, data?: any) => void, * onMessage: (channel: string, handler: any) => void, * injectHtml?: (document: HTMLDocument) => void, - * focusIframeOnCreate?: boolean + * focusIframeOnCreate?: boolean, + * ready?: Promise * }} HostCommunications */ @@ -120,29 +121,6 @@ // Service worker for resource loading const FAKE_LOAD = !!navigator.serviceWorker; - const workerReady = new Promise(resolve => { - if (!navigator.serviceWorker) { - resolve(); - } - navigator.serviceWorker.register('service-worker.js').finally(resolve); - - function forwardFromHostToWorker(channel) { - host.onMessage(channel, event => { - navigator.serviceWorker.ready.then(registration => { - registration.active.postMessage({ channel: channel, data: event.data.args }); - }); - }); - } - forwardFromHostToWorker('did-load-resource'); - forwardFromHostToWorker('did-load-localhost'); - - navigator.serviceWorker.addEventListener('message', event => { - if (['load-resource', 'load-localhost'].includes(event.data.channel)) { - host.postMessage(event.data.channel, event.data); - } - }); - }); - /** * @param {HTMLDocument?} document * @param {HTMLElement?} body @@ -269,7 +247,7 @@ let updateId = 0; host.onMessage('content', async (_event, data) => { const currentUpdateId = ++updateId; - await workerReady; + await host.ready; if (currentUpdateId !== updateId) { return; } diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index 09157ea5121..7e200dc4e98 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -2,6 +2,8 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +const VERSION = 1; + /** * Root path for resources */ @@ -106,8 +108,20 @@ const notFoundResponse = new Response('Not Found', { status: 404, }); -self.addEventListener('message', (event) => { +self.addEventListener('message', async (event) => { switch (event.data.channel) { + case 'version': + { + self.clients.get(event.source.id).then(client => { + if (client) { + client.postMessage({ + channel: 'version', + version: VERSION + }); + } + }); + return; + } case 'did-load-resource': { const webviewId = getWebviewIdForClient(event.source); -- GitLab