diff --git a/examples/amp-fresh.amp.html b/examples/amp-fresh.amp.html index 4566f502e97a..1f5578fbc937 100644 --- a/examples/amp-fresh.amp.html +++ b/examples/amp-fresh.amp.html @@ -11,7 +11,7 @@ - + diff --git a/examples/article-fixed-header.amp.html b/examples/article-fixed-header.amp.html index e3116448af1a..d68679d1a2f9 100644 --- a/examples/article-fixed-header.amp.html +++ b/examples/article-fixed-header.amp.html @@ -238,7 +238,7 @@ - + diff --git a/examples/article.amp.html b/examples/article.amp.html index 30d1c8c532aa..0e2a1e175820 100644 --- a/examples/article.amp.html +++ b/examples/article.amp.html @@ -219,7 +219,7 @@ - + diff --git a/extensions/amp-app-banner/0.1/amp-app-banner.js b/extensions/amp-app-banner/0.1/amp-app-banner.js index 8b09484a6614..3194912d8442 100644 --- a/extensions/amp-app-banner/0.1/amp-app-banner.js +++ b/extensions/amp-app-banner/0.1/amp-app-banner.js @@ -339,7 +339,7 @@ export class AmpAndroidAppBanner extends AbstractAppBanner { const viewer = viewerForDoc(this.getAmpDoc()); this.manifestLink_ = this.win.document.head.querySelector( - 'link[rel=manifest],link[rel=amp-manifest]'); + 'link[rel=manifest],link[rel=origin-manifest]'); const platform = platformFor(this.win); // We want to fallback to browser builtin mechanism when possible. diff --git a/extensions/amp-app-banner/0.1/test/test-amp-app-banner.js b/extensions/amp-app-banner/0.1/test/test-amp-app-banner.js index a055cdf26b30..7d8572c8e63f 100644 --- a/extensions/amp-app-banner/0.1/test/test-amp-app-banner.js +++ b/extensions/amp-app-banner/0.1/test/test-amp-app-banner.js @@ -97,13 +97,15 @@ describe('amp-app-banner', () => { iframe.doc.head.appendChild(meta); } - if (config.manifest) { + const manifestObj = config.originManifest || config.manifest; + if (manifestObj) { + const rel = config.originManifest ? 'origin-manifest' : 'manifest'; const manifest = iframe.doc.createElement('link'); - manifest.setAttribute('rel', 'amp-manifest'); - manifest.setAttribute('href', config.manifest.href); + manifest.setAttribute('rel', rel); + manifest.setAttribute('href', manifestObj.href); iframe.doc.head.appendChild(manifest); sandbox.mock(xhrFor(iframe.win)).expects('fetchJson') - .returns(Promise.resolve(config.manifest.content)); + .returns(Promise.resolve(manifestObj.content)); } const banner = iframe.doc.createElement('amp-app-banner'); @@ -153,6 +155,42 @@ describe('amp-app-banner', () => { }); } + function testManifestPreconnectPreload(rel) { + const config = {}; + config[rel] = manifest; + return () => { + return getAppBanner(config).then(banner => { + const impl = banner.implementation_; + sandbox.stub(impl.preconnect, 'url'); + sandbox.stub(impl.preconnect, 'preload'); + impl.preconnectCallback(true); + expect(impl.preconnect.url.called).to.be.true; + expect(impl.preconnect.url.callCount).to.equal(1); + expect(impl.preconnect.url.calledWith('https://play.google.com')) + .to.be.true; + expect(impl.preconnect.preload.called).to.be.true; + expect(impl.preconnect.preload.callCount).to.equal(1); + expect(impl.preconnect.preload.calledWith( + 'https://example.com/manifest.json')).to.be.true; + }); + }; + } + + function testManifestParseAndHrefs(rel) { + const config = {}; + config[rel] = manifest; + return () => { + sandbox.spy(AbstractAppBanner.prototype, 'setupOpenButton_'); + return getAppBanner({manifest}).then(el => { + expect(AbstractAppBanner.prototype.setupOpenButton_.calledWith( + el.querySelector('button[open-button]'), + 'android-app://com.medium.reader/https/example.com/amps.html', + 'https://play.google.com/store/apps/details?id=com.medium.reader' + )).to.be.true; + }); + }; + } + beforeEach(() => { sandbox = sinon.sandbox.create(); platform = platformFor(window); @@ -261,22 +299,10 @@ describe('amp-app-banner', () => { isChrome = false; }); - it('should preconnect to play store and preload manifest', () => { - return getAppBanner({manifest}).then(banner => { - const impl = banner.implementation_; - sandbox.stub(impl.preconnect, 'url'); - sandbox.stub(impl.preconnect, 'preload'); - impl.preconnectCallback(true); - expect(impl.preconnect.url.called).to.be.true; - expect(impl.preconnect.url.callCount).to.equal(1); - expect(impl.preconnect.url.calledWith('https://play.google.com')) - .to.be.true; - expect(impl.preconnect.preload.called).to.be.true; - expect(impl.preconnect.preload.callCount).to.equal(1); - expect(impl.preconnect.preload.calledWith( - 'https://example.com/manifest.json')).to.be.true; - }); - }); + it('should preconnect to play store and preload manifest', + testManifestPreconnectPreload('manifest')); + it('should preconnect to play store and preload origin-manifest', + testManifestPreconnectPreload('originManifest')); it('should throw if open button is missing', testButtonMissing); it('should add dismiss button and update padding', testAddDismissButton); @@ -288,6 +314,12 @@ describe('amp-app-banner', () => { }); }); + it('should remove banner if origin-manifest is not provided', () => { + return getAppBanner({originManifest: null}).then(banner => { + expect(banner.parentElement).to.be.null; + }); + }); + it('should remove banner if chrome', () => { isChrome = true; return getAppBanner().then(banner => { @@ -295,16 +327,10 @@ describe('amp-app-banner', () => { }); }); - it('should parse manifest and set hrefs', () => { - sandbox.spy(AbstractAppBanner.prototype, 'setupOpenButton_'); - return getAppBanner({manifest}).then(el => { - expect(AbstractAppBanner.prototype.setupOpenButton_.calledWith( - el.querySelector('button[open-button]'), - 'android-app://com.medium.reader/https/example.com/amps.html', - 'https://play.google.com/store/apps/details?id=com.medium.reader' - )).to.be.true; - }); - }); + it('should parse manifest and set hrefs', + testManifestParseAndHrefs('manifest')); + it('should parse manifest and set hrefs', + testManifestParseAndHrefs('originManifest')); }); describe('Abstract App Banner', () => { diff --git a/extensions/amp-app-banner/amp-app-banner.md b/extensions/amp-app-banner/amp-app-banner.md index e0c4301dd5a6..6093b757869e 100644 --- a/extensions/amp-app-banner/amp-app-banner.md +++ b/extensions/amp-app-banner/amp-app-banner.md @@ -171,7 +171,7 @@ Not permitted: **disabled** - + . . .