Index: sky/engine/bindings/builtin_natives.cc |
diff --git a/sky/engine/bindings/builtin_natives.cc b/sky/engine/bindings/builtin_natives.cc |
index 55584a3d0171a69da9eeecb9eed65ab9f432fc1e..3583bafd4493c293479575ffe28f12e4ee050a66 100644 |
--- a/sky/engine/bindings/builtin_natives.cc |
+++ b/sky/engine/bindings/builtin_natives.cc |
@@ -87,7 +87,7 @@ static Dart_Handle GetClosure(Dart_Handle builtin_library, const char* name) { |
return closure; |
} |
-static void InitDartInternal(Dart_Handle builtin_library) { |
+static void InitDartInternal(Dart_Handle builtin_library, bool dom_isolate) { |
Dart_Handle print = GetClosure(builtin_library, "_getPrintClosure"); |
Dart_Handle timer = GetClosure(builtin_library, "_getCreateTimerClosure"); |
@@ -96,35 +96,51 @@ static void InitDartInternal(Dart_Handle builtin_library) { |
DART_CHECK_VALID(Dart_SetField( |
internal_library, ToDart("_printClosure"), print)); |
- Dart_Handle vm_hooks_name = ToDart("VMLibraryHooks"); |
- Dart_Handle vm_hooks = Dart_GetClass(internal_library, vm_hooks_name); |
- DART_CHECK_VALID(vm_hooks); |
- Dart_Handle timer_name = ToDart("timerFactory"); |
- DART_CHECK_VALID(Dart_SetField(vm_hooks, timer_name, timer)); |
+ if (dom_isolate) { |
+ Dart_Handle vm_hooks_name = ToDart("VMLibraryHooks"); |
+ Dart_Handle vm_hooks = Dart_GetClass(internal_library, vm_hooks_name); |
+ DART_CHECK_VALID(vm_hooks); |
+ Dart_Handle timer_name = ToDart("timerFactory"); |
+ DART_CHECK_VALID(Dart_SetField(vm_hooks, timer_name, timer)); |
+ } else { |
+ Dart_Handle io_lib = DartBuiltin::LookupLibrary("dart:io"); |
+ Dart_Handle setup_hooks = Dart_NewStringFromCString("_setupHooks"); |
+ DART_CHECK_VALID(Dart_Invoke(io_lib, setup_hooks, 0, NULL)); |
+ Dart_Handle isolate_lib = DartBuiltin::LookupLibrary("dart:isolate"); |
+ DART_CHECK_VALID(Dart_Invoke(isolate_lib, setup_hooks, 0, NULL)); |
+ } |
} |
-static void InitDartCore(Dart_Handle builtin) { |
+static void InitDartCore(Dart_Handle builtin, bool dom_isolate) { |
Dart_Handle get_base_url = GetClosure(builtin, "_getGetBaseURLClosure"); |
Dart_Handle core_library = DartBuiltin::LookupLibrary("dart:core"); |
DART_CHECK_VALID(Dart_SetField(core_library, |
ToDart("_uriBaseClosure"), get_base_url)); |
} |
-static void InitDartAsync(Dart_Handle builtin_library) { |
- Dart_Handle schedule_microtask = |
- GetClosure(builtin_library, "_getScheduleMicrotaskClosure"); |
+static void InitDartAsync(Dart_Handle builtin_library, bool dom_isolate) { |
+ Dart_Handle schedule_microtask; |
+ if (dom_isolate) { |
+ schedule_microtask = |
+ GetClosure(builtin_library, "_getScheduleMicrotaskClosure"); |
+ } else { |
+ Dart_Handle isolate_lib = DartBuiltin::LookupLibrary("dart:isolate"); |
+ Dart_Handle method_name = |
+ Dart_NewStringFromCString("_getIsolateScheduleImmediateClosure"); |
+ schedule_microtask = Dart_Invoke(isolate_lib, method_name, 0, NULL); |
+ } |
Dart_Handle async_library = DartBuiltin::LookupLibrary("dart:async"); |
Dart_Handle set_schedule_microtask = ToDart("_setScheduleImmediateClosure"); |
DART_CHECK_VALID(Dart_Invoke(async_library, set_schedule_microtask, 1, |
&schedule_microtask)); |
} |
-void BuiltinNatives::Init() { |
+void BuiltinNatives::Init(bool dom_isolate) { |
Dart_Handle builtin = Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); |
DART_CHECK_VALID(builtin); |
- InitDartInternal(builtin); |
- InitDartCore(builtin); |
- InitDartAsync(builtin); |
+ InitDartInternal(builtin, dom_isolate); |
+ InitDartCore(builtin, dom_isolate); |
+ InitDartAsync(builtin, dom_isolate); |
} |
// Implementation of native functions which are used for some |
@@ -163,6 +179,7 @@ void ScheduleMicrotask(Dart_NativeArguments args) { |
if (LogIfError(closure) || !Dart_IsClosure(closure)) |
return; |
DartState* dart_state = DartState::Current(); |
+ CHECK(dart_state); |
Microtask::enqueueMicrotask(base::Bind(&ExecuteMicrotask, |
dart_state->GetWeakPtr(), DartValue::Create(dart_state, closure))); |
} |
@@ -182,6 +199,7 @@ void Timer_create(Dart_NativeArguments args) { |
DART_CHECK_VALID(Dart_GetNativeBooleanArgument(args, 2, &repeating)); |
DOMDartState* state = DOMDartState::Current(); |
+ CHECK(state); |
int timer_id = DOMTimer::install(state->document(), |
ScheduledAction::Create(state, closure), |
milliseconds, |
@@ -194,6 +212,7 @@ void Timer_cancel(Dart_NativeArguments args) { |
DART_CHECK_VALID(Dart_GetNativeIntegerArgument(args, 0, &timer_id)); |
DOMDartState* state = DOMDartState::Current(); |
+ CHECK(state); |
DOMTimer::removeByID(state->document(), timer_id); |
} |