Index: pkg/web_components/lib/platform.concat.js |
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js |
index 0572d8abc53c7fd63f2b276caf1d43b3c68168fc..68b593d8b5c85d4d4a269cfe1ef246007fbe0745 100644 |
--- a/pkg/web_components/lib/platform.concat.js |
+++ b/pkg/web_components/lib/platform.concat.js |
@@ -95,16 +95,7 @@ if (typeof WeakMap === 'undefined') { |
entry[1] : undefined; |
}, |
delete: function(key) { |
- var entry = key[this.name]; |
- if (!entry) return false; |
- var hasValue = entry[0] === key; |
- entry[0] = entry[1] = undefined; |
- return hasValue; |
- }, |
- has: function(key) { |
- var entry = key[this.name]; |
- if (!entry) return false; |
- return entry[0] === key; |
+ this.set(key, undefined); |
} |
}; |
@@ -129,8 +120,6 @@ if (typeof WeakMap === 'undefined') { |
(function(global) { |
'use strict'; |
- var testingExposeCycleCount = global.testingExposeCycleCount; |
- |
// Detect and do basic sanity checking on Object/Array.observe. |
function detectObjectObserve() { |
if (typeof Object.observe !== 'function' || |
@@ -181,13 +170,6 @@ if (typeof WeakMap === 'undefined') { |
return false; |
} |
- // Firefox OS Apps do not allow eval. This feature detection is very hacky |
- // but even if some other platform adds support for this function this code |
- // will continue to work. |
- if (navigator.getDeviceStorage) { |
- return false; |
- } |
- |
try { |
var f = new Function('', 'return true;'); |
return f(); |
@@ -562,7 +544,7 @@ if (typeof WeakMap === 'undefined') { |
while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) { |
cycles++; |
} |
- if (testingExposeCycleCount) |
+ if (global.testingExposeCycleCount) |
global.dirtyCheckCycleCount = cycles; |
return cycles > 0; |
@@ -961,7 +943,7 @@ if (typeof WeakMap === 'undefined') { |
anyChanged = true; |
} while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged); |
- if (testingExposeCycleCount) |
+ if (global.testingExposeCycleCount) |
global.dirtyCheckCycleCount = cycles; |
runningMicrotaskCheckpoint = false; |
@@ -1863,13 +1845,6 @@ window.ShadowDOMPolyfill = {}; |
return false; |
} |
- // Firefox OS Apps do not allow eval. This feature detection is very hacky |
- // but even if some other platform adds support for this function this code |
- // will continue to work. |
- if (navigator.getDeviceStorage) { |
- return false; |
- } |
- |
try { |
var f = new Function('return true;'); |
return f(); |
@@ -2127,15 +2102,13 @@ window.ShadowDOMPolyfill = {}; |
var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D; |
var OriginalWebGLRenderingContext = window.WebGLRenderingContext; |
var OriginalSVGElementInstance = window.SVGElementInstance; |
- var OriginalFormData = window.FormData; |
- |
+ |
function isWrapper(object) { |
return object instanceof wrappers.EventTarget || |
object instanceof wrappers.Event || |
object instanceof wrappers.Range || |
object instanceof wrappers.DOMImplementation || |
object instanceof wrappers.CanvasRenderingContext2D || |
- object instanceof wrappers.FormData || |
wrappers.WebGLRenderingContext && |
object instanceof wrappers.WebGLRenderingContext; |
} |
@@ -2148,7 +2121,6 @@ window.ShadowDOMPolyfill = {}; |
object instanceof OriginalRange || |
object instanceof OriginalDOMImplementation || |
object instanceof OriginalCanvasRenderingContext2D || |
- object instanceof OriginalFormData || |
OriginalWebGLRenderingContext && |
object instanceof OriginalWebGLRenderingContext || |
OriginalSVGElementInstance && |
@@ -4612,39 +4584,6 @@ window.ShadowDOMPolyfill = {}; |
var HTMLCollection = scope.wrappers.HTMLCollection; |
var NodeList = scope.wrappers.NodeList; |
- var getTreeScope = scope.getTreeScope; |
- var wrap = scope.wrap; |
- |
- var originalDocumentQuerySelector = document.querySelector; |
- var originalElementQuerySelector = document.documentElement.querySelector; |
- |
- var originalDocumentQuerySelectorAll = document.querySelectorAll; |
- var originalElementQuerySelectorAll = document.documentElement.querySelectorAll; |
- |
- var originalDocumentGetElementsByTagName = document.getElementsByTagName; |
- var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName; |
- |
- var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS; |
- var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS; |
- |
- var OriginalElement = window.Element; |
- var OriginalDocument = window.HTMLDocument; |
- |
- function filterNodeList(list, index, result) { |
- var wrappedItem = null; |
- var root = null; |
- for (var i = 0, length = list.length; i < length; i++) { |
- wrappedItem = wrap(list[i]); |
- if (root = getTreeScope(wrappedItem).root) { |
- if (root instanceof scope.wrappers.ShadowRoot) { |
- continue; |
- } |
- } |
- result[index++] = wrappedItem; |
- } |
- |
- return index; |
- } |
function findOne(node, selector) { |
var m, el = node.firstElementChild; |
@@ -4675,7 +4614,7 @@ window.ShadowDOMPolyfill = {}; |
return true; |
} |
- function matchesLocalNameOnly(el, ns, localName) { |
+ function matchesLocalName(el, localName) { |
return el.localName === localName; |
} |
@@ -4687,143 +4626,40 @@ window.ShadowDOMPolyfill = {}; |
return el.namespaceURI === ns && el.localName === localName; |
} |
- function findElements(node, index, result, p, arg0, arg1) { |
+ function findElements(node, result, p, arg0, arg1) { |
var el = node.firstElementChild; |
while (el) { |
if (p(el, arg0, arg1)) |
- result[index++] = el; |
- index = findElements(el, index, result, p, arg0, arg1); |
+ result[result.length++] = el; |
+ findElements(el, result, p, arg0, arg1); |
el = el.nextElementSibling; |
} |
- return index; |
+ return result; |
} |
// find and findAll will only match Simple Selectors, |
// Structural Pseudo Classes are not guarenteed to be correct |
// http://www.w3.org/TR/css3-selectors/#simple-selectors |
- function querySelectorAllFiltered (p, index, result, selector) { |
- var target = this.impl; |
- var list; |
- var root = getTreeScope(this).root; |
- if (root instanceof scope.wrappers.ShadowRoot) { |
- // We are in the shadow tree and the logical tree is |
- // going to be disconnected so we do a manual tree traversal |
- return findElements(this, index, result, p, selector, null); |
- } else if (target instanceof OriginalElement) { |
- list = originalElementQuerySelectorAll.call(target, selector); |
- } else if (target instanceof OriginalDocument) { |
- list = originalDocumentQuerySelectorAll.call(target, selector); |
- } else { |
- // When we get a ShadowRoot the logical tree is going to be disconnected |
- // so we do a manual tree traversal |
- return findElements(this, index, result, p, selector, null); |
- } |
- |
- return filterNodeList(list, index, result); |
- } |
- |
var SelectorsInterface = { |
querySelector: function(selector) { |
- var target = this.impl; |
- var wrappedItem; |
- var root = getTreeScope(this).root; |
- if (root instanceof scope.wrappers.ShadowRoot) { |
- // We are in the shadow tree and the logical tree is |
- // going to be disconnected so we do a manual tree traversal |
- return findOne(this, selector); |
- } else if (target instanceof OriginalElement) { |
- wrappedItem = wrap(originalElementQuerySelector.call(target, selector)); |
- } else if (target instanceof OriginalDocument) { |
- wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector)); |
- } else { |
- // When we get a ShadowRoot the logical tree is going to be disconnected |
- // so we do a manual tree traversal |
- return findOne(this, selector); |
- } |
- |
- if (!wrappedItem) { |
- // When the original query returns nothing |
- // we return nothing (to be consistent with the other wrapped calls) |
- return wrappedItem; |
- } else if (root = getTreeScope(wrappedItem).root) { |
- if (root instanceof scope.wrappers.ShadowRoot) { |
- // When the original query returns an element in the ShadowDOM |
- // we must do a manual tree traversal |
- return findOne(this, selector); |
- } |
- } |
- |
- return wrappedItem; |
+ return findOne(this, selector); |
}, |
querySelectorAll: function(selector) { |
- var result = new NodeList(); |
- |
- result.length = querySelectorAllFiltered.call(this, |
- matchesSelector, |
- 0, |
- result, |
- selector); |
- |
- return result; |
+ return findElements(this, new NodeList(), matchesSelector, selector); |
} |
}; |
- function getElementsByTagNameFiltered (p, index, result, localName, lowercase) { |
- var target = this.impl; |
- var list; |
- var root = getTreeScope(this).root; |
- if (root instanceof scope.wrappers.ShadowRoot) { |
- // We are in the shadow tree and the logical tree is |
- // going to be disconnected so we do a manual tree traversal |
- return findElements(this, index, result, p, localName, lowercase); |
- } else if (target instanceof OriginalElement) { |
- list = originalElementGetElementsByTagName.call(target, localName, lowercase); |
- } else if (target instanceof OriginalDocument) { |
- list = originalDocumentGetElementsByTagName.call(target, localName, lowercase); |
- } else { |
- // When we get a ShadowRoot the logical tree is going to be disconnected |
- // so we do a manual tree traversal |
- return findElements(this, index, result, p, localName, lowercase); |
- } |
- |
- return filterNodeList(list, index, result); |
- } |
- |
- function getElementsByTagNameNSFiltered (p, index, result, ns, localName) { |
- var target = this.impl; |
- var list; |
- var root = getTreeScope(this).root; |
- if (root instanceof scope.wrappers.ShadowRoot) { |
- // We are in the shadow tree and the logical tree is |
- // going to be disconnected so we do a manual tree traversal |
- return findElements(this, index, result, p, ns, localName); |
- } else if (target instanceof OriginalElement) { |
- list = originalElementGetElementsByTagNameNS.call(target, ns, localName); |
- } else if (target instanceof OriginalDocument) { |
- list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName); |
- } else { |
- // When we get a ShadowRoot the logical tree is going to be disconnected |
- // so we do a manual tree traversal |
- return findElements(this, index, result, p, ns, localName); |
- } |
- |
- return filterNodeList(list, index, result); |
- } |
- |
var GetElementsByInterface = { |
getElementsByTagName: function(localName) { |
var result = new HTMLCollection(); |
- var match = localName === '*' ? matchesEveryThing : matchesTagName; |
+ if (localName === '*') |
+ return findElements(this, result, matchesEveryThing); |
- result.length = getElementsByTagNameFiltered.call(this, |
- match, |
- 0, |
- result, |
+ return findElements(this, result, |
+ matchesTagName, |
localName, |
localName.toLowerCase()); |
- |
- return result; |
}, |
getElementsByClassName: function(className) { |
@@ -4833,22 +4669,19 @@ window.ShadowDOMPolyfill = {}; |
getElementsByTagNameNS: function(ns, localName) { |
var result = new HTMLCollection(); |
- var match = null; |
- if (ns === '*') { |
- match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly; |
- } else { |
- match = localName === '*' ? matchesNameSpace : matchesLocalNameNS; |
+ if (ns === '') { |
+ ns = null; |
+ } else if (ns === '*') { |
+ if (localName === '*') |
+ return findElements(this, result, matchesEveryThing); |
+ return findElements(this, result, matchesLocalName, localName); |
} |
- |
- result.length = getElementsByTagNameNSFiltered.call(this, |
- match, |
- 0, |
- result, |
- ns || null, |
- localName); |
- return result; |
+ if (localName === '*') |
+ return findElements(this, result, matchesNameSpace, ns); |
+ |
+ return findElements(this, result, matchesLocalNameNS, ns, localName); |
} |
}; |
@@ -5452,17 +5285,6 @@ window.ShadowDOMPolyfill = {}; |
var df = frag(contextElement, text); |
contextElement.insertBefore(df, refNode); |
- }, |
- |
- get hidden() { |
- return this.hasAttribute('hidden'); |
- }, |
- set hidden(v) { |
- if (v) { |
- this.setAttribute('hidden', ''); |
- } else { |
- this.removeAttribute('hidden'); |
- } |
} |
}); |
@@ -7715,7 +7537,6 @@ window.ShadowDOMPolyfill = {}; |
var OriginalWindow = window.Window; |
var originalGetComputedStyle = window.getComputedStyle; |
- var originalGetDefaultComputedStyle = window.getDefaultComputedStyle; |
var originalGetSelection = window.getSelection; |
function Window(impl) { |
@@ -7727,14 +7548,6 @@ window.ShadowDOMPolyfill = {}; |
return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo); |
}; |
- // Mozilla proprietary extension. |
- if (originalGetDefaultComputedStyle) { |
- OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) { |
- return wrap(this || window).getDefaultComputedStyle( |
- unwrapIfNeeded(el), pseudo); |
- }; |
- } |
- |
OriginalWindow.prototype.getSelection = function() { |
return wrap(this || window).getSelection(); |
}; |
@@ -7770,15 +7583,6 @@ window.ShadowDOMPolyfill = {}; |
} |
}); |
- // Mozilla proprietary extension. |
- if (originalGetDefaultComputedStyle) { |
- Window.prototype.getDefaultComputedStyle = function(el, pseudo) { |
- renderAllPending(); |
- return originalGetDefaultComputedStyle.call(unwrap(this), |
- unwrapIfNeeded(el),pseudo); |
- }; |
- } |
- |
registerWrapper(OriginalWindow, Window, window); |
scope.wrappers.Window = Window; |
@@ -7827,10 +7631,7 @@ window.ShadowDOMPolyfill = {}; |
var OriginalFormData = window.FormData; |
function FormData(formElement) { |
- if (formElement instanceof OriginalFormData) |
- this.impl = formElement; |
- else |
- this.impl = new OriginalFormData(formElement && unwrap(formElement)); |
+ this.impl = new OriginalFormData(formElement && unwrap(formElement)); |
} |
registerWrapper(OriginalFormData, FormData, new OriginalFormData()); |
@@ -8594,13 +8395,13 @@ var selectorRe = /([^{]*)({[\s\S]*?})/gim, |
cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, |
// TODO(sorvell): remove either content or comment |
cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim, |
- cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim, |
+ cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*['|"]([^'"]*)['|"][^}]*}([^{]*?){/gim, |
// TODO(sorvell): remove either content or comment |
cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, |
- cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, |
+ cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim, |
// TODO(sorvell): remove either content or comment |
cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, |
- cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, |
+ cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim, |
cssPseudoRe = /::(x-[^\s{,(]*)/gim, |
cssPartRe = /::part\(([^)]*)\)/gim, |
// note: :host pre-processed to -shadowcsshost. |
@@ -8796,7 +8597,7 @@ if (window.ShadowDOMPolyfill) { |
if (elt.parentNode === head) { |
head.replaceChild(style, elt); |
} else { |
- this.addElementToDocument(style); |
+ head.appendChild(style); |
} |
} |
style.__importParsed = true; |
@@ -8871,6 +8672,572 @@ scope.ShadowCSS = ShadowCSS; |
})(window.Platform); |
} |
+/* Any copyright is dedicated to the Public Domain. |
+ * http://creativecommons.org/publicdomain/zero/1.0/ */ |
+ |
+(function(scope) { |
+ 'use strict'; |
+ |
+ // feature detect for URL constructor |
+ var hasWorkingUrl = false; |
+ if (!scope.forceJURL) { |
+ try { |
+ var u = new URL('b', 'http://a'); |
+ hasWorkingUrl = u.href === 'http://a/b'; |
+ } catch(e) {} |
+ } |
+ |
+ if (hasWorkingUrl) |
+ return; |
+ |
+ var relative = Object.create(null); |
+ relative['ftp'] = 21; |
+ relative['file'] = 0; |
+ relative['gopher'] = 70; |
+ relative['http'] = 80; |
+ relative['https'] = 443; |
+ relative['ws'] = 80; |
+ relative['wss'] = 443; |
+ |
+ var relativePathDotMapping = Object.create(null); |
+ relativePathDotMapping['%2e'] = '.'; |
+ relativePathDotMapping['.%2e'] = '..'; |
+ relativePathDotMapping['%2e.'] = '..'; |
+ relativePathDotMapping['%2e%2e'] = '..'; |
+ |
+ function isRelativeScheme(scheme) { |
+ return relative[scheme] !== undefined; |
+ } |
+ |
+ function invalid() { |
+ clear.call(this); |
+ this._isInvalid = true; |
+ } |
+ |
+ function IDNAToASCII(h) { |
+ if ('' == h) { |
+ invalid.call(this) |
+ } |
+ // XXX |
+ return h.toLowerCase() |
+ } |
+ |
+ function percentEscape(c) { |
+ var unicode = c.charCodeAt(0); |
+ if (unicode > 0x20 && |
+ unicode < 0x7F && |
+ // " # < > ? ` |
+ [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 |
+ ) { |
+ return c; |
+ } |
+ return encodeURIComponent(c); |
+ } |
+ |
+ function percentEscapeQuery(c) { |
+ // XXX This actually needs to encode c using encoding and then |
+ // convert the bytes one-by-one. |
+ |
+ var unicode = c.charCodeAt(0); |
+ if (unicode > 0x20 && |
+ unicode < 0x7F && |
+ // " # < > ` (do not escape '?') |
+ [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 |
+ ) { |
+ return c; |
+ } |
+ return encodeURIComponent(c); |
+ } |
+ |
+ var EOF = undefined, |
+ ALPHA = /[a-zA-Z]/, |
+ ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; |
+ |
+ function parse(input, stateOverride, base) { |
+ function err(message) { |
+ errors.push(message) |
+ } |
+ |
+ var state = stateOverride || 'scheme start', |
+ cursor = 0, |
+ buffer = '', |
+ seenAt = false, |
+ seenBracket = false, |
+ errors = []; |
+ |
+ loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { |
+ var c = input[cursor]; |
+ switch (state) { |
+ case 'scheme start': |
+ if (c && ALPHA.test(c)) { |
+ buffer += c.toLowerCase(); // ASCII-safe |
+ state = 'scheme'; |
+ } else if (!stateOverride) { |
+ buffer = ''; |
+ state = 'no scheme'; |
+ continue; |
+ } else { |
+ err('Invalid scheme.'); |
+ break loop; |
+ } |
+ break; |
+ |
+ case 'scheme': |
+ if (c && ALPHANUMERIC.test(c)) { |
+ buffer += c.toLowerCase(); // ASCII-safe |
+ } else if (':' == c) { |
+ this._scheme = buffer; |
+ buffer = ''; |
+ if (stateOverride) { |
+ break loop; |
+ } |
+ if (isRelativeScheme(this._scheme)) { |
+ this._isRelative = true; |
+ } |
+ if ('file' == this._scheme) { |
+ state = 'relative'; |
+ } else if (this._isRelative && base && base._scheme == this._scheme) { |
+ state = 'relative or authority'; |
+ } else if (this._isRelative) { |
+ state = 'authority first slash'; |
+ } else { |
+ state = 'scheme data'; |
+ } |
+ } else if (!stateOverride) { |
+ buffer = ''; |
+ cursor = 0; |
+ state = 'no scheme'; |
+ continue; |
+ } else if (EOF == c) { |
+ break loop; |
+ } else { |
+ err('Code point not allowed in scheme: ' + c) |
+ break loop; |
+ } |
+ break; |
+ |
+ case 'scheme data': |
+ if ('?' == c) { |
+ query = '?'; |
+ state = 'query'; |
+ } else if ('#' == c) { |
+ this._fragment = '#'; |
+ state = 'fragment'; |
+ } else { |
+ // XXX error handling |
+ if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { |
+ this._schemeData += percentEscape(c); |
+ } |
+ } |
+ break; |
+ |
+ case 'no scheme': |
+ if (!base || !(isRelativeScheme(base._scheme))) { |
+ err('Missing scheme.'); |
+ invalid.call(this); |
+ } else { |
+ state = 'relative'; |
+ continue; |
+ } |
+ break; |
+ |
+ case 'relative or authority': |
+ if ('/' == c && '/' == input[cursor+1]) { |
+ state = 'authority ignore slashes'; |
+ } else { |
+ err('Expected /, got: ' + c); |
+ state = 'relative'; |
+ continue |
+ } |
+ break; |
+ |
+ case 'relative': |
+ this._isRelative = true; |
+ if ('file' != this._scheme) |
+ this._scheme = base._scheme; |
+ if (EOF == c) { |
+ this._host = base._host; |
+ this._port = base._port; |
+ this._path = base._path.slice(); |
+ this._query = base._query; |
+ break loop; |
+ } else if ('/' == c || '\\' == c) { |
+ if ('\\' == c) |
+ err('\\ is an invalid code point.'); |
+ state = 'relative slash'; |
+ } else if ('?' == c) { |
+ this._host = base._host; |
+ this._port = base._port; |
+ this._path = base._path.slice(); |
+ this._query = '?'; |
+ state = 'query'; |
+ } else if ('#' == c) { |
+ this._host = base._host; |
+ this._port = base._port; |
+ this._path = base._path.slice(); |
+ this._query = base._query; |
+ this._fragment = '#'; |
+ state = 'fragment'; |
+ } else { |
+ var nextC = input[cursor+1] |
+ var nextNextC = input[cursor+2] |
+ if ( |
+ 'file' != this._scheme || !ALPHA.test(c) || |
+ (nextC != ':' && nextC != '|') || |
+ (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { |
+ this._host = base._host; |
+ this._port = base._port; |
+ this._path = base._path.slice(); |
+ this._path.pop(); |
+ } |
+ state = 'relative path'; |
+ continue; |
+ } |
+ break; |
+ |
+ case 'relative slash': |
+ if ('/' == c || '\\' == c) { |
+ if ('\\' == c) { |
+ err('\\ is an invalid code point.'); |
+ } |
+ if ('file' == this._scheme) { |
+ state = 'file host'; |
+ } else { |
+ state = 'authority ignore slashes'; |
+ } |
+ } else { |
+ if ('file' != this._scheme) { |
+ this._host = base._host; |
+ this._port = base._port; |
+ } |
+ state = 'relative path'; |
+ continue; |
+ } |
+ break; |
+ |
+ case 'authority first slash': |
+ if ('/' == c) { |
+ state = 'authority second slash'; |
+ } else { |
+ err("Expected '/', got: " + c); |
+ state = 'authority ignore slashes'; |
+ continue; |
+ } |
+ break; |
+ |
+ case 'authority second slash': |
+ state = 'authority ignore slashes'; |
+ if ('/' != c) { |
+ err("Expected '/', got: " + c); |
+ continue; |
+ } |
+ break; |
+ |
+ case 'authority ignore slashes': |
+ if ('/' != c && '\\' != c) { |
+ state = 'authority'; |
+ continue; |
+ } else { |
+ err('Expected authority, got: ' + c); |
+ } |
+ break; |
+ |
+ case 'authority': |
+ if ('@' == c) { |
+ if (seenAt) { |
+ err('@ already seen.'); |
+ buffer += '%40'; |
+ } |
+ seenAt = true; |
+ for (var i = 0; i < buffer.length; i++) { |
+ var cp = buffer[i]; |
+ if ('\t' == cp || '\n' == cp || '\r' == cp) { |
+ err('Invalid whitespace in authority.'); |
+ continue; |
+ } |
+ // XXX check URL code points |
+ if (':' == cp && null === this._password) { |
+ this._password = ''; |
+ continue; |
+ } |
+ var tempC = percentEscape(cp); |
+ (null !== this._password) ? this._password += tempC : this._username += tempC; |
+ } |
+ buffer = ''; |
+ } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { |
+ cursor -= buffer.length; |
+ buffer = ''; |
+ state = 'host'; |
+ continue; |
+ } else { |
+ buffer += c; |
+ } |
+ break; |
+ |
+ case 'file host': |
+ if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { |
+ if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { |
+ state = 'relative path'; |
+ } else if (buffer.length == 0) { |
+ state = 'relative path start'; |
+ } else { |
+ this._host = IDNAToASCII.call(this, buffer); |
+ buffer = ''; |
+ state = 'relative path start'; |
+ } |
+ continue; |
+ } else if ('\t' == c || '\n' == c || '\r' == c) { |
+ err('Invalid whitespace in file host.'); |
+ } else { |
+ buffer += c; |
+ } |
+ break; |
+ |
+ case 'host': |
+ case 'hostname': |
+ if (':' == c && !seenBracket) { |
+ // XXX host parsing |
+ this._host = IDNAToASCII.call(this, buffer); |
+ buffer = ''; |
+ state = 'port'; |
+ if ('hostname' == stateOverride) { |
+ break loop; |
+ } |
+ } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { |
+ this._host = IDNAToASCII.call(this, buffer); |
+ buffer = ''; |
+ state = 'relative path start'; |
+ if (stateOverride) { |
+ break loop; |
+ } |
+ continue; |
+ } else if ('\t' != c && '\n' != c && '\r' != c) { |
+ if ('[' == c) { |
+ seenBracket = true; |
+ } else if (']' == c) { |
+ seenBracket = false; |
+ } |
+ buffer += c; |
+ } else { |
+ err('Invalid code point in host/hostname: ' + c); |
+ } |
+ break; |
+ |
+ case 'port': |
+ if (/[0-9]/.test(c)) { |
+ buffer += c; |
+ } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { |
+ if ('' != buffer) { |
+ var temp = parseInt(buffer, 10); |
+ if (temp != relative[this._scheme]) { |
+ this._port = temp + ''; |
+ } |
+ buffer = ''; |
+ } |
+ if (stateOverride) { |
+ break loop; |
+ } |
+ state = 'relative path start'; |
+ continue; |
+ } else if ('\t' == c || '\n' == c || '\r' == c) { |
+ err('Invalid code point in port: ' + c); |
+ } else { |
+ invalid.call(this); |
+ } |
+ break; |
+ |
+ case 'relative path start': |
+ if ('\\' == c) |
+ err("'\\' not allowed in path."); |
+ state = 'relative path'; |
+ if ('/' != c && '\\' != c) { |
+ continue; |
+ } |
+ break; |
+ |
+ case 'relative path': |
+ if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { |
+ if ('\\' == c) { |
+ err('\\ not allowed in relative path.'); |
+ } |
+ var tmp; |
+ if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { |
+ buffer = tmp; |
+ } |
+ if ('..' == buffer) { |
+ this._path.pop(); |
+ if ('/' != c && '\\' != c) { |
+ this._path.push(''); |
+ } |
+ } else if ('.' == buffer && '/' != c && '\\' != c) { |
+ this._path.push(''); |
+ } else if ('.' != buffer) { |
+ if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { |
+ buffer = buffer[0] + ':'; |
+ } |
+ this._path.push(buffer); |
+ } |
+ buffer = ''; |
+ if ('?' == c) { |
+ this._query = '?'; |
+ state = 'query'; |
+ } else if ('#' == c) { |
+ this._fragment = '#'; |
+ state = 'fragment'; |
+ } |
+ } else if ('\t' != c && '\n' != c && '\r' != c) { |
+ buffer += percentEscape(c); |
+ } |
+ break; |
+ |
+ case 'query': |
+ if (!stateOverride && '#' == c) { |
+ this._fragment = '#'; |
+ state = 'fragment'; |
+ } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { |
+ this._query += percentEscapeQuery(c); |
+ } |
+ break; |
+ |
+ case 'fragment': |
+ if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { |
+ this._fragment += c; |
+ } |
+ break; |
+ } |
+ |
+ cursor++; |
+ } |
+ } |
+ |
+ function clear() { |
+ this._scheme = ''; |
+ this._schemeData = ''; |
+ this._username = ''; |
+ this._password = null; |
+ this._host = ''; |
+ this._port = ''; |
+ this._path = []; |
+ this._query = ''; |
+ this._fragment = ''; |
+ this._isInvalid = false; |
+ this._isRelative = false; |
+ } |
+ |
+ // Does not process domain names or IP addresses. |
+ // Does not handle encoding for the query parameter. |
+ function jURL(url, base /* , encoding */) { |
+ if (base !== undefined && !(base instanceof jURL)) |
+ base = new jURL(String(base)); |
+ |
+ this._url = url; |
+ clear.call(this); |
+ |
+ var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); |
+ // encoding = encoding || 'utf-8' |
+ |
+ parse.call(this, input, null, base); |
+ } |
+ |
+ jURL.prototype = { |
+ get href() { |
+ if (this._isInvalid) |
+ return this._url; |
+ |
+ var authority = ''; |
+ if ('' != this._username || null != this._password) { |
+ authority = this._username + |
+ (null != this._password ? ':' + this._password : '') + '@'; |
+ } |
+ |
+ return this.protocol + |
+ (this._isRelative ? '//' + authority + this.host : '') + |
+ this.pathname + this._query + this._fragment; |
+ }, |
+ set href(href) { |
+ clear.call(this); |
+ parse.call(this, href); |
+ }, |
+ |
+ get protocol() { |
+ return this._scheme + ':'; |
+ }, |
+ set protocol(protocol) { |
+ if (this._isInvalid) |
+ return; |
+ parse.call(this, protocol + ':', 'scheme start'); |
+ }, |
+ |
+ get host() { |
+ return this._isInvalid ? '' : this._port ? |
+ this._host + ':' + this._port : this._host; |
+ }, |
+ set host(host) { |
+ if (this._isInvalid || !this._isRelative) |
+ return; |
+ parse.call(this, host, 'host'); |
+ }, |
+ |
+ get hostname() { |
+ return this._host; |
+ }, |
+ set hostname(hostname) { |
+ if (this._isInvalid || !this._isRelative) |
+ return; |
+ parse.call(this, hostname, 'hostname'); |
+ }, |
+ |
+ get port() { |
+ return this._port; |
+ }, |
+ set port(port) { |
+ if (this._isInvalid || !this._isRelative) |
+ return; |
+ parse.call(this, port, 'port'); |
+ }, |
+ |
+ get pathname() { |
+ return this._isInvalid ? '' : this._isRelative ? |
+ '/' + this._path.join('/') : this._schemeData; |
+ }, |
+ set pathname(pathname) { |
+ if (this._isInvalid || !this._isRelative) |
+ return; |
+ this._path = []; |
+ parse.call(this, pathname, 'relative path start'); |
+ }, |
+ |
+ get search() { |
+ return this._isInvalid || !this._query || '?' == this._query ? |
+ '' : this._query; |
+ }, |
+ set search(search) { |
+ if (this._isInvalid || !this._isRelative) |
+ return; |
+ this._query = '?'; |
+ if ('?' == search[0]) |
+ search = search.slice(1); |
+ parse.call(this, search, 'query'); |
+ }, |
+ |
+ get hash() { |
+ return this._isInvalid || !this._fragment || '#' == this._fragment ? |
+ '' : this._fragment; |
+ }, |
+ set hash(hash) { |
+ if (this._isInvalid) |
+ return; |
+ this._fragment = '#'; |
+ if ('#' == hash[0]) |
+ hash = hash.slice(1); |
+ parse.call(this, hash, 'fragment'); |
+ } |
+ }; |
+ |
+ scope.URL = jURL; |
+ |
+})(window); |
+ |
/* |
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
@@ -10424,23 +10791,7 @@ var importParser = { |
}, |
parseGeneric: function(elt) { |
this.trackElement(elt); |
- this.addElementToDocument(elt); |
- }, |
- rootImportForElement: function(elt) { |
- var n = elt; |
- while (n.ownerDocument.__importLink) { |
- n = n.ownerDocument.__importLink; |
- } |
- return n; |
- }, |
- addElementToDocument: function(elt) { |
- var port = this.rootImportForElement(elt.__importElement || elt); |
- var l = port.__insertedElements = port.__insertedElements || 0; |
- var refNode = port.nextElementSibling; |
- for (var i=0; i < l; i++) { |
- refNode = refNode && refNode.nextElementSibling; |
- } |
- port.parentNode.insertBefore(elt, refNode); |
+ document.head.appendChild(elt); |
}, |
// tracks when a loadable element has loaded |
trackElement: function(elt, callback) { |
@@ -10497,7 +10848,7 @@ var importParser = { |
script.parentNode.removeChild(script); |
scope.currentScript = null; |
}); |
- this.addElementToDocument(script); |
+ document.head.appendChild(script); |
}, |
// determine the next element in the tree which should be parsed |
nextToParse: function() { |
@@ -11043,22 +11394,16 @@ if (!HTMLImports.useNative) { |
})(); |
/* |
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
- * Code distributed by Google as part of the polymer project is also |
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+ * 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. |
*/ |
window.CustomElements = window.CustomElements || {flags:{}}; |
-/* |
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
- * Code distributed by Google as part of the polymer project is also |
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
- */ |
+ /* |
+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){ |
@@ -11400,16 +11745,13 @@ scope.takeRecords = takeRecords; |
})(window.CustomElements); |
/* |
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
- * Code distributed by Google as part of the polymer project is also |
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+ * 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. |
*/ |
/** |
- * Implements `document.registerElement` |
+ * Implements `document.register` |
* @module CustomElements |
*/ |
@@ -11641,6 +11983,8 @@ if (useNative) { |
if (definition.is) { |
element.setAttribute('is', definition.is); |
} |
+ // remove 'unresolved' attr, which is a standin for :unresolved. |
+ element.removeAttribute('unresolved'); |
// make 'element' implement definition.prototype |
implement(element, definition); |
// flag as upgraded |
@@ -11878,12 +12222,9 @@ scope.useNative = useNative; |
})(window.CustomElements); |
/* |
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
- * Code distributed by Google as part of the polymer project is also |
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+ * 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) { |
@@ -11945,12 +12286,9 @@ scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; |
})(window.CustomElements); |
/* |
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
- * Code distributed by Google as part of the polymer project is also |
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+ * 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){ |
@@ -11989,13 +12327,11 @@ function bootstrap() { |
// CustomEvent shim for IE |
if (typeof window.CustomEvent !== 'function') { |
- window.CustomEvent = function(inType, params) { |
- params = params || {}; |
- var e = document.createEvent('CustomEvent'); |
- e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); |
+ window.CustomEvent = function(inType) { |
+ var e = document.createEvent('HTMLEvents'); |
+ e.initEvent(inType, true, true); |
return e; |
}; |
- window.CustomEvent.prototype = window.Event.prototype; |
} |
// When loading at readyState complete time (or via flag), boot custom elements |
@@ -13160,7 +13496,7 @@ scope.styleResolver = styleResolver; |
this.refContent_ = undefined; |
this.iterator_.valueChanged(); |
- this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()); |
+ this.iterator_.updateIteratedValue(); |
}, |
clear: function() { |
@@ -13564,22 +13900,19 @@ scope.styleResolver = styleResolver; |
var deps = this.deps = {}; |
var template = this.templateElement_; |
- var ifValue = true; |
if (directives.if) { |
deps.hasIf = true; |
deps.ifOneTime = directives.if.onlyOneTime; |
deps.ifValue = processBinding(IF, directives.if, template, model); |
- ifValue = deps.ifValue; |
- |
// oneTime if & predicate is false. nothing else to do. |
- if (deps.ifOneTime && !ifValue) { |
- this.valueChanged(); |
+ if (deps.ifOneTime && !deps.ifValue) { |
+ this.updateIteratedValue(); |
return; |
} |
if (!deps.ifOneTime) |
- ifValue = ifValue.open(this.updateIfValue, this); |
+ deps.ifValue.open(this.updateIteratedValue, this); |
} |
if (directives.repeat) { |
@@ -13592,40 +13925,13 @@ scope.styleResolver = styleResolver; |
deps.value = processBinding(BIND, directives.bind, template, model); |
} |
- var value = deps.value; |
if (!deps.oneTime) |
- value = value.open(this.updateIteratedValue, this); |
- |
- if (!ifValue) { |
- this.valueChanged(); |
- return; |
- } |
- |
- this.updateValue(value); |
- }, |
+ deps.value.open(this.updateIteratedValue, this); |
- /** |
- * Gets the updated value of the bind/repeat. This can potentially call |
- * user code (if a bindingDelegate is set up) so we try to avoid it if we |
- * already have the value in hand (from Observer.open). |
- */ |
- getUpdatedValue: function() { |
- var value = this.deps.value; |
- if (!this.deps.oneTime) |
- value = value.discardChanges(); |
- return value; |
+ this.updateIteratedValue(); |
}, |
- updateIfValue: function(ifValue) { |
- if (!ifValue) { |
- this.valueChanged(); |
- return; |
- } |
- |
- this.updateValue(this.getUpdatedValue()); |
- }, |
- |
- updateIteratedValue: function(value) { |
+ updateIteratedValue: function() { |
if (this.deps.hasIf) { |
var ifValue = this.deps.ifValue; |
if (!this.deps.ifOneTime) |
@@ -13636,10 +13942,9 @@ scope.styleResolver = styleResolver; |
} |
} |
- this.updateValue(value); |
- }, |
- |
- updateValue: function(value) { |
+ var value = this.deps.value; |
+ if (!this.deps.oneTime) |
+ value = value.discardChanges(); |
if (!this.deps.repeat) |
value = [value]; |
var observe = this.deps.repeat && |