initialization-tests.html 4.67 KB
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="../../webcomponentsjs/webcomponents.js"></script>
    <script src="../../web-component-tester/browser.js"></script>
    <script src="../../test-fixture/test-fixture-mocha.js"></script>

    <link rel="import" href="../../polymer/polymer.html">
    <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
    <link rel="import" href="../../test-fixture/test-fixture.html">
    <link rel="import" href="../iron-page-url.html">
  </head>

  <body>
    <script>
      'use strict';

      function getIframe() {
        return new Promise(function(resolve, reject) {
          var iframe = document.createElement('iframe');
          var result = getMessageMatching(iframe, function(message) {
            return message.type === 'ready';
          });
          iframe.src = './initialization-iframe.html';
          document.body.appendChild(iframe);
          iframe.addEventListener('error', reject);
          result.then(function() {resolve(iframe)}, reject);
        });
      }

      function onMessage(iframe, callback) {
        var f = function(event) {
          if (event.source === iframe.contentWindow) {
            callback(event.data);
          }
        };
        window.addEventListener('message', f, false);
        return function() {
          window.removeEventListener('message', f);
        }
      }

      function getMessageMatching(iframe, predicate) {
        var revoke = function() {};
        var result = new Promise(function(resolve, reject) {
          revoke = onMessage(iframe, function(message) {
            if (predicate(message)) {
              resolve(message);
            }
          });
        });
        result.then(revoke, revoke);
        return result;
      }

      function getUrl(iframe) {
        var result = getMessageMatching(iframe, function(message) {
          return message.type === 'urlQueryResponse';
        })
        var revoke = function() {};
        var result = new Promise(function(resolve, reject) {
          revoke = onMessage(iframe, resolve);
        });
        result.then(revoke, revoke);
        iframe.contentWindow.postMessage({type: 'urlQuery'}, '*');
        return result;
      }

      function timePasses(ms) {
        return new Promise(function(resolve) {
          window.setTimeout(function() {
            resolve();
          }, ms);
        });
      }

      suite('<iron-page-url>\'s initialization', function() {
        var iframe;
        var error;
        setup(function() {
          return getIframe().then(function(i) {
            iframe = i;
            function isError(m) {return m.type === 'error'}
            getMessageMatching(iframe, isError).then(function(m) {
              error = m.error;
            });
          });
        });
        teardown(function() {
          if (iframe) {
            document.body.removeChild(iframe);
          }
          var e = error;
          iframe = null;
          error = null;
          if (e) {
            throw new Error('Error message from contained iframe: ' + e);
          }
        });
        var cases = [
          'default-before', 'attached-before', 'ready-before',
          'default-after', 'attached-after', 'ready-after',
          'default-below', 'attached-below', 'ready-below',
          'default-above', 'attached-above', 'ready-above',
          'default-container', 'attached-container', 'ready-container'
        ];
        cases.forEach(function(caseName) {
          test('the url takes priority in ' + caseName + ' initialization', function() {
            return getUrl(iframe).then(function(url) {
              expect(url.search).to.be.eq('');
              iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*');
              return timePasses(10).then(function() {return getUrl(iframe)});
            }).then(function(url) {
              expect(url.search).to.be.eq('');
            });
          });
        });
        var expectedFailureCases = ['timeout-before', 'timeout-after', 'timeout-below', 'timeout-above', 'timeout-container'];
        expectedFailureCases.forEach(function(caseName) {
          test('the url does not take priority in ' + caseName + ' initialization', function() {
            return getUrl(iframe).then(function(url) {
              expect(url.search).to.be.eq('');
              iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*');
              return timePasses(60).then(function() {return getUrl(iframe)});
            }).then(function(url) {
              expect(url.search).to.be.eq('?on-timeout');
            });
          });
        });
      });
    </script>
  </body>
</html>