diff --git a/src/HTMLImports/Loader.js b/src/HTMLImports/Loader.js index 959bcaa..678974e 100644 --- a/src/HTMLImports/Loader.js +++ b/src/HTMLImports/Loader.js @@ -49,7 +49,16 @@ Loader.prototype = { }, require: function(elt) { - var url = elt.src || elt.href; + var url; + if (elt.ownerDocument.baseURI) { + url = elt.src || elt.href; + } else { + // Old Opera/Presto does not reflect correct baseURI in XHR'ed doc; fix up + var href = elt.getAttribute('src') || elt.getAttribute('href'); + var lastSlash = elt.ownerDocument._URL.lastIndexOf('/'); + var base = elt.ownerDocument._URL.substring(0, lastSlash + 1); + url = new URL(href, base).href; + } // ensure we have a standard url that can be used // reliably for deduping. // TODO(sjmiles): ad-hoc diff --git a/src/HTMLImports/base.js b/src/HTMLImports/base.js index c1929e9..344c84f 100644 --- a/src/HTMLImports/base.js +++ b/src/HTMLImports/base.js @@ -71,6 +71,7 @@ Object.defineProperty(rootDocument, '_currentScript', currentScriptDescriptor); */ var isIE = /Trident/.test(navigator.userAgent); +var isOldOpera = /Presto/.test(navigator.userAgent); // call a callback when all HTMLImports in the document at call time // (or at least document ready) have loaded. @@ -237,5 +238,6 @@ scope.useNative = useNative; scope.rootDocument = rootDocument; scope.whenReady = whenReady; scope.isIE = isIE; +scope.isOldOpera = isOldOpera; })(window.HTMLImports); diff --git a/src/HTMLImports/dynamic.js b/src/HTMLImports/dynamic.js index 2683cbb..a64bd5e 100644 --- a/src/HTMLImports/dynamic.js +++ b/src/HTMLImports/dynamic.js @@ -60,6 +60,7 @@ var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || - HTMLElement.prototype.msMatchesSelector; + HTMLElement.prototype.msMatchesSelector || + HTMLElement.prototype.oMatchesSelector; }); diff --git a/src/HTMLImports/parser.js b/src/HTMLImports/parser.js index a52d9de..32e60d3 100644 --- a/src/HTMLImports/parser.js +++ b/src/HTMLImports/parser.js @@ -14,6 +14,7 @@ var path = scope.path; var rootDocument = scope.rootDocument; var flags = scope.flags; var isIE = scope.isIE; +var isOldOpera = scope.isOldOpera; var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; var IMPORT_SELECTOR = 'link[rel=' + IMPORT_LINK_TYPE + ']'; @@ -191,7 +192,7 @@ var importParser = { // NOTE: IE does not fire "load" event for styles that have already loaded // This is in violation of the spec, so we try our hardest to work around it - if (isIE && elt.localName === 'style') { + if ((isIE || isOldOpera) && elt.localName === 'style') { var fakeLoad = false; // If there's not @import in the textContent, assume it has loaded if (elt.textContent.indexOf('@import') == -1) { diff --git a/src/ShadowDOM/wrappers/Element.js b/src/ShadowDOM/wrappers/Element.js index 0fc646c..c099d5a 100644 --- a/src/ShadowDOM/wrappers/Element.js +++ b/src/ShadowDOM/wrappers/Element.js @@ -32,6 +32,7 @@ 'mozMatchesSelector', 'msMatchesSelector', 'webkitMatchesSelector', + 'oMatchesSelector' ].filter(function(name) { return OriginalElement.prototype[name]; }); diff --git a/tests/ShadowDOM/js/HTMLHtmlElement.js b/tests/ShadowDOM/js/HTMLHtmlElement.js index be2e8a6..313bb63 100644 --- a/tests/ShadowDOM/js/HTMLHtmlElement.js +++ b/tests/ShadowDOM/js/HTMLHtmlElement.js @@ -58,7 +58,8 @@ suite('HTMLHtmlElement', function() { var matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || - html.msMatchesSelector; + html.msMatchesSelector || + html.oMatchesSelector; assert.isTrue(matches.call(document.body, 'body')); assert.isTrue(matches.call(wrap(document.body), 'body'));