• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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