1f516a629824f0019315b9841dc2df76dc7862ddeChris Craik/**
2f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * @license
3f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * Code distributed by Google as part of the polymer project is also
8f516a629824f0019315b9841dc2df76dc7862ddeChris Craik * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9f516a629824f0019315b9841dc2df76dc7862ddeChris Craik */
10f516a629824f0019315b9841dc2df76dc7862ddeChris Craik// @version 0.5.5
11f516a629824f0019315b9841dc2df76dc7862ddeChris Craikif (typeof WeakMap === "undefined") {
12f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  (function() {
13f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var defineProperty = Object.defineProperty;
14f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var counter = Date.now() % 1e9;
15f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var WeakMap = function() {
16f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
17f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    };
18f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    WeakMap.prototype = {
19f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      set: function(key, value) {
20f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var entry = key[this.name];
21f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
22f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          value: [ key, value ],
23f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          writable: true
24f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        });
25f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return this;
26f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      },
27f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      get: function(key) {
28f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var entry;
29f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
30f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      },
31f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      "delete": function(key) {
32f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var entry = key[this.name];
33f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (!entry || entry[0] !== key) return false;
34f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        entry[0] = entry[1] = undefined;
35f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return true;
36f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      },
37f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      has: function(key) {
38f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var entry = key[this.name];
39f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (!entry) return false;
40f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return entry[0] === key;
41f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
42f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    };
43f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    window.WeakMap = WeakMap;
44f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  })();
45f516a629824f0019315b9841dc2df76dc7862ddeChris Craik}
46f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
47f516a629824f0019315b9841dc2df76dc7862ddeChris Craikwindow.HTMLImports = window.HTMLImports || {
48f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  flags: {}
49f516a629824f0019315b9841dc2df76dc7862ddeChris Craik};
50f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
51f516a629824f0019315b9841dc2df76dc7862ddeChris Craik(function(scope) {
52f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var IMPORT_LINK_TYPE = "import";
53f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
54f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
55f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var wrap = function(node) {
56f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
57f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
58f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var rootDocument = wrap(document);
59f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var currentScriptDescriptor = {
60f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    get: function() {
61f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
62f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return wrap(script);
63f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
64f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    configurable: true
65f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
66f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
67f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
68f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var isIE = /Trident|Edge/.test(navigator.userAgent);
69f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function whenReady(callback, doc) {
70f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    doc = doc || rootDocument;
71f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    whenDocumentReady(function() {
72f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      watchImportsLoad(callback, doc);
73f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }, doc);
74f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
75f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var requiredReadyState = isIE ? "complete" : "interactive";
76f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var READY_EVENT = "readystatechange";
77f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function isDocumentReady(doc) {
78f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
79f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
80f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function whenDocumentReady(callback, doc) {
81f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    if (!isDocumentReady(doc)) {
82f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var checkReady = function() {
83f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
84f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          doc.removeEventListener(READY_EVENT, checkReady);
85f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          whenDocumentReady(callback, doc);
86f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
87f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      };
88f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      doc.addEventListener(READY_EVENT, checkReady);
89f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    } else if (callback) {
90f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      callback();
91f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
92f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
93f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function markTargetLoaded(event) {
94f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    event.target.__loaded = true;
95f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
96f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function watchImportsLoad(callback, doc) {
97f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var imports = doc.querySelectorAll("link[rel=import]");
98f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var loaded = 0, l = imports.length;
99f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    function checkDone(d) {
100f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (loaded == l && callback) {
101f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        callback();
102f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
103f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
104f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    function loadedImport(e) {
105f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      markTargetLoaded(e);
106f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      loaded++;
107f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      checkDone();
108f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
109f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    if (l) {
110f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, imp; i < l && (imp = imports[i]); i++) {
111f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (isImportLoaded(imp)) {
112f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          loadedImport.call(imp, {
113f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            target: imp
114f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          });
115f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        } else {
116f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          imp.addEventListener("load", loadedImport);
117f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          imp.addEventListener("error", loadedImport);
118f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
119f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
120f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    } else {
121f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      checkDone();
122f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
123f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
124f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function isImportLoaded(link) {
125f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
126f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
127f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  if (useNative) {
128f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    new MutationObserver(function(mxns) {
129f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
130f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (m.addedNodes) {
131f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          handleImports(m.addedNodes);
132f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
133f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
134f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }).observe(document.head, {
135f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      childList: true
136f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    });
137f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    function handleImports(nodes) {
138f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
139f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (isImport(n)) {
140f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          handleImport(n);
141f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
142f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
143f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
144f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    function isImport(element) {
145f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return element.localName === "link" && element.rel === "import";
146f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
147f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    function handleImport(element) {
148f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var loaded = element.import;
149f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (loaded) {
150f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        markTargetLoaded({
151f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          target: element
152f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        });
153f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      } else {
154f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        element.addEventListener("load", markTargetLoaded);
155f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        element.addEventListener("error", markTargetLoaded);
156f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
157f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
158f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    (function() {
159f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (document.readyState === "loading") {
160f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var imports = document.querySelectorAll("link[rel=import]");
161f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
162f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          handleImport(imp);
163f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
164f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
165f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    })();
166f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
167f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  whenReady(function() {
168f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    HTMLImports.ready = true;
169f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    HTMLImports.readyTime = new Date().getTime();
170f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var evt = rootDocument.createEvent("CustomEvent");
171f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    evt.initCustomEvent("HTMLImportsLoaded", true, true, {});
172f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    rootDocument.dispatchEvent(evt);
173f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  });
174f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
175f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.useNative = useNative;
176f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.rootDocument = rootDocument;
177f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.whenReady = whenReady;
178f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.isIE = isIE;
179f516a629824f0019315b9841dc2df76dc7862ddeChris Craik})(HTMLImports);
180f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
181f516a629824f0019315b9841dc2df76dc7862ddeChris Craik(function(scope) {
182f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var modules = [];
183f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var addModule = function(module) {
184f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    modules.push(module);
185f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
186f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var initializeModules = function() {
187f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    modules.forEach(function(module) {
188f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      module(scope);
189f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    });
190f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
191f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.addModule = addModule;
192f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.initializeModules = initializeModules;
193f516a629824f0019315b9841dc2df76dc7862ddeChris Craik})(HTMLImports);
194f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
195f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
196f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
197f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
198f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var path = {
199f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    resolveUrlsInStyle: function(style) {
200f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var doc = style.ownerDocument;
201f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var resolver = doc.createElement("a");
202f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
203f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return style;
204f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
205f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    resolveUrlsInCssText: function(cssText, urlObj) {
206f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
207f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
208f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return r;
209f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
210f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    replaceUrls: function(text, urlObj, regexp) {
211f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return text.replace(regexp, function(m, pre, url, post) {
212f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var urlPath = url.replace(/["']/g, "");
213f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        urlObj.href = urlPath;
214f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        urlPath = urlObj.href;
215f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return pre + "'" + urlPath + "'" + post;
216f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      });
217f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
218f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
219f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.path = path;
220f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
221f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
222f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
223f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var xhr = {
224f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    async: true,
225f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    ok: function(request) {
226f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
227f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
228f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    load: function(url, next, nextContext) {
229f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var request = new XMLHttpRequest();
230f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (scope.flags.debug || scope.flags.bust) {
231f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        url += "?" + Math.random();
232f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
233f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      request.open("GET", url, xhr.async);
234f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      request.addEventListener("readystatechange", function(e) {
235f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (request.readyState === 4) {
236f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          var locationHeader = request.getResponseHeader("Location");
237f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          var redirectedUrl = null;
238f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          if (locationHeader) {
239f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            var redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
240f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }
241f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
242f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
243f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      });
244f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      request.send();
245f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return request;
246f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
247f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    loadDocument: function(url, next, nextContext) {
248f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.load(url, next, nextContext).responseType = "document";
249f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
250f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
251f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.xhr = xhr;
252f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
253f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
254f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
255f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var xhr = scope.xhr;
256f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var flags = scope.flags;
257f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var Loader = function(onLoad, onComplete) {
258f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.cache = {};
259f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.onload = onLoad;
260f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.oncomplete = onComplete;
261f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.inflight = 0;
262f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.pending = {};
263f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
264f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  Loader.prototype = {
265f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    addNodes: function(nodes) {
266f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.inflight += nodes.length;
267f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
268f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.require(n);
269f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
270f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.checkDone();
271f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
272f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    addNode: function(node) {
273f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.inflight++;
274f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.require(node);
275f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.checkDone();
276f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
277f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    require: function(elt) {
278f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var url = elt.src || elt.href;
279f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.__nodeUrl = url;
280f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (!this.dedupe(url, elt)) {
281f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.fetch(url, elt);
282f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
283f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
284f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    dedupe: function(url, elt) {
285f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (this.pending[url]) {
286f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.pending[url].push(elt);
287f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return true;
288f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
289f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var resource;
290f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (this.cache[url]) {
291f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.onload(url, elt, this.cache[url]);
292f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.tail();
293f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return true;
294f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
295f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.pending[url] = [ elt ];
296f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return false;
297f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
298f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    fetch: function(url, elt) {
299f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      flags.load && console.log("fetch", url, elt);
300f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (!url) {
301f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        setTimeout(function() {
302f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          this.receive(url, elt, {
303f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            error: "href must be specified"
304f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }, null);
305f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }.bind(this), 0);
306f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      } else if (url.match(/^data:/)) {
307f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var pieces = url.split(",");
308f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var header = pieces[0];
309f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var body = pieces[1];
310f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (header.indexOf(";base64") > -1) {
311f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          body = atob(body);
312f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        } else {
313f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          body = decodeURIComponent(body);
314f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
315f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        setTimeout(function() {
316f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          this.receive(url, elt, null, body);
317f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }.bind(this), 0);
318f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      } else {
319f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var receiveXhr = function(err, resource, redirectedUrl) {
320f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          this.receive(url, elt, err, resource, redirectedUrl);
321f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }.bind(this);
322f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        xhr.load(url, receiveXhr);
323f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
324f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
325f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    receive: function(url, elt, err, resource, redirectedUrl) {
326f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.cache[url] = resource;
327f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var $p = this.pending[url];
328f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
329f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.onload(url, p, resource, err, redirectedUrl);
330f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.tail();
331f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
332f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.pending[url] = null;
333f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
334f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    tail: function() {
335f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      --this.inflight;
336f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.checkDone();
337f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
338f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    checkDone: function() {
339f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (!this.inflight) {
340f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.oncomplete();
341f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
342f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
343f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
344f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.Loader = Loader;
345f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
346f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
347f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
348f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var Observer = function(addCallback) {
349f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.addCallback = addCallback;
350f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    this.mo = new MutationObserver(this.handler.bind(this));
351f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
352f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  Observer.prototype = {
353f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    handler: function(mutations) {
354f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
355f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (m.type === "childList" && m.addedNodes.length) {
356f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          this.addedNodes(m.addedNodes);
357f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
358f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
359f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
360f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    addedNodes: function(nodes) {
361f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (this.addCallback) {
362f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.addCallback(nodes);
363f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
364f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
365f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (n.children && n.children.length) {
366f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          this.addedNodes(n.children);
367f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
368f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
369f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
370f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    observe: function(root) {
371f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.mo.observe(root, {
372f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        childList: true,
373f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        subtree: true
374f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      });
375f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
376f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
377f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.Observer = Observer;
378f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
379f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
380f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
381f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var path = scope.path;
382f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var rootDocument = scope.rootDocument;
383f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var flags = scope.flags;
384f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var isIE = scope.isIE;
385f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
386f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
387f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var importParser = {
388f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    documentSelectors: IMPORT_SELECTOR,
389f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]", "style", "script:not([type])", 'script[type="text/javascript"]' ].join(","),
390f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    map: {
391f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      link: "parseLink",
392f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      script: "parseScript",
393f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      style: "parseStyle"
394f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
395f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    dynamicElements: [],
396f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseNext: function() {
397f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var next = this.nextToParse();
398f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (next) {
399f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.parse(next);
400f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
401f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
402f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parse: function(elt) {
403f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (this.isParsed(elt)) {
404f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        flags.parse && console.log("[%s] is already parsed", elt.localName);
405f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return;
406f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
407f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var fn = this[this.map[elt.localName]];
408f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (fn) {
409f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.markParsing(elt);
410f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        fn.call(this, elt);
411f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
412f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
413f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseDynamic: function(elt, quiet) {
414f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.dynamicElements.push(elt);
415f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (!quiet) {
416f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.parseNext();
417f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
418f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
419f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    markParsing: function(elt) {
420f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      flags.parse && console.log("parsing", elt);
421f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.parsingElement = elt;
422f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
423f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    markParsingComplete: function(elt) {
424f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.__importParsed = true;
425f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.markDynamicParsingComplete(elt);
426f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (elt.__importElement) {
427f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        elt.__importElement.__importParsed = true;
428f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.markDynamicParsingComplete(elt.__importElement);
429f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
430f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.parsingElement = null;
431f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      flags.parse && console.log("completed", elt);
432f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
433f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    markDynamicParsingComplete: function(elt) {
434f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var i = this.dynamicElements.indexOf(elt);
435f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (i >= 0) {
436f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.dynamicElements.splice(i, 1);
437f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
438f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
439f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseImport: function(elt) {
440f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (HTMLImports.__importsParsingHook) {
441f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        HTMLImports.__importsParsingHook(elt);
442f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
443f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (elt.import) {
444f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        elt.import.__importParsed = true;
445f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
446f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.markParsingComplete(elt);
447f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (elt.__resource && !elt.__error) {
448f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        elt.dispatchEvent(new CustomEvent("load", {
449f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          bubbles: false
450f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }));
451f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      } else {
452f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        elt.dispatchEvent(new CustomEvent("error", {
453f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          bubbles: false
454f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }));
455f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
456f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (elt.__pending) {
457f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var fn;
458f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        while (elt.__pending.length) {
459f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          fn = elt.__pending.shift();
460f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          if (fn) {
461f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            fn({
462f516a629824f0019315b9841dc2df76dc7862ddeChris Craik              target: elt
463f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            });
464f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }
465f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
466f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
467f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.parseNext();
468f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
469f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseLink: function(linkElt) {
470f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (nodeIsImport(linkElt)) {
471f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.parseImport(linkElt);
472f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      } else {
473f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        linkElt.href = linkElt.href;
474f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this.parseGeneric(linkElt);
475f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
476f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
477f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseStyle: function(elt) {
478f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var src = elt;
479f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt = cloneStyle(elt);
480f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.__importElement = src;
481f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.parseGeneric(elt);
482f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
483f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseGeneric: function(elt) {
484f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.trackElement(elt);
485f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.addElementToDocument(elt);
486f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
487f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    rootImportForElement: function(elt) {
488f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var n = elt;
489f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      while (n.ownerDocument.__importLink) {
490f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        n = n.ownerDocument.__importLink;
491f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
492f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return n;
493f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
494f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    addElementToDocument: function(elt) {
495f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var port = this.rootImportForElement(elt.__importElement || elt);
496f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      port.parentNode.insertBefore(elt, port);
497f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
498f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    trackElement: function(elt, callback) {
499f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var self = this;
500f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var done = function(e) {
501f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (callback) {
502f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          callback(e);
503f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
504f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        self.markParsingComplete(elt);
505f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        self.parseNext();
506f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      };
507f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.addEventListener("load", done);
508f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.addEventListener("error", done);
509f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (isIE && elt.localName === "style") {
510f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var fakeLoad = false;
511f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (elt.textContent.indexOf("@import") == -1) {
512f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          fakeLoad = true;
513f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        } else if (elt.sheet) {
514f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          fakeLoad = true;
515f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          var csr = elt.sheet.cssRules;
516f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          var len = csr ? csr.length : 0;
517f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          for (var i = 0, r; i < len && (r = csr[i]); i++) {
518f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            if (r.type === CSSRule.IMPORT_RULE) {
519f516a629824f0019315b9841dc2df76dc7862ddeChris Craik              fakeLoad = fakeLoad && Boolean(r.styleSheet);
520f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            }
521f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }
522f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
523f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (fakeLoad) {
524f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          elt.dispatchEvent(new CustomEvent("load", {
525f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            bubbles: false
526f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }));
527f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
528f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
529f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
530f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseScript: function(scriptElt) {
531f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var script = document.createElement("script");
532f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      script.__importElement = scriptElt;
533f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
534f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      scope.currentScript = scriptElt;
535f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.trackElement(script, function(e) {
536f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        script.parentNode.removeChild(script);
537f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        scope.currentScript = null;
538f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      });
539f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.addElementToDocument(script);
540f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
541f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    nextToParse: function() {
542f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this._mayParse = [];
543f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
544f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
545f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    nextToParseInDoc: function(doc, link) {
546f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (doc && this._mayParse.indexOf(doc) < 0) {
547f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        this._mayParse.push(doc);
548f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
549f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {
550f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          if (!this.isParsed(n)) {
551f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            if (this.hasResource(n)) {
552f516a629824f0019315b9841dc2df76dc7862ddeChris Craik              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
553f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            } else {
554f516a629824f0019315b9841dc2df76dc7862ddeChris Craik              return;
555f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            }
556f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }
557f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
558f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
559f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return link;
560f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
561f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    nextToParseDynamic: function() {
562f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return this.dynamicElements[0];
563f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
564f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    parseSelectorsForNode: function(node) {
565f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var doc = node.ownerDocument || node;
566f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
567f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
568f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    isParsed: function(node) {
569f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return node.__importParsed;
570f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
571f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    needsDynamicParsing: function(elt) {
572f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return this.dynamicElements.indexOf(elt) >= 0;
573f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
574f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    hasResource: function(node) {
575f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (nodeIsImport(node) && node.import === undefined) {
576f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return false;
577f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
578f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return true;
579f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
580f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
581f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function nodeIsImport(elt) {
582f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
583f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
584f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function generateScriptDataUrl(script) {
585f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var scriptContent = generateScriptContent(script);
586f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
587f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
588f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function generateScriptContent(script) {
589f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return script.textContent + generateSourceMapHint(script);
590f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
591f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function generateSourceMapHint(script) {
592f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var owner = script.ownerDocument;
593f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    owner.__importedScripts = owner.__importedScripts || 0;
594f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var moniker = script.ownerDocument.baseURI;
595f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
596f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    owner.__importedScripts++;
597f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return "\n//# sourceURL=" + moniker + num + ".js\n";
598f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
599f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function cloneStyle(style) {
600f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var clone = style.ownerDocument.createElement("style");
601f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    clone.textContent = style.textContent;
602f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    path.resolveUrlsInStyle(clone);
603f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return clone;
604f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
605f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.parser = importParser;
606f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
607f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
608f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
609f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
610f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var flags = scope.flags;
611f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
612f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
613f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var rootDocument = scope.rootDocument;
614f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var Loader = scope.Loader;
615f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var Observer = scope.Observer;
616f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var parser = scope.parser;
617f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var importer = {
618f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    documents: {},
619f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    documentPreloadSelectors: IMPORT_SELECTOR,
620f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
621f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    loadNode: function(node) {
622f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      importLoader.addNode(node);
623f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
624f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    loadSubtree: function(parent) {
625f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var nodes = this.marshalNodes(parent);
626f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      importLoader.addNodes(nodes);
627f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
628f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    marshalNodes: function(parent) {
629f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
630f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
631f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    loadSelectorsForNode: function(node) {
632f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var doc = node.ownerDocument || node;
633f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
634f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
635f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    loaded: function(url, elt, resource, err, redirectedUrl) {
636f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      flags.load && console.log("loaded", url, elt);
637f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.__resource = resource;
638f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      elt.__error = err;
639f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      if (isImportLink(elt)) {
640f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var doc = this.documents[url];
641f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (doc === undefined) {
642f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          doc = err ? null : makeDocument(resource, redirectedUrl || url);
643f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          if (doc) {
644f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            doc.__importLink = elt;
645f516a629824f0019315b9841dc2df76dc7862ddeChris Craik            this.bootDocument(doc);
646f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          }
647f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          this.documents[url] = doc;
648f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
649f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        elt.import = doc;
650f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
651f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      parser.parseNext();
652f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
653f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    bootDocument: function(doc) {
654f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.loadSubtree(doc);
655f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      this.observer.observe(doc);
656f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      parser.parseNext();
657f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
658f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    loadedAll: function() {
659f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      parser.parseNext();
660f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
661f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
662f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
663f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  importer.observer = new Observer();
664f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function isImportLink(elt) {
665f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return isLinkRel(elt, IMPORT_LINK_TYPE);
666f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
667f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function isLinkRel(elt, rel) {
668f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return elt.localName === "link" && elt.getAttribute("rel") === rel;
669f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
670f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function hasBaseURIAccessor(doc) {
671f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return !!Object.getOwnPropertyDescriptor(doc, "baseURI");
672f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
673f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function makeDocument(resource, url) {
674f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
675f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    doc._URL = url;
676f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var base = doc.createElement("base");
677f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    base.setAttribute("href", url);
678f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    if (!doc.baseURI && !hasBaseURIAccessor(doc)) {
679f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      Object.defineProperty(doc, "baseURI", {
680f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        value: url
681f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      });
682f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
683f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var meta = doc.createElement("meta");
684f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    meta.setAttribute("charset", "utf-8");
685f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    doc.head.appendChild(meta);
686f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    doc.head.appendChild(base);
687f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    doc.body.innerHTML = resource;
688f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
689f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      HTMLTemplateElement.bootstrap(doc);
690f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
691f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return doc;
692f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
693f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  if (!document.baseURI) {
694f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    var baseURIDescriptor = {
695f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      get: function() {
696f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        var base = document.querySelector("base");
697f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        return base ? base.href : window.location.href;
698f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      },
699f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      configurable: true
700f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    };
701f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    Object.defineProperty(document, "baseURI", baseURIDescriptor);
702f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
703f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
704f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.importer = importer;
705f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  scope.importLoader = importLoader;
706f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
707f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
708f516a629824f0019315b9841dc2df76dc7862ddeChris CraikHTMLImports.addModule(function(scope) {
709f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var parser = scope.parser;
710f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var importer = scope.importer;
711f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var dynamic = {
712f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    added: function(nodes) {
713f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var owner, parsed, loading;
714f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
715f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (!owner) {
716f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          owner = n.ownerDocument;
717f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          parsed = parser.isParsed(owner);
718f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
719f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        loading = this.shouldLoadNode(n);
720f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (loading) {
721f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          importer.loadNode(n);
722f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
723f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        if (this.shouldParseNode(n) && parsed) {
724f516a629824f0019315b9841dc2df76dc7862ddeChris Craik          parser.parseDynamic(n, loading);
725f516a629824f0019315b9841dc2df76dc7862ddeChris Craik        }
726f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      }
727f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
728f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    shouldLoadNode: function(node) {
729f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
730f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    },
731f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    shouldParseNode: function(node) {
732f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
733f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    }
734f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  };
735f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  importer.observer.addCallback = dynamic.added.bind(dynamic);
736f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
737f516a629824f0019315b9841dc2df76dc7862ddeChris Craik});
738f516a629824f0019315b9841dc2df76dc7862ddeChris Craik
739f516a629824f0019315b9841dc2df76dc7862ddeChris Craik(function(scope) {
740f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var initializeModules = scope.initializeModules;
741f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var isIE = scope.isIE;
742f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  if (scope.useNative) {
743f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    return;
744f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
745f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  if (isIE && typeof window.CustomEvent !== "function") {
746f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    window.CustomEvent = function(inType, params) {
747f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      params = params || {};
748f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      var e = document.createEvent("CustomEvent");
749f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
750f516a629824f0019315b9841dc2df76dc7862ddeChris Craik      return e;
751f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    };
752f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    window.CustomEvent.prototype = window.Event.prototype;
753f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
754f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  initializeModules();
755f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  var rootDocument = scope.rootDocument;
756f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  function bootstrap() {
757f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    HTMLImports.importer.bootDocument(rootDocument);
758f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
759f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
760f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    bootstrap();
761f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  } else {
762f516a629824f0019315b9841dc2df76dc7862ddeChris Craik    document.addEventListener("DOMContentLoaded", bootstrap);
763f516a629824f0019315b9841dc2df76dc7862ddeChris Craik  }
764f516a629824f0019315b9841dc2df76dc7862ddeChris Craik})(HTMLImports);