Index: tools/dom/templates/html/dartium/html_dartium.darttemplate |
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate |
index 1d558264eec22d5235140d488454a4554a5fd59c..c6a200f94757e4538f55445d043f9a6f5b71ce8f 100644 |
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate |
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate |
@@ -37,6 +37,7 @@ import 'dart:_internal' hide Symbol, deprecated; |
import 'dart:html_common'; |
import 'dart:indexed_db'; |
import 'dart:indexed_db' show indexed_dbBlinkMap; |
+import 'dart:indexed_db' show indexed_dbBlinkFunctionMap; |
import 'dart:isolate'; |
import 'dart:js' as js; |
import "dart:convert"; |
@@ -48,14 +49,17 @@ import 'dart:nativewrappers'; |
import 'dart:typed_data'; |
import 'dart:web_gl' as gl; |
import 'dart:web_gl' show web_glBlinkMap; |
+import 'dart:web_gl' show web_glBlinkFunctionMap; |
import 'dart:web_sql'; |
// Not actually used, but imported since dart:html can generate these objects. |
import 'dart:svg' as svg; |
import 'dart:svg' show svgBlinkMap; |
+import 'dart:svg' show svgBlinkFunctionMap; |
import 'dart:svg' show Matrix; |
import 'dart:svg' show SvgSvgElement; |
import 'dart:web_audio' as web_audio; |
import 'dart:web_audio' show web_audioBlinkMap; |
+import 'dart:web_audio' show web_audioBlinkFunctionMap; |
import 'dart:_blink' as _blink; |
export 'dart:math' show Rectangle, Point; |
@@ -111,7 +115,13 @@ Window get window { |
if (_window != null) { |
return _window; |
} |
+$if DARTIUM |
+$if JSINTEROP |
+ _window = wrap_jso(js.context['window']); |
+$else |
_window = _Utils.window(); |
+$endif |
+$endif |
return _window; |
} |
@@ -239,3 +249,187 @@ Type _getSvgType(String key) { |
} |
return null; |
} |
+ |
+ |
+$if JSINTEROP |
+// FIXME: Can we make this private? |
+final htmlBlinkFunctionMap = { |
+$!TYPE_FUNCTION_MAP |
+}; |
+ |
+// TODO(terry): We may want to move this elsewhere if html becomes |
+// a package to avoid dartium depending on pkg:html. |
+getHtmlCreateFunction(String key) { |
+ var result; |
+ |
+ // TODO(vsm): Add Cross Frame and JS types here as well. |
+ |
+ // Check the html library. |
+ result = _getHtmlFunction(key); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
+ // Check the web gl library. |
+ result = _getWebGlFunction(key); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
+ // Check the indexed db library. |
+ result = _getIndexDbFunction(key); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
+ // Check the web audio library. |
+ result = _getWebAudioFunction(key); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
+ // Check the web sql library. |
+ result = _getWebSqlFunction(key); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
+ // Check the svg library. |
+ result = _getSvgFunction(key); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
+ return null; |
+} |
+ |
+Type _getHtmlFunction(String key) { |
+ if (htmlBlinkFunctionMap.containsKey(key)) { |
+ return htmlBlinkFunctionMap[key](); |
+ } |
+ return null; |
+} |
+ |
+Type _getWebGlFunction(String key) { |
+ if (web_glBlinkFunctionMap.containsKey(key)) { |
+ return web_glBlinkFunctionMap[key](); |
+ } |
+ return null; |
+} |
+ |
+Type _getIndexDbFunction(String key) { |
+ if (indexed_dbBlinkFunctionMap.containsKey(key)) { |
+ return indexed_dbBlinkFunctionMap[key](); |
+ } |
+ return null; |
+} |
+ |
+Type _getWebAudioFunction(String key) { |
+ if (web_audioBlinkFunctionMap.containsKey(key)) { |
+ return web_audioBlinkFunctionMap[key](); |
+ } |
+ return null; |
+} |
+ |
+Type _getWebSqlFunction(String key) { |
+ if (web_sqlBlinkFunctionMap.containsKey(key)) { |
+ return web_sqlBlinkFunctionMap[key](); |
+ } |
+ return null; |
+} |
+ |
+Type _getSvgFunction(String key) { |
+ if (svgBlinkFunctionMap.containsKey(key)) { |
+ return svgBlinkFunctionMap[key](); |
+ } |
+ return null; |
+} |
+ |
+ |
+/****************************************************************************** |
+ ********** ********** |
+ ********** JS Interop Support ********** |
+ ********** ********** |
+ ******************************************************************************/ |
+ |
+Rectangle make_dart_rectangle(r) => new Rectangle(r['top'], r['left'], r['width'], r['height']); |
+ |
+ |
+/** Expando for JsObject, used by every Dart class associated with a Javascript |
+ * class (e.g., DOM, WebAudio, etc.). |
+ */ |
+ |
+/** |
+ * Return the JsObject associated with a Dart class [dartClass_instance]. |
+ */ |
+js.JsObject unwrap_jso(dartClass_instance) { |
+ try { |
+ if (dartClass_instance != null) |
+ return dartClass_instance is! Function ? dartClass_instance.blink_jsObject : dartClass_instance; |
+ else |
+ return null; |
+// return dartClass_instance.dartium_expando[dartClass_instance.expandoJsObject]; |
+ } catch(NoSuchMethodException) { |
+ // No blink_jsObject then return the dartClass_instance is probably an |
+ // array that was already converted to a Dart class e.g., Uint8ClampedList. |
+ return dartClass_instance; |
+ } |
+} |
+ |
+/** |
+ * Create Dart class that maps to the JS Type, add the JsObject as an expando |
+ * on the Dart class and return the created Dart class. |
+ */ |
+wrap_jso(jsObject) { |
+try { |
+// debug_or_assert("jsObject != null", jsObject != null); |
+ if (jsObject is! js.JsObject) { |
+ // JS Interop converted the object to a Dart class e.g., Uint8ClampedList. |
+ return jsObject; |
+ } |
+ var constructor = jsObject['constructor']; |
+ debug_or_assert("constructor != null", constructor != null); |
+ var jsTypeName = constructor['name']; |
+ debug_or_assert("constructor != null && jsTypeName.length > 0", constructor != null && jsTypeName.length > 0); |
+ var func = getHtmlCreateFunction(jsTypeName); |
+ debug_or_assert("func != null name = ${jsTypeName}", func != null); |
+ var dartClass_instance = func(); |
+ dartClass_instance.blink_jsObject = jsObject; |
+// dartClass_instance.dartium_expando[dartClass_instance.expandoJsObject] = jsObject; |
+ return dartClass_instance; |
+} catch(e, stacktrace){ |
+ if (e is DebugAssertException) |
+ window.console.log("${e.message}\n ${stacktrace}"); |
+ else |
+ window.console.log("${stacktrace}"); |
+} |
+} |
+ |
+class DebugAssertException implements Exception { |
+ String message; |
+ DebugAssertException(this.message); |
+} |
+ |
+debug_or_assert(message, expression) { |
+ if (!expression) { |
+ throw new DebugAssertException("$message"); |
+ } |
+} |
+ |
+// Wrap JsObject node list to return a List<node>. |
+List<Node> wrap_jso_list(jso_nodes) { |
+ List<Node> nodes = new List<Node>(); |
+ var collectionLen = jso_nodes['length']; |
+ for (var i = 0; i < collectionLen; i++) { |
+ nodes.add(wrap_jso(jso_nodes.callMethod('item', [i]))); |
+ } |
+ var frozen_nodes = new _FrozenElementList._wrap(nodes); |
+ frozen_nodes.dartClass_instance = jso_nodes; |
+ return frozen_nodes; |
+} |
+$else |
+unwrap_jso(dartClass_instance) => dartClass_instance; |
+wrap_jso(jsObject) => jsObject; |
+wrap_jso_list(jso_nodes) => jso_nodes; |
+make_dart_rectangle(r) => r; |
+$endif |