Index: sky/engine/core/script/dart_controller.cc |
diff --git a/sky/engine/core/script/dart_controller.cc b/sky/engine/core/script/dart_controller.cc |
index 80338ba8a09fae1cd1814509ad918776c44510c9..d84cb4ede74e755248642e3130f87901d1b8604a 100644 |
--- a/sky/engine/core/script/dart_controller.cc |
+++ b/sky/engine/core/script/dart_controller.cc |
@@ -27,6 +27,7 @@ |
#include "sky/engine/core/script/dart_dependency_catcher.h" |
#include "sky/engine/core/script/dart_loader.h" |
#include "sky/engine/core/script/dart_service_isolate.h" |
+#include "sky/engine/core/script/dart_snapshot_loader.h" |
#include "sky/engine/core/script/dom_dart_state.h" |
#include "sky/engine/public/platform/Platform.h" |
#include "sky/engine/tonic/dart_api_scope.h" |
@@ -40,6 +41,16 @@ |
#include "sky/engine/wtf/text/TextPosition.h" |
namespace blink { |
+namespace { |
+ |
+void CreateEmptyRootLibraryIfNeeded() { |
+ if (Dart_IsNull(Dart_RootLibrary())) { |
+ Dart_LoadScript(Dart_NewStringFromCString("dart:empty"), Dart_EmptyString(), |
+ 0, 0); |
+ } |
+} |
+ |
+} // namespace |
#if ENABLE(DART_STRICT) |
static const char* kCheckedModeArgs[] = {"--enable_asserts", |
@@ -126,6 +137,9 @@ void DartController::DidLoadMainLibrary(KURL url) { |
} |
void DartController::LoadMainLibrary(const KURL& url, mojo::URLResponsePtr response) { |
+ DartState::Scope scope(dart_state()); |
+ CreateEmptyRootLibraryIfNeeded(); |
+ |
DartLoader& loader = dart_state()->loader(); |
DartDependencyCatcher dependency_catcher(loader); |
loader.LoadLibrary(url, response.Pass()); |
@@ -133,13 +147,33 @@ void DartController::LoadMainLibrary(const KURL& url, mojo::URLResponsePtr respo |
base::Bind(&DartController::DidLoadMainLibrary, weak_factory_.GetWeakPtr(), url)); |
} |
+void DartController::DidLoadSnapshot() { |
+ DCHECK(Dart_CurrentIsolate() == nullptr); |
+ snapshot_loader_ = nullptr; |
+ |
+ Dart_Isolate isolate = dart_state()->isolate(); |
+ DartIsolateScope isolate_scope(isolate); |
+ DartApiScope dart_api_scope; |
+ |
+ Dart_Handle library = Dart_RootLibrary(); |
+ if (LogIfError(library)) |
+ return; |
+ DartInvokeAppField(library, ToDart("main"), 0, nullptr); |
+} |
+ |
+void DartController::LoadSnapshot(const KURL& url, mojo::URLResponsePtr response) { |
+ snapshot_loader_ = adoptPtr(new DartSnapshotLoader(dart_state())); |
+ snapshot_loader_->LoadSnapshot(url, response.Pass(), |
+ base::Bind(&DartController::DidLoadSnapshot, weak_factory_.GetWeakPtr())); |
+} |
+ |
void DartController::LoadScriptInModule( |
AbstractModule* module, |
const String& source, |
const TextPosition& position, |
const LoadFinishedCallback& finished_callback) { |
- DartIsolateScope isolate_scope(dart_state()->isolate()); |
- DartApiScope dart_api_scope; |
+ DartState::Scope scope(dart_state()); |
+ CreateEmptyRootLibraryIfNeeded(); |
DartDependencyCatcher dependency_catcher(dart_state()->loader()); |
Dart_Handle library_handle = CreateLibrary(module, source, position); |
@@ -274,6 +308,7 @@ static Dart_Isolate IsolateCreateCallback(const char* script_uri, |
// Create & start the handle watcher isolate |
CHECK(kDartIsolateSnapshotBuffer); |
+ // TODO(abarth): Who deletes this DartState instance? |
DartState* dart_state = new DartState(); |
Dart_Isolate isolate = |
Dart_CreateIsolate("sky:handle_watcher", "", kDartIsolateSnapshotBuffer, |
@@ -289,9 +324,8 @@ static Dart_Isolate IsolateCreateCallback(const char* script_uri, |
Builtin::SetNativeResolver(Builtin::kMojoInternalLibrary); |
Builtin::SetNativeResolver(Builtin::kIOLibrary); |
- // Ensure the isolate has a root library. |
- Dart_LoadScript(Dart_NewStringFromCString("dart:empty"), |
- Dart_NewStringFromCString(""), 0, 0); |
+ if (!script_uri) |
+ CreateEmptyRootLibraryIfNeeded(); |
} |
Dart_ExitIsolate(); |
@@ -334,10 +368,6 @@ void DartController::CreateIsolateFor(PassOwnPtr<DOMDartState> state) { |
{ |
DartApiScope apiScope; |
- // Ensure the isolate has a root library. |
- Dart_LoadScript(Dart_NewStringFromCString("dart:empty"), |
- Dart_NewStringFromCString(""), 0, 0); |
- |
Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); |
Builtin::SetNativeResolver(Builtin::kMojoInternalLibrary); |
Builtin::SetNativeResolver(Builtin::kIOLibrary); |