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

Side by Side Diff: mojo/dart/embedder/dart_controller.cc

Issue 1027603002: Dart: Removes all but native calls and the handle watcher from the snapshot. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Fix SDK dir for SDK mojoms in Modular Created 5 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/callback.h" 5 #include "base/callback.h"
6 #include "base/files/file_util.h" 6 #include "base/files/file_util.h"
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/sys_info.h" 9 #include "base/sys_info.h"
10 #include "crypto/random.h" 10 #include "crypto/random.h"
11 #include "dart/runtime/include/dart_api.h" 11 #include "dart/runtime/include/dart_api.h"
12 #include "dart/runtime/include/dart_native_api.h" 12 #include "dart/runtime/include/dart_native_api.h"
13 #include "mojo/dart/embedder/builtin.h" 13 #include "mojo/dart/embedder/builtin.h"
14 #include "mojo/dart/embedder/dart_controller.h" 14 #include "mojo/dart/embedder/dart_controller.h"
15 #include "mojo/dart/embedder/isolate_data.h" 15 #include "mojo/dart/embedder/isolate_data.h"
16 #include "mojo/public/c/system/core.h" 16 #include "mojo/public/c/system/core.h"
17 17
18 namespace mojo { 18 namespace mojo {
19 namespace dart { 19 namespace dart {
20 20
21 extern const uint8_t* snapshot_buffer; 21 extern const uint8_t* snapshot_buffer;
22 22
23 const char* kDartScheme = "dart:"; 23 const char* kDartScheme = "dart:";
24 const char* kMojoScheme = "mojo:";
25 const char* kAsyncLibURL = "dart:async"; 24 const char* kAsyncLibURL = "dart:async";
26 const char* kInternalLibURL = "dart:_internal"; 25 const char* kInternalLibURL = "dart:_internal";
27 const char* kIsolateLibURL = "dart:isolate"; 26 const char* kIsolateLibURL = "dart:isolate";
28 const char* kIOLibURL = "dart:io"; 27 const char* kIOLibURL = "dart:io";
29 const char* kCoreLibURL = "dart:core"; 28 const char* kCoreLibURL = "dart:core";
30 29
31 static bool IsDartSchemeURL(const char* url_name) { 30 static bool IsDartSchemeURL(const char* url_name) {
32 static const intptr_t kDartSchemeLen = strlen(kDartScheme); 31 static const intptr_t kDartSchemeLen = strlen(kDartScheme);
33 // If the URL starts with "dart:" then it is considered as a special 32 // If the URL starts with "dart:" then it is considered as a special
34 // library URL which is handled differently from other URLs. 33 // library URL which is handled differently from other URLs.
35 return (strncmp(url_name, kDartScheme, kDartSchemeLen) == 0); 34 return (strncmp(url_name, kDartScheme, kDartSchemeLen) == 0);
36 } 35 }
37 36
38 static bool IsMojoSchemeURL(const char* url_name) {
39 static const intptr_t kMojoSchemeLen = strlen(kMojoScheme);
40 // If the URL starts with "mojo:" then it is considered as a special
41 // library URL which is handled differently from other URLs.
42 return (strncmp(url_name, kMojoScheme, kMojoSchemeLen) == 0);
43 }
44
45 static bool IsServiceIsolateURL(const char* url_name) { 37 static bool IsServiceIsolateURL(const char* url_name) {
46 if (url_name == nullptr) { 38 if (url_name == nullptr) {
47 return false; 39 return false;
48 } 40 }
49 static const intptr_t kServiceIsolateNameLen = 41 static const intptr_t kServiceIsolateNameLen =
50 strlen(DART_VM_SERVICE_ISOLATE_NAME); 42 strlen(DART_VM_SERVICE_ISOLATE_NAME);
51 return (strncmp(url_name, 43 return (strncmp(url_name,
52 DART_VM_SERVICE_ISOLATE_NAME, 44 DART_VM_SERVICE_ISOLATE_NAME,
53 kServiceIsolateNameLen) == 0); 45 kServiceIsolateNameLen) == 0);
54 } 46 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 library_url_string); 112 library_url_string);
121 } 113 }
122 114
123 // Handle URI canonicalization requests. 115 // Handle URI canonicalization requests.
124 const char* url_string = nullptr; 116 const char* url_string = nullptr;
125 result = Dart_StringToCString(url, &url_string); 117 result = Dart_StringToCString(url, &url_string);
126 if (tag == Dart_kCanonicalizeUrl) { 118 if (tag == Dart_kCanonicalizeUrl) {
127 if (Dart_IsError(result)) { 119 if (Dart_IsError(result)) {
128 return result; 120 return result;
129 } 121 }
130 const bool is_internal_scheme_url = 122 const bool is_internal_scheme_url = IsDartSchemeURL(url_string);
131 IsDartSchemeURL(url_string) || IsMojoSchemeURL(url_string);
132 // If this is a Dart Scheme URL, or a Mojo Scheme URL, then it is not 123 // If this is a Dart Scheme URL, or a Mojo Scheme URL, then it is not
133 // modified as it will be handled internally. 124 // modified as it will be handled internally.
134 if (is_internal_scheme_url) { 125 if (is_internal_scheme_url) {
135 return url; 126 return url;
136 } 127 }
137 // Resolve the url within the context of the library's URL. 128 // Resolve the url within the context of the library's URL.
138 Dart_Handle builtin_lib = 129 Dart_Handle builtin_lib =
139 Builtin::GetLibrary(Builtin::kBuiltinLibrary); 130 Builtin::GetLibrary(Builtin::kBuiltinLibrary);
140 return ResolveUri(library_url, url, builtin_lib); 131 return ResolveUri(library_url, url, builtin_lib);
141 } 132 }
142 133
143 if (tag == Dart_kImportTag) {
144 if (IsMojoSchemeURL(url_string)) {
145 Dart_Handle library = Dart_LookupLibrary(url);
146 DART_CHECK_VALID(library);
147 return library;
148 }
149 }
150
151 Dart_Handle builtin_lib = 134 Dart_Handle builtin_lib =
152 Builtin::GetLibrary(Builtin::kBuiltinLibrary); 135 Builtin::GetLibrary(Builtin::kBuiltinLibrary);
153 // Handle 'import' or 'part' requests for all other URIs. Call dart code to 136 // Handle 'import' or 'part' requests for all other URIs. Call dart code to
154 // read the source code asynchronously. 137 // read the source code asynchronously.
155 return LoadDataAsync_Invoke( 138 return LoadDataAsync_Invoke(
156 Dart_NewInteger(tag), url, library_url, builtin_lib, Dart_Null()); 139 Dart_NewInteger(tag), url, library_url, builtin_lib, Dart_Null());
157 } 140 }
158 141
159 static Dart_Handle SetWorkingDirectory(Dart_Handle builtin_lib) { 142 static Dart_Handle SetWorkingDirectory(Dart_Handle builtin_lib) {
160 base::FilePath current_dir; 143 base::FilePath current_dir;
(...skipping 23 matching lines...) Expand all
184 Dart_Handle core_lib = Dart_LookupLibrary(url); 167 Dart_Handle core_lib = Dart_LookupLibrary(url);
185 DART_CHECK_VALID(internal_lib); 168 DART_CHECK_VALID(internal_lib);
186 url = Dart_NewStringFromCString(kAsyncLibURL); 169 url = Dart_NewStringFromCString(kAsyncLibURL);
187 DART_CHECK_VALID(url); 170 DART_CHECK_VALID(url);
188 Dart_Handle async_lib = Dart_LookupLibrary(url); 171 Dart_Handle async_lib = Dart_LookupLibrary(url);
189 DART_CHECK_VALID(async_lib); 172 DART_CHECK_VALID(async_lib);
190 url = Dart_NewStringFromCString(kIsolateLibURL); 173 url = Dart_NewStringFromCString(kIsolateLibURL);
191 DART_CHECK_VALID(url); 174 DART_CHECK_VALID(url);
192 Dart_Handle isolate_lib = Dart_LookupLibrary(url); 175 Dart_Handle isolate_lib = Dart_LookupLibrary(url);
193 DART_CHECK_VALID(isolate_lib); 176 DART_CHECK_VALID(isolate_lib);
194 Dart_Handle mojo_core_lib = 177 Dart_Handle mojo_internal_lib =
195 Builtin::GetLibrary(Builtin::kMojoCoreLibrary); 178 Builtin::GetLibrary(Builtin::kMojoInternalLibrary);
196 DART_CHECK_VALID(mojo_core_lib); 179 DART_CHECK_VALID(mojo_internal_lib);
197 180
198 // We need to ensure that all the scripts loaded so far are finalized 181 // We need to ensure that all the scripts loaded so far are finalized
199 // as we are about to invoke some Dart code below to setup closures. 182 // as we are about to invoke some Dart code below to setup closures.
200 Dart_Handle result = Dart_FinalizeLoading(false); 183 Dart_Handle result = Dart_FinalizeLoading(false);
201 DART_CHECK_VALID(result); 184 DART_CHECK_VALID(result);
202 185
203 // Import dart:_internal into dart:mojo.builtin for setting up hooks. 186 // Import dart:_internal into dart:mojo.builtin for setting up hooks.
204 result = Dart_LibraryImportLibrary(builtin_lib, internal_lib, Dart_Null()); 187 result = Dart_LibraryImportLibrary(builtin_lib, internal_lib, Dart_Null());
205 DART_CHECK_VALID(result); 188 DART_CHECK_VALID(result);
206 189
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 296
314 DPCHECK(!Dart_IsServiceIsolate(isolate)); 297 DPCHECK(!Dart_IsServiceIsolate(isolate));
315 Dart_EnterScope(); 298 Dart_EnterScope();
316 299
317 Dart_IsolateSetStrictCompilation(strict_compilation); 300 Dart_IsolateSetStrictCompilation(strict_compilation);
318 301
319 // Setup the native resolvers for the builtin libraries as they are not set 302 // Setup the native resolvers for the builtin libraries as they are not set
320 // up when the snapshot is read. 303 // up when the snapshot is read.
321 CHECK(snapshot_buffer != nullptr); 304 CHECK(snapshot_buffer != nullptr);
322 Builtin::PrepareLibrary(Builtin::kBuiltinLibrary); 305 Builtin::PrepareLibrary(Builtin::kBuiltinLibrary);
323 Builtin::PrepareLibrary(Builtin::kMojoCoreLibrary); 306 Builtin::PrepareLibrary(Builtin::kMojoInternalLibrary);
324 307
325 if (!callbacks.create.is_null()) { 308 if (!callbacks.create.is_null()) {
326 callbacks.create.Run(script_uri.c_str(), 309 callbacks.create.Run(script_uri.c_str(),
327 "main", 310 "main",
328 package_root.c_str(), 311 package_root.c_str(),
329 isolate_data, 312 isolate_data,
330 error); 313 error);
331 } 314 }
332 315
333 // Set up the library tag handler for this isolate. 316 // Set up the library tag handler for this isolate.
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 config.error); 479 config.error);
497 if (isolate == nullptr) { 480 if (isolate == nullptr) {
498 return false; 481 return false;
499 } 482 }
500 483
501 Dart_EnterIsolate(isolate); 484 Dart_EnterIsolate(isolate);
502 Dart_Handle result; 485 Dart_Handle result;
503 Dart_EnterScope(); 486 Dart_EnterScope();
504 487
505 // Start the MojoHandleWatcher. 488 // Start the MojoHandleWatcher.
506 Dart_Handle mojo_core_lib = 489 Dart_Handle mojo_internal_lib =
507 Builtin::GetLibrary(Builtin::kMojoCoreLibrary); 490 Builtin::GetLibrary(Builtin::kMojoInternalLibrary);
508 DART_CHECK_VALID(mojo_core_lib); 491 DART_CHECK_VALID(mojo_internal_lib);
509 Dart_Handle handle_watcher_type = Dart_GetType( 492 Dart_Handle handle_watcher_type = Dart_GetType(
510 mojo_core_lib, 493 mojo_internal_lib,
511 Dart_NewStringFromCString("MojoHandleWatcher"), 494 Dart_NewStringFromCString("MojoHandleWatcher"),
512 0, 495 0,
513 nullptr); 496 nullptr);
514 DART_CHECK_VALID(handle_watcher_type); 497 DART_CHECK_VALID(handle_watcher_type);
515 result = Dart_Invoke( 498 result = Dart_Invoke(
516 handle_watcher_type, 499 handle_watcher_type,
517 Dart_NewStringFromCString("_start"), 500 Dart_NewStringFromCString("_start"),
518 0, 501 0,
519 nullptr); 502 nullptr);
520 DART_CHECK_VALID(result); 503 DART_CHECK_VALID(result);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 Dart_Cleanup(); 590 Dart_Cleanup();
608 initialized_ = false; 591 initialized_ = false;
609 return false; 592 return false;
610 } 593 }
611 594
612 Dart_EnterIsolate(root_isolate_); 595 Dart_EnterIsolate(root_isolate_);
613 Dart_Handle result; 596 Dart_Handle result;
614 Dart_EnterScope(); 597 Dart_EnterScope();
615 598
616 // Start the MojoHandleWatcher. 599 // Start the MojoHandleWatcher.
617 Dart_Handle mojo_core_lib = 600 Dart_Handle mojo_internal_lib =
618 Builtin::GetLibrary(Builtin::kMojoCoreLibrary); 601 Builtin::GetLibrary(Builtin::kMojoInternalLibrary);
619 DART_CHECK_VALID(mojo_core_lib); 602 DART_CHECK_VALID(mojo_internal_lib);
620 Dart_Handle handle_watcher_type = Dart_GetType( 603 Dart_Handle handle_watcher_type = Dart_GetType(
621 mojo_core_lib, 604 mojo_internal_lib,
622 Dart_NewStringFromCString("MojoHandleWatcher"), 605 Dart_NewStringFromCString("MojoHandleWatcher"),
623 0, 606 0,
624 nullptr); 607 nullptr);
625 DART_CHECK_VALID(handle_watcher_type); 608 DART_CHECK_VALID(handle_watcher_type);
626 result = Dart_Invoke( 609 result = Dart_Invoke(
627 handle_watcher_type, 610 handle_watcher_type,
628 Dart_NewStringFromCString("_start"), 611 Dart_NewStringFromCString("_start"),
629 0, 612 0,
630 nullptr); 613 nullptr);
631 DART_CHECK_VALID(result); 614 DART_CHECK_VALID(result);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 return true; 690 return true;
708 } 691 }
709 692
710 void DartController::Shutdown() { 693 void DartController::Shutdown() {
711 CHECK(root_isolate_ != nullptr); 694 CHECK(root_isolate_ != nullptr);
712 Dart_EnterIsolate(root_isolate_); 695 Dart_EnterIsolate(root_isolate_);
713 Dart_Handle result; 696 Dart_Handle result;
714 Dart_EnterScope(); 697 Dart_EnterScope();
715 698
716 // Stop the MojoHandleWatcher. 699 // Stop the MojoHandleWatcher.
717 Dart_Handle mojo_core_lib = 700 Dart_Handle mojo_internal_lib =
718 Builtin::GetLibrary(Builtin::kMojoCoreLibrary); 701 Builtin::GetLibrary(Builtin::kMojoInternalLibrary);
719 DART_CHECK_VALID(mojo_core_lib); 702 DART_CHECK_VALID(mojo_internal_lib);
720 Dart_Handle handle_watcher_type = Dart_GetType( 703 Dart_Handle handle_watcher_type = Dart_GetType(
721 mojo_core_lib, 704 mojo_internal_lib,
722 Dart_NewStringFromCString("MojoHandleWatcher"), 705 Dart_NewStringFromCString("MojoHandleWatcher"),
723 0, 706 0,
724 nullptr); 707 nullptr);
725 DART_CHECK_VALID(handle_watcher_type); 708 DART_CHECK_VALID(handle_watcher_type);
726 result = Dart_Invoke( 709 result = Dart_Invoke(
727 handle_watcher_type, 710 handle_watcher_type,
728 Dart_NewStringFromCString("_stop"), 711 Dart_NewStringFromCString("_stop"),
729 0, 712 0,
730 nullptr); 713 nullptr);
731 DART_CHECK_VALID(result); 714 DART_CHECK_VALID(result);
732 715
733 result = Dart_RunLoop(); 716 result = Dart_RunLoop();
734 DART_CHECK_VALID(result); 717 DART_CHECK_VALID(result);
735 718
736 Dart_ExitScope(); 719 Dart_ExitScope();
737 Dart_ShutdownIsolate(); 720 Dart_ShutdownIsolate();
738 Dart_Cleanup(); 721 Dart_Cleanup();
739 root_isolate_ = nullptr; 722 root_isolate_ = nullptr;
740 initialized_ = false; 723 initialized_ = false;
741 } 724 }
742 725
743 } // namespace apps 726 } // namespace apps
744 } // namespace mojo 727 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698