From cc2a321f2570319d23dd2beffcd30ad6222e983e Mon Sep 17 00:00:00 2001 From: Prateek Bhatnagar Date: Mon, 24 Dec 2018 18:54:13 +0530 Subject: [PATCH] Amp install sw custom scope (#19915) * fixing method call for esm build * custom scope for amp-install-sw --- .../0.1/amp-install-serviceworker.js | 5 ++- .../test/test-amp-install-serviceworker.js | 45 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/extensions/amp-install-serviceworker/0.1/amp-install-serviceworker.js b/extensions/amp-install-serviceworker/0.1/amp-install-serviceworker.js index 7aac2b2b30e5f..b9bfeb3f7ba0b 100644 --- a/extensions/amp-install-serviceworker/0.1/amp-install-serviceworker.js +++ b/extensions/amp-install-serviceworker/0.1/amp-install-serviceworker.js @@ -297,7 +297,10 @@ class UrlRewriter_ { * @return {!Promise} */ function install(win, src, element) { - return win.navigator.serviceWorker.register(src).then(function(registration) { + const scope = element.getAttribute('data-scope') || '/'; + return win.navigator.serviceWorker.register(src, { + scope, + }).then(function(registration) { if (getMode().development) { user().info(TAG, 'ServiceWorker registration successful with scope: ', registration.scope); diff --git a/extensions/amp-install-serviceworker/0.1/test/test-amp-install-serviceworker.js b/extensions/amp-install-serviceworker/0.1/test/test-amp-install-serviceworker.js index 207aa73217e9d..2883e59e489d9 100644 --- a/extensions/amp-install-serviceworker/0.1/test/test-amp-install-serviceworker.js +++ b/extensions/amp-install-serviceworker/0.1/test/test-amp-install-serviceworker.js @@ -84,8 +84,51 @@ describes.realWin('amp-install-serviceworker', { }, navigator: { serviceWorker: { - register: src => { + register: (src, options) => { + expect(calledSrc).to.be.undefined; + expect(options.scope).to.be.equal('/'); + calledSrc = src; + return p; + }, + }, + }, + }; + whenVisible = Promise.resolve(); + registerServiceBuilder(implementation.win, 'viewer', function() { + return { + whenFirstVisible: () => whenVisible, + isVisible: () => true, + }; + }); + implementation.buildCallback(); + expect(calledSrc).to.be.undefined; + return Promise.all([whenVisible, loadPromise(implementation.win)]).then( + () => { + expect(calledSrc).to.equal('https://example.com/sw.js'); + // Should not be called before `register` resolves. + expect(maybeInstallUrlRewriteStub).to.not.be.called; + }); + }); + + it('should install for custom scope', () => { + const install = doc.createElement('div'); + container.appendChild(install); + install.getAmpDoc = () => ampdoc; + install.setAttribute('src', 'https://example.com/sw.js'); + install.setAttribute('data-scope', '/profile'); + const implementation = new AmpInstallServiceWorker(install); + let calledSrc; + const p = new Promise(() => {}); + implementation.win = { + complete: true, + location: { + href: 'https://example.com/some/path', + }, + navigator: { + serviceWorker: { + register: (src, options) => { expect(calledSrc).to.be.undefined; + expect(options.scope).to.be.equal('/profile'); calledSrc = src; return p; },