diff --git a/sky/engine/core/BUILD.gn b/sky/engine/core/BUILD.gn index c2beda2d220..18fbed60e38 100644 --- a/sky/engine/core/BUILD.gn +++ b/sky/engine/core/BUILD.gn @@ -47,17 +47,12 @@ source_set("prerequisites") { } dart_embedder_resources("generate_sky_embedder_service_isolate_resources_cc") { - deps = [ - "//mojo/dart/observatory:deploy_observatory", - ] inputs = [ "//sky/engine/core/script/dart_service_isolate/loader.dart", "//sky/engine/core/script/dart_service_isolate/main.dart", - "//sky/engine/core/script/dart_service_isolate/resources.dart", "//sky/engine/core/script/dart_service_isolate/server.dart", ] root_prefix = "//sky/engine/core/script/" - input_directory = "$root_out_dir/observatory/deployed/web/" output = "$target_gen_dir/sky_embedder_service_isolate_resources.cc" table_name = "sky_embedder_service_isolate" } @@ -74,6 +69,7 @@ static_library("core") { "//sky/services/pointer:interfaces", "//dart/runtime/bin:embedded_dart_io", "//dart/runtime:libdart", + "//dart/runtime/observatory:embedded_observatory_archive", "//dart/runtime/vm:libdart_platform", "//mojo/services/navigation/interfaces", ] diff --git a/sky/engine/core/script/dart_init.cc b/sky/engine/core/script/dart_init.cc index 8a961f636d9..ce488e93238 100644 --- a/sky/engine/core/script/dart_init.cc +++ b/sky/engine/core/script/dart_init.cc @@ -30,6 +30,19 @@ #include "sky/engine/tonic/dart_snapshot_loader.h" #include "sky/engine/tonic/dart_state.h" #include "sky/engine/tonic/dart_wrappable.h" +#include "sky/engine/tonic/uint8_list.h" + +namespace dart { +namespace observatory { + +// These two symbols are defined in |observatory_archive.cc| which is generated +// by the |//dart/runtime/observatory:archive_observatory| rule. Both of these +// symbols will be part of the data segment and therefore are read only. +extern unsigned int observatory_assets_archive_len; +extern const uint8_t* observatory_assets_archive; + +} // namespace observatory +} // namespace dart namespace blink { @@ -175,6 +188,12 @@ Dart_Isolate IsolateCreateCallback(const char* script_uri, return isolate; } +Dart_Handle GetVMServiceAssetsArchiveCallback() { + return DartConverter::ToDart( + ::dart::observatory::observatory_assets_archive, + ::dart::observatory::observatory_assets_archive_len); +} + } // namespace #if DART_ALLOW_DYNAMIC_RESOLUTION @@ -270,7 +289,7 @@ void InitDartVM() { // Entroy source nullptr, // VM service assets archive - nullptr) == nullptr); + GetVMServiceAssetsArchiveCallback) == nullptr); // Wait for load port- ensures handle watcher and service isolates are // running. Dart_ServiceWaitForLoadPort(); diff --git a/sky/engine/core/script/dart_service_isolate/main.dart b/sky/engine/core/script/dart_service_isolate/main.dart index 32f1a35b1c3..34f00a90b00 100644 --- a/sky/engine/core/script/dart_service_isolate/main.dart +++ b/sky/engine/core/script/dart_service_isolate/main.dart @@ -11,7 +11,6 @@ import 'dart:isolate'; import 'dart:_vmservice'; part 'loader.dart'; -part 'resources.dart'; part 'server.dart'; // The TCP ip/port that the HTTP server listens on. @@ -22,6 +21,7 @@ bool _autoStart; // HTTP server. Server server; +Map assets; _onShutdown() { if (server != null) { @@ -34,8 +34,11 @@ _onShutdown() { } void _bootServer() { - // Load resources. - _triggerResourceLoad(); + try { + assets = Asset.request(); + } catch (e) { + print('Could not load Observatory assets: $e'); + } // Lazily create service. var service = new VMService(); service.onShutdown = _onShutdown; diff --git a/sky/engine/core/script/dart_service_isolate/resources.dart b/sky/engine/core/script/dart_service_isolate/resources.dart deleted file mode 100644 index 5115118e450..00000000000 --- a/sky/engine/core/script/dart_service_isolate/resources.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of sky_shell_dart_controller_service_isolate; - -String detectMimeType(String name) { - var extensionStart = name.lastIndexOf('.'); - var extension = name.substring(extensionStart+1); - switch (extension) { - case 'html': - return 'text/html; charset=UTF-8'; - case 'dart': - return 'application/dart; charset=UTF-8'; - case 'js': - return 'application/javascript; charset=UTF-8'; - case 'css': - return 'text/css; charset=UTF-8'; - case 'gif': - return 'image/gif'; - case 'png': - return 'image/png'; - case 'jpg': - return 'image/jpeg'; - case 'jpeg': - return 'image/jpeg'; - case 'svg': - return 'image/svg+xml'; - default: - return 'text/plain'; - } -} - - -class Resource { - final String name; - final String mimeType; - final List data; - Resource(this.name, this.mimeType, this.data); - static final Map resources = new Map(); -} - - -_addResource(String name, List data) { - var mimeType = detectMimeType(name); - Resource resource = new Resource(name, mimeType, data); - Resource.resources[name] = resource; -} - -_triggerResourceLoad() native "ServiceIsolate_TriggerResourceLoad"; diff --git a/sky/engine/core/script/dart_service_isolate/server.dart b/sky/engine/core/script/dart_service_isolate/server.dart index 186701d9f96..e41b789da7a 100644 --- a/sky/engine/core/script/dart_service_isolate/server.dart +++ b/sky/engine/core/script/dart_service_isolate/server.dart @@ -138,16 +138,16 @@ class Server { return; } - var resource = Resource.resources[path]; - if (resource == null && _shouldServeObservatory(request)) { - resource = Resource.resources[ROOT_REDIRECT_PATH]; - assert(resource != null); + Asset asset = assets[path]; + if (asset == null && _shouldServeObservatory(request)) { + asset = assets[ROOT_REDIRECT_PATH]; + assert(asset != null); } - if (resource != null) { + if (asset != null) { // Serving up a static resource (e.g. .css, .html, .png). request.response.headers.contentType = - ContentType.parse(resource.mimeType); - request.response.add(resource.data); + ContentType.parse(asset.mimeType); + request.response.add(asset.data); request.response.close(); return; } diff --git a/sky/engine/tonic/uint8_list.cc b/sky/engine/tonic/uint8_list.cc index b47235040c4..0a2458e18c2 100644 --- a/sky/engine/tonic/uint8_list.cc +++ b/sky/engine/tonic/uint8_list.cc @@ -48,4 +48,23 @@ void DartConverter::SetReturnValue(Dart_NativeArguments args, Dart_SetReturnValue(args, val.dart_handle()); } +Dart_Handle DartConverter::ToDart(const uint8_t* buffer, + unsigned int length) { + const intptr_t buffer_length = static_cast(length); + Dart_Handle array = Dart_NewTypedData(Dart_TypedData_kUint8, buffer_length); + DCHECK(!LogIfError(array)); + { + Dart_TypedData_Type type; + void* data = nullptr; + intptr_t data_length = 0; + Dart_TypedDataAcquireData(array, &type, &data, &data_length); + CHECK_EQ(type, Dart_TypedData_kUint8); + CHECK(data); + CHECK_EQ(data_length, buffer_length); + memmove(data, buffer, data_length); + Dart_TypedDataReleaseData(array); + } + return array; +} + } // namespace blink diff --git a/sky/engine/tonic/uint8_list.h b/sky/engine/tonic/uint8_list.h index 963d039115e..a54349adb9d 100644 --- a/sky/engine/tonic/uint8_list.h +++ b/sky/engine/tonic/uint8_list.h @@ -54,6 +54,8 @@ struct DartConverter { static Uint8List FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, Dart_Handle& exception); + + static Dart_Handle ToDart(const uint8_t* buffer, unsigned int length); }; } // namespace blink diff --git a/sky/packages/sky_engine/BUILD.gn b/sky/packages/sky_engine/BUILD.gn index 3c7a8c93fda..c3b45ac3ce2 100644 --- a/sky/packages/sky_engine/BUILD.gn +++ b/sky/packages/sky_engine/BUILD.gn @@ -32,7 +32,6 @@ dart_pkg("sky_engine") { "//sky/engine/bindings/internals.dart", "$service_isolate_dir/main.dart", "$service_isolate_dir/loader.dart", - "$service_isolate_dir/resources.dart", "$service_isolate_dir/server.dart", ] sdk_ext_mappings = [