Index: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart |
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart |
index b23aa6369d749e7295308f95827b0848e37f854d..a6c3ce44bc6890fe392d58bfbfc824e982fc629b 100644 |
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart |
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart |
@@ -30,6 +30,59 @@ part 'generators.dart'; |
part 'operations.dart'; |
part 'utils.dart'; |
+// TODO(vsm): Move polyfill code to dart:html. |
+// Note, native extensions are registered onto types in dart.global. |
+// This polyfill needs to run before the corresponding dart:html code is run. |
@JSExportName('global') |
-final global_ = JS('', 'typeof window == "undefined" ? global : window'); |
+final global_ = JS('', ''' |
+ function () { |
+ if (typeof NodeList !== "undefined") { |
+ // TODO(vsm): Do we still need these? |
+ NodeList.prototype.get = function(i) { return this[i]; }; |
+ NamedNodeMap.prototype.get = function(i) { return this[i]; }; |
+ DOMTokenList.prototype.get = function(i) { return this[i]; }; |
+ HTMLCollection.prototype.get = function(i) { return this[i]; }; |
+ |
+ // Expose constructors for DOM types dart:html needs to assume are |
+ // available on window. |
+ if (typeof PannerNode == "undefined") { |
+ let audioContext; |
+ if (typeof AudioContext == "undefined" && |
+ (typeof webkitAudioContext != "undefined")) { |
+ audioContext = new webkitAudioContext(); |
+ } else { |
+ audioContext = new AudioContext(); |
+ window.StereoPannerNode = |
+ audioContext.createStereoPanner().constructor; |
+ } |
+ window.PannerNode = audioContext.createPanner().constructor; |
+ } |
+ if (typeof AudioSourceNode == "undefined") { |
+ window.AudioSourceNode = MediaElementAudioSourceNode.__proto__; |
+ } |
+ if (typeof FontFaceSet == "undefined") { |
+ window.FontFaceSet = document.fonts.__proto__.constructor; |
+ } |
+ if (typeof MemoryInfo == "undefined") { |
+ if (typeof window.performance.memory != "undefined") { |
+ window.MemoryInfo = window.performance.memory.constructor; |
+ } |
+ } |
+ if (typeof Geolocation == "undefined") { |
+ navigator.geolocation.constructor; |
+ } |
+ if (typeof Animation == "undefined") { |
+ let d = document.createElement('div'); |
+ if (typeof d.animate != "undefined") { |
+ window.Animation = d.animate(d).constructor; |
+ } |
+ } |
+ if (typeof SourceBufferList == "undefined") { |
+ window.SourceBufferList = new MediaSource().sourceBuffers.constructor; |
+ } |
+ } |
+ return typeof window == "undefined" ? global : window; |
+ }() |
+'''); |
+ |
final JsSymbol = JS('', 'Symbol'); |