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

Unified Diff: sky/engine/core/script/dart_controller.cc

Issue 919883002: Allow sky apps to be consumers of mojo services (Closed) Base URL: https://github.com/eseidel/skydart.git@master
Patch Set: Created 5 years, 10 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: 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 dfa7dd2fbada46a6a11cfa93aac2c4d6ed6b5f7c..9943db455fc7110c50adaa871a49373d22ed57d4 100644
--- a/sky/engine/core/script/dart_controller.cc
+++ b/sky/engine/core/script/dart_controller.cc
@@ -7,6 +7,7 @@
#include "base/bind.h"
#include "base/logging.h"
+#include "base/single_thread_task_runner.h"
#include "sky/engine/bindings2/builtin.h"
#include "sky/engine/bindings2/builtin_natives.h"
#include "sky/engine/bindings2/builtin_sky.h"
@@ -20,6 +21,7 @@
#include "sky/engine/core/script/dart_dependency_catcher.h"
#include "sky/engine/core/script/dart_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"
#include "sky/engine/tonic/dart_class_library.h"
#include "sky/engine/tonic/dart_error.h"
@@ -109,16 +111,76 @@ static void UnhandledExceptionCallback(Dart_Handle error) {
static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
Dart_Handle library,
Dart_Handle url) {
- DOMDartState* dart_state = DOMDartState::Current();
- return dart_state->loader().HandleLibraryTag(tag, library, url);
+ return DartLoader::HandleLibraryTag(tag, library, url);
}
static void IsolateShutdownCallback(void* callback_data) {
- DartState* dart_state = static_cast<DartState*>(callback_data);
- DCHECK(dart_state);
// TODO(dart)
}
+static bool IsServiceIsolateURL(const char* url_name) {
+ if (url_name == nullptr) {
+ return false;
+ }
+ static const intptr_t kServiceIsolateNameLen =
+ strlen(DART_VM_SERVICE_ISOLATE_NAME);
+ return (strncmp(url_name,
+ DART_VM_SERVICE_ISOLATE_NAME,
+ kServiceIsolateNameLen) == 0);
abarth-chromium 2015/02/12 03:29:33 Is there some reason we can't use WTF in this func
rafaelw 2015/02/12 18:54:55 Done.
+}
+
+// TODO(rafaelw): Right now this only supports the creation of the handle watcher
+// isolate. Presumably, we'll want application isolates to spawn their own isolates.
+static Dart_Isolate IsolateCreateCallback(const char* script_uri,
+ const char* main,
+ const char* package_root,
+ void* callback_data,
+ char** error) {
+
+ if (IsServiceIsolateURL(script_uri)) {
+ return Dart_CreateIsolate(script_uri, "main", kDartSnapshotBuffer, nullptr,
+ error);
+ }
+
+ // Create & start the handle watcher isolate
+ CHECK(kDartSnapshotBuffer);
+ DartState* dart_state = new DartState();
+ Dart_Isolate isolate = Dart_CreateIsolate("", "", kDartSnapshotBuffer,
abarth-chromium 2015/02/12 03:29:33 Should we give this some sort of name to help debu
rafaelw 2015/02/12 18:54:55 Done.
+ dart_state, error);
+ CHECK(isolate) << error;
+ dart_state->set_isolate(isolate);
+
+ CHECK(!LogIfError(Dart_SetLibraryTagHandler(LibraryTagHandler)));
+
+ {
+ DartApiScope apiScope;
+ Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
+ Builtin::SetNativeResolver(Builtin::kMojoCoreLibrary);
+ }
+
+ Dart_ExitIsolate();
+
+ CHECK(Dart_IsolateMakeRunnable(isolate));
+ return isolate;
+}
+
+static void CallHandleMessage(base::WeakPtr<DartState> dart_state) {
+ if (!dart_state)
+ return;
+
+ DartIsolateScope scope(dart_state->isolate());
+ DartApiScope api_scope;
+ LogIfError(Dart_HandleMessage());
+}
+
+static void MessageNotifyCallback(Dart_Isolate dest_isolate) {
+ DCHECK(Platform::current());
+ Platform::current()->mainThreadTaskRunner()->PostTask(FROM_HERE,
+ base::Bind(&CallHandleMessage, DartState::From(dest_isolate)->GetWeakPtr()));
+}
+
+static bool handle_watcher_started = false;
abarth-chromium 2015/02/12 03:29:33 handle_watcher_started -> g_handle_watcher_started
rafaelw 2015/02/12 18:54:55 Done.
+
void DartController::CreateIsolateFor(Document* document) {
DCHECK(document);
CHECK(kDartSnapshotBuffer);
@@ -127,6 +189,7 @@ void DartController::CreateIsolateFor(Document* document) {
Dart_Isolate isolate = Dart_CreateIsolate(
document->url().string().utf8().data(), "main", kDartSnapshotBuffer,
static_cast<DartState*>(dom_dart_state_.get()), &error);
+ Dart_SetMessageNotifyCallback(MessageNotifyCallback);
CHECK(isolate) << error;
dom_dart_state_->set_isolate(isolate);
Dart_SetGcCallbacks(DartGCPrologue, DartGCEpilogue);
@@ -136,6 +199,7 @@ void DartController::CreateIsolateFor(Document* document) {
DartApiScope apiScope;
Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
+ Builtin::SetNativeResolver(Builtin::kMojoCoreLibrary);
BuiltinNatives::Init();
builtin_sky_ = adoptPtr(new BuiltinSky(dart_state()));
@@ -143,6 +207,29 @@ void DartController::CreateIsolateFor(Document* document) {
builtin_sky_->InstallWindow(dart_state());
document->frame()->loaderClient()->didCreateIsolate(isolate);
+
+ if (!handle_watcher_started) {
abarth-chromium 2015/02/12 03:29:33 Can you move this code into an EnsureHandleWatcher
rafaelw 2015/02/12 18:54:55 Done.
+ // TODO(dart): We need to shutdown the handle watcher isolate when sky is exiting
abarth-chromium 2015/02/12 03:29:33 Looks like we need to call Dart_Cleanup during bli
rafaelw 2015/02/12 18:54:55 Changed the comment
+ Dart_Handle mojo_core_lib =
+ Builtin::LoadAndCheckLibrary(Builtin::kMojoCoreLibrary);
+ CHECK(!LogIfError((mojo_core_lib)));
+ Dart_Handle handle_watcher_type = Dart_GetType(
+ mojo_core_lib,
+ Dart_NewStringFromCString("MojoHandleWatcher"),
+ 0,
+ nullptr);
+ CHECK(!LogIfError(handle_watcher_type));
+ CHECK(!LogIfError(Dart_Invoke(
+ handle_watcher_type,
+ Dart_NewStringFromCString("_start"),
+ 0,
+ nullptr)));
+
+ // RunLoop until the handle watcher isolate is spun-up.
+ CHECK(!LogIfError(Dart_RunLoop()));
+
+ handle_watcher_started = true;
+ }
}
Dart_ExitIsolate();
}
@@ -155,7 +242,7 @@ void DartController::ClearForClose() {
void DartController::InitVM() {
CHECK(Dart_SetVMFlags(0, NULL));
- CHECK(Dart_Initialize(nullptr,
+ CHECK(Dart_Initialize(IsolateCreateCallback,
nullptr, // Isolate interrupt callback.
UnhandledExceptionCallback, IsolateShutdownCallback,
// File IO callbacks.

Powered by Google App Engine
This is Rietveld 408576698