| Index: mojo/dart/embedder/dart_controller.cc | 
| diff --git a/mojo/dart/embedder/dart_controller.cc b/mojo/dart/embedder/dart_controller.cc | 
| index 6c8f0c7c490db1cf008406a2aae211ca43be5b67..1a2274290891ff2e800a20416d9883db8aecfef4 100644 | 
| --- a/mojo/dart/embedder/dart_controller.cc | 
| +++ b/mojo/dart/embedder/dart_controller.cc | 
| @@ -20,6 +20,7 @@ namespace dart { | 
| extern const uint8_t* snapshot_buffer; | 
|  | 
| const char* kDartScheme = "dart:"; | 
| +const char* kMojoScheme = "mojo:"; | 
| const char* kAsyncLibURL = "dart:async"; | 
| const char* kInternalLibURL = "dart:_internal"; | 
| const char* kIsolateLibURL = "dart:isolate"; | 
| @@ -32,6 +33,13 @@ static bool IsDartSchemeURL(const char* url_name) { | 
| return (strncmp(url_name, kDartScheme, kDartSchemeLen) == 0); | 
| } | 
|  | 
| +static bool IsMojoSchemeURL(const char* url_name) { | 
| +  static const intptr_t kMojoSchemeLen = strlen(kMojoScheme); | 
| +  // If the URL starts with "mojo:" then it is considered as a special | 
| +  // library URL which is handled differently from other URLs. | 
| +  return (strncmp(url_name, kMojoScheme, kMojoSchemeLen) == 0); | 
| +} | 
| + | 
| static bool IsServiceIsolateURL(const char* url_name) { | 
| if (url_name == nullptr) { | 
| return false; | 
| @@ -111,16 +119,17 @@ static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, | 
| } | 
|  | 
| // Handle URI canonicalization requests. | 
| +  const char* url_string = nullptr; | 
| +  result = Dart_StringToCString(url, &url_string); | 
| if (tag == Dart_kCanonicalizeUrl) { | 
| -    const char* url_string = nullptr; | 
| -    result = Dart_StringToCString(url, &url_string); | 
| if (Dart_IsError(result)) { | 
| return result; | 
| } | 
| -    bool is_dart_scheme_url = IsDartSchemeURL(url_string); | 
| -    // If this is a Dart Scheme URL then it is not modified as it will be | 
| -    // handled internally. | 
| -    if (is_dart_scheme_url) { | 
| +    const bool is_internal_scheme_url = | 
| +        IsDartSchemeURL(url_string) || IsMojoSchemeURL(url_string); | 
| +    // If this is a Dart Scheme URL, or a Mojo Scheme URL, then it is not | 
| +    // modified as it will be handled internally. | 
| +    if (is_internal_scheme_url) { | 
| return url; | 
| } | 
| // Resolve the url within the context of the library's URL. | 
| @@ -129,6 +138,14 @@ static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, | 
| return ResolveUri(library_url, url, builtin_lib); | 
| } | 
|  | 
| +  if (tag == Dart_kImportTag) { | 
| +    if (IsMojoSchemeURL(url_string)) { | 
| +      Dart_Handle library = Dart_LookupLibrary(url); | 
| +      DART_CHECK_VALID(library); | 
| +      return library; | 
| +    } | 
| +  } | 
| + | 
| Dart_Handle builtin_lib = | 
| Builtin::GetLibrary(Builtin::kBuiltinLibrary); | 
| // Handle 'import' or 'part' requests for all other URIs. Call dart code to | 
| @@ -156,7 +173,11 @@ static Dart_Handle SetWorkingDirectory(Dart_Handle builtin_lib) { | 
| static Dart_Handle PrepareScriptForLoading(const std::string& package_root, | 
| Dart_Handle builtin_lib) { | 
| // First ensure all required libraries are available. | 
| -  Dart_Handle url = Dart_NewStringFromCString(kAsyncLibURL); | 
| +  Dart_Handle url = Dart_NewStringFromCString(kInternalLibURL); | 
| +  DART_CHECK_VALID(url); | 
| +  Dart_Handle internal_lib = Dart_LookupLibrary(url); | 
| +  DART_CHECK_VALID(internal_lib); | 
| +  url = Dart_NewStringFromCString(kAsyncLibURL); | 
| DART_CHECK_VALID(url); | 
| Dart_Handle async_lib = Dart_LookupLibrary(url); | 
| DART_CHECK_VALID(async_lib); | 
| @@ -173,16 +194,16 @@ static Dart_Handle PrepareScriptForLoading(const std::string& package_root, | 
| Dart_Handle result = Dart_FinalizeLoading(false); | 
| DART_CHECK_VALID(result); | 
|  | 
| +  // Import dart:_internal into mojo:builtin for setting up hooks. | 
| +  result = Dart_LibraryImportLibrary(builtin_lib, internal_lib, Dart_Null()); | 
| +  DART_CHECK_VALID(result); | 
| + | 
| // Setup the internal library's 'internalPrint' function. | 
| Dart_Handle print = Dart_Invoke(builtin_lib, | 
| Dart_NewStringFromCString("_getPrintClosure"), | 
| 0, | 
| nullptr); | 
| DART_CHECK_VALID(print); | 
| -  url = Dart_NewStringFromCString(kInternalLibURL); | 
| -  DART_CHECK_VALID(url); | 
| -  Dart_Handle internal_lib = Dart_LookupLibrary(url); | 
| -  DART_CHECK_VALID(internal_lib); | 
| result = Dart_SetField(internal_lib, | 
| Dart_NewStringFromCString("_printClosure"), | 
| print); | 
|  |