Index: runtime/bin/vmservice/observatory/deployed/web/packages/html_import/src/Parser.js |
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/html_import/src/Parser.js b/runtime/bin/vmservice/observatory/deployed/web/packages/html_import/src/Parser.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2f00e0502a118dac51691973f0f498d1be1368ef |
--- /dev/null |
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/html_import/src/Parser.js |
@@ -0,0 +1,107 @@ |
+/* |
+ * Copyright 2013 The Polymer Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style |
+ * license that can be found in the LICENSE file. |
+ */ |
+ |
+(function(scope) { |
+ |
+var IMPORT_LINK_TYPE = 'import'; |
+ |
+// highlander object for parsing a document tree |
+ |
+var importParser = { |
+ selectors: [ |
+ 'link[rel=' + IMPORT_LINK_TYPE + ']', |
+ 'link[rel=stylesheet]', |
+ 'style', |
+ 'script:not([type])', |
+ 'script[type="text/javascript"]' |
+ ], |
+ map: { |
+ link: 'parseLink', |
+ script: 'parseScript', |
+ style: 'parseGeneric' |
+ }, |
+ parse: function(inDocument) { |
+ if (!inDocument.__importParsed) { |
+ // only parse once |
+ inDocument.__importParsed = true; |
+ // all parsable elements in inDocument (depth-first pre-order traversal) |
+ var elts = inDocument.querySelectorAll(importParser.selectors); |
+ // for each parsable node type, call the mapped parsing method |
+ forEach(elts, function(e) { |
+ importParser[importParser.map[e.localName]](e); |
+ }); |
+ } |
+ }, |
+ parseLink: function(linkElt) { |
+ if (isDocumentLink(linkElt)) { |
+ if (linkElt.content) { |
+ importParser.parse(linkElt.content); |
+ } |
+ } else { |
+ this.parseGeneric(linkElt); |
+ } |
+ }, |
+ parseGeneric: function(elt) { |
+ if (needsMainDocumentContext(elt)) { |
+ document.head.appendChild(elt); |
+ } |
+ }, |
+ parseScript: function(scriptElt) { |
+ if (needsMainDocumentContext(scriptElt)) { |
+ // acquire code to execute |
+ var code = (scriptElt.__resource || scriptElt.textContent).trim(); |
+ if (code) { |
+ // calculate source map hint |
+ var moniker = scriptElt.__nodeUrl; |
+ if (!moniker) { |
+ var moniker = scope.path.documentUrlFromNode(scriptElt); |
+ // there could be more than one script this url |
+ var tag = '[' + Math.floor((Math.random()+1)*1000) + ']'; |
+ // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow |
+ // this sort of thing |
+ var matches = code.match(/Polymer\(['"]([^'"]*)/); |
+ tag = matches && matches[1] || tag; |
+ // tag the moniker |
+ moniker += '/' + tag + '.js'; |
+ } |
+ // source map hint |
+ code += "\n//# sourceURL=" + moniker + "\n"; |
+ // evaluate the code |
+ eval.call(window, code); |
+ } |
+ } |
+ } |
+}; |
+ |
+var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); |
+ |
+function isDocumentLink(elt) { |
+ return elt.localName === 'link' |
+ && elt.getAttribute('rel') === IMPORT_LINK_TYPE; |
+} |
+ |
+function needsMainDocumentContext(node) { |
+ // nodes can be moved to the main document: |
+ // if they are in a tree but not in the main document and not children of <element> |
+ return node.parentNode && !inMainDocument(node) |
+ && !isElementElementChild(node); |
+} |
+ |
+function inMainDocument(elt) { |
+ return elt.ownerDocument === document || |
+ // TODO(sjmiles): ShadowDOMPolyfill intrusion |
+ elt.ownerDocument.impl === document; |
+} |
+ |
+function isElementElementChild(elt) { |
+ return elt.parentNode && elt.parentNode.localName === 'element'; |
+} |
+ |
+// exports |
+ |
+scope.parser = importParser; |
+ |
+})(HTMLImports); |