Index: sdk/lib/_internal/lib/native_helper.dart |
diff --git a/sdk/lib/_internal/lib/native_helper.dart b/sdk/lib/_internal/lib/native_helper.dart |
index 65008e41cf86e95e1541514d26e826a86219a9e9..4362a8e889c3a35f5c8d8d1bd445f6cb095d430c 100644 |
--- a/sdk/lib/_internal/lib/native_helper.dart |
+++ b/sdk/lib/_internal/lib/native_helper.dart |
@@ -389,6 +389,8 @@ void initHooks() { |
hooks = applyHooksTransformer(_operaHooksTransformer, hooks); |
hooks = applyHooksTransformer(_safariHooksTransformer, hooks); |
+ hooks = applyHooksTransformer(_fixDocumentHooksTransformer, hooks); |
+ |
// TODO(sra): Update ShadowDOM polyfil to use |
// [dartNativeDispatchHooksTransformer] and remove this hook. |
hooks = applyHooksTransformer(_dartExperimentalFixupGetTagHooksTransformer, |
@@ -546,14 +548,6 @@ function(hooks) { |
var tag = getTag(o); |
var newTag = quickMap[tag]; |
if (newTag) return newTag; |
- if (tag == "Document") { |
- // IE calls both HTML and XML documents "Document", so we check for the |
- // xmlVersion property, which is the empty string on HTML documents. |
- // Since both dart:html classes Document and HtmlDocument share the same |
- // type, we must patch the instances and not the prototype. |
- if (!!o.xmlVersion) return "!Document"; |
- return "!HTMLDocument"; |
- } |
// Patches for types which report themselves as Objects. |
if (tag == "Object") { |
if (window.DataView && (o instanceof window.DataView)) return "DataView"; |
@@ -562,7 +556,6 @@ function(hooks) { |
} |
function prototypeForTagIE(tag) { |
- if (tag == "Document") return null; // Do not pre-patch Document. |
var constructor = window[tag]; |
if (constructor == null) return null; |
return constructor.prototype; |
@@ -572,6 +565,32 @@ function(hooks) { |
hooks.prototypeForTag = prototypeForTagIE; |
}'''); |
+const _fixDocumentHooksTransformer = const JS_CONST(r''' |
+function(hooks) { |
+ var getTag = hooks.getTag; |
+ var prototypeForTag = hooks.prototypeForTag; |
+ function getTagFixed(o) { |
+ var tag = getTag(o); |
+ if (tag == "Document") { |
+ // Some browsers and the polymer polyfill call both HTML and XML documents |
+ // "Document", so we check for the xmlVersion property, which is the empty |
+ // string on HTML documents. Since both dart:html classes Document and |
+ // HtmlDocument share the same type, we must patch the instances and not |
+ // the prototype. |
+ if (!!o.xmlVersion) return "!Document"; |
+ return "!HTMLDocument"; |
+ } |
+ return tag; |
+ } |
+ |
+ function prototypeForTagFixed(tag) { |
+ if (tag == "Document") return null; // Do not pre-patch Document. |
+ return prototypeForTag(tag); |
+ } |
+ |
+ hooks.getTag = getTagFixed; |
+ hooks.prototypeForTag = prototypeForTagFixed; |
+}'''); |
const _firefoxHooksTransformer = const JS_CONST(r''' |
function(hooks) { |