Index: client/dom/scripts/template_wrapping_dom.js |
diff --git a/client/dom/scripts/template_wrapping_dom.js b/client/dom/scripts/template_wrapping_dom.js |
index 3f220aa3e82ad938c354a69f5c727ace07f35013..c04566b24f730b65a8c6abdf9703d23f281fca49 100644 |
--- a/client/dom/scripts/template_wrapping_dom.js |
+++ b/client/dom/scripts/template_wrapping_dom.js |
@@ -251,16 +251,8 @@ function __dom_wrap_primitive(ptr) { |
return (ptr === null) ? (void 0) : ptr; |
} |
- |
-function __dom_finish_unwrap_function(fn, unwrapped) { |
- fn.$dom = unwrapped; |
- var isolatetoken = __dom_isolate_token(); |
- __dom_set_cached('dart_wrapper', unwrapped, isolatetoken, fn); |
- return unwrapped; |
-} |
- |
/** @suppress {duplicate} */ |
-function __dom_unwrap(obj) { |
+function __dom_unwrap(obj, dropargs) { |
if (obj == null) { |
return (void 0); |
} |
@@ -268,12 +260,31 @@ function __dom_unwrap(obj) { |
return obj.$dom; |
} |
if (obj instanceof Function) { // BUGBUG: function from other IFrame |
- var unwrapped = function () { |
- var args = Array.prototype.slice.call(arguments); |
- return $dartcall(obj, args.map(__dom_wrap)); |
+ var isolatetoken = __dom_isolate_token(); |
+ var unwrapped = __dom_get_cached('dart_unwrapped', obj, isolatetoken); |
+ if (unwrapped) { |
+ return unwrapped; |
+ } |
+ var isolate = isolate$current; |
+ unwrapped = function () { |
+ var old = isolate$current; |
+ isolate$current = isolate; |
+ try { |
+ if (dropargs) { |
+ return $dartcall(obj, []); |
+ } else { |
+ var args = Array.prototype.slice.call(arguments); |
+ return $dartcall(obj, args.map(__dom_wrap)); |
+ } |
+ } finally { |
+ isolate$current = old; |
+ // TODO(vsm): This really needs to go elsewhere. |
+ isolate$runEventLoop(); |
+ } |
// BUGBUG? Should the result be unwrapped? Or is it always void/bool ? |
}; |
- return __dom_finish_unwrap_function(obj, unwrapped); |
+ __dom_set_cached('dart_unwrapped', obj, isolatetoken, unwrapped); |
+ return unwrapped; |
} |
return obj; |
} |
@@ -282,9 +293,7 @@ function __dom_unwrap_TimeoutHandler_function(fn) { |
// Some browsers (e.g. FF) pass data to the timeout function, others do not. |
// Dart's TimeoutHandler takes no arguments, so drop any arguments passed to |
// the unwrapped callback. |
- return __dom_finish_unwrap_function( |
- fn, |
- function() { return $dartcall(fn, []); }); |
+ return __dom_unwrap(fn, true); |
} |
// Declared in src/GlobalProperties.dart |