1<!-- 2@license 3Copyright (c) 2015 The Polymer Project Authors. All rights reserved. 4This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7Code distributed by Google as part of the polymer project is also 8subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9--> 10 11<!DOCTYPE html> 12<html> 13 <head> 14 <meta charset="utf-8"> 15 <title></title> 16 <script src="../../webcomponentsjs/webcomponents.js"></script> 17 <script src="../../web-component-tester/browser.js"></script> 18 <script src="../../test-fixture/test-fixture-mocha.js"></script> 19 20 <link rel="import" href="../../polymer/polymer.html"> 21 <link rel="import" href="../../promise-polyfill/promise-polyfill.html"> 22 <link rel="import" href="../../test-fixture/test-fixture.html"> 23 <link rel="import" href="../iron-location.html"> 24 </head> 25 26 <body> 27 <script> 28 'use strict'; 29 30 function getIframe() { 31 return new Promise(function(resolve, reject) { 32 var iframe = document.createElement('iframe'); 33 var result = getMessageMatching(iframe, function(message) { 34 return message.type === 'ready'; 35 }); 36 iframe.src = './initialization-iframe.html'; 37 document.body.appendChild(iframe); 38 iframe.addEventListener('error', reject); 39 result.then(function() {resolve(iframe)}, reject); 40 }); 41 } 42 43 function onMessage(iframe, callback) { 44 var f = function(event) { 45 if (event.source === iframe.contentWindow) { 46 callback(event.data); 47 } 48 }; 49 window.addEventListener('message', f, false); 50 return function() { 51 window.removeEventListener('message', f); 52 } 53 } 54 55 function getMessageMatching(iframe, predicate) { 56 var revoke = function() {}; 57 var result = new Promise(function(resolve, reject) { 58 revoke = onMessage(iframe, function(message) { 59 if (predicate(message)) { 60 resolve(message); 61 } 62 }); 63 }); 64 result.then(revoke, revoke); 65 return result; 66 } 67 68 function getUrl(iframe) { 69 var result = getMessageMatching(iframe, function(message) { 70 return message.type === 'urlQueryResponse'; 71 }) 72 var revoke = function() {}; 73 var result = new Promise(function(resolve, reject) { 74 revoke = onMessage(iframe, resolve); 75 }); 76 result.then(revoke, revoke); 77 iframe.contentWindow.postMessage({type: 'urlQuery'}, '*'); 78 return result; 79 } 80 81 function timePasses(ms) { 82 return new Promise(function(resolve) { 83 window.setTimeout(function() { 84 resolve(); 85 }, ms); 86 }); 87 } 88 89 suite('<iron-location>\'s initialization', function() { 90 var iframe; 91 var error; 92 setup(function() { 93 return getIframe().then(function(i) { 94 iframe = i; 95 function isError(m) {return m.type === 'error'} 96 getMessageMatching(iframe, isError).then(function(m) { 97 error = m.error; 98 }); 99 }); 100 }); 101 teardown(function() { 102 if (iframe) { 103 document.body.removeChild(iframe); 104 } 105 var e = error; 106 iframe = null; 107 error = null; 108 if (e) { 109 throw new Error('Error message from contained iframe: ' + e); 110 } 111 }); 112 var cases = [ 113 'default-before', 'attached-before', 'ready-before', 114 'default-after', 'attached-after', 'ready-after', 115 'default-below', 'attached-below', 'ready-below', 116 'default-above', 'attached-above', 'ready-above', 117 'default-container', 'attached-container', 'ready-container' 118 ]; 119 cases.forEach(function(caseName) { 120 test('the url takes priority in ' + caseName + ' initialization', function() { 121 return getUrl(iframe).then(function(url) { 122 expect(url.search).to.be.eq(''); 123 iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*'); 124 return timePasses(10).then(function() {return getUrl(iframe)}); 125 }).then(function(url) { 126 expect(url.search).to.be.eq(''); 127 }); 128 }); 129 }); 130 var expectedFailureCases = ['timeout-before', 'timeout-after', 'timeout-below', 'timeout-above', 'timeout-container']; 131 expectedFailureCases.forEach(function(caseName) { 132 test('the url does not take priority in ' + caseName + ' initialization', function() { 133 return getUrl(iframe).then(function(url) { 134 expect(url.search).to.be.eq(''); 135 iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*'); 136 return timePasses(60).then(function() {return getUrl(iframe)}); 137 }).then(function(url) { 138 expect(url.search).to.be.eq('?on-timeout'); 139 }); 140 }); 141 }); 142 }); 143 </script> 144 </body> 145</html> 146