Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(698)

Unified Diff: client/dom/scripts/template_wrapping_dom.js

Issue 8370031: Fix for events fired on different isolates. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove Isolate.bind. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698