提交 ec1f3271 编写于 作者: A Adam Barth

Stocks.apk should have icons when run offline

This CL adds the concept of a root asset bundle to Sky. If the Sky app was
launched from a bundle, the root bundle is that bundle.

This CL teaches icon.dart to default to loading icons out of the root bundle,
if a root bundle exists. The next result is that Stocks has icons when run
offline because the icons are present in stock's skyx bundle.

TBR=eseidel@google.com

Review URL: https://codereview.chromium.org/1208273003.
上级 9ab6d395
......@@ -8,7 +8,8 @@ library sky.internals;
void notifyTestComplete(String test_result) native "notifyTestComplete";
int takeShellProxyHandle() native "takeShellProxyHandle";
int takeRootBundleHandle() native "takeRootBundleHandle";
int takeServiceRegistry() native "takeServiceRegistry";
int takeServicesProvidedByEmbedder() native "takeServicesProvidedByEmbedder";
int takeServicesProvidedToEmbedder() native "takeServicesProvidedToEmbedder";
int takeServiceRegistry() native "takeServiceRegistry";
int takeShellProxyHandle() native "takeShellProxyHandle";
......@@ -4,6 +4,7 @@
import 'dart:async';
import 'dart:sky' as sky;
import "dart:sky.internals" as internals;
import 'package:mojo/core.dart' as core;
import 'package:mojom/mojo/asset_bundle/asset_bundle.mojom.dart';
......@@ -66,3 +67,15 @@ class MojoAssetBundle extends AssetBundle {
});
}
}
AssetBundle _initRootBundle() {
try {
AssetBundleProxy bundle = new AssetBundleProxy.fromHandle(
new core.MojoHandle(internals.takeRootBundleHandle()));
return new MojoAssetBundle(bundle);
} catch (e) {
return null;
}
}
final AssetBundle rootBundle = _initRootBundle();
......@@ -5,8 +5,14 @@
import '../mojo/asset_bundle.dart';
import 'basic.dart';
const String _kAssetBase = '/packages/sky/assets/material-design-icons/';
final AssetBundle _iconBundle = new NetworkAssetBundle(Uri.base.resolve(_kAssetBase));
AssetBundle _initIconBundle() {
if (rootBundle != null)
return rootBundle;
const String _kAssetBase = '/packages/sky/assets/material-design-icons/';
return new NetworkAssetBundle(Uri.base.resolve(_kAssetBase));
}
final AssetBundle _iconBundle = _initIconBundle();
class Icon extends Component {
Icon({ String key, this.size, this.type: '' }) : super(key: key);
......
......@@ -200,7 +200,8 @@ void Engine::RunFromBundle(const mojo::String& path) {
void Engine::DidCreateIsolate(Dart_Isolate isolate) {
Internals::Create(isolate,
CreateServiceProvider(config_.service_provider_context));
CreateServiceProvider(config_.service_provider_context),
root_bundle_.Pass());
}
void Engine::ScheduleFrame() {
......
......@@ -29,6 +29,11 @@ Internals* GetInternals() {
void NotifyTestComplete(Dart_NativeArguments args) {
}
void TakeRootBundleHandle(Dart_NativeArguments args) {
Dart_SetIntegerReturnValue(
args, GetInternals()->TakeRootBundleHandle().value());
}
void TakeShellProxyHandle(Dart_NativeArguments args) {
Dart_SetIntegerReturnValue(args, 0);
}
......@@ -48,10 +53,11 @@ void TakeServiceRegistry(Dart_NativeArguments args) {
const DartBuiltin::Natives kNativeFunctions[] = {
{"notifyTestComplete", NotifyTestComplete, 1},
{"takeShellProxyHandle", TakeShellProxyHandle, 0},
{"takeRootBundleHandle", TakeRootBundleHandle, 0},
{"takeServiceRegistry", TakeServiceRegistry, 0},
{"takeServicesProvidedByEmbedder", TakeServicesProvidedByEmbedder, 0},
{"takeServicesProvidedToEmbedder", TakeServicesProvidedToEmbedder, 0},
{"takeServiceRegistry", TakeServiceRegistry, 0},
{"takeShellProxyHandle", TakeShellProxyHandle, 0},
};
const DartBuiltin& GetBuiltin() {
......@@ -75,17 +81,21 @@ const char kLibraryName[] = "dart:sky.internals";
} // namespace
void Internals::Create(Dart_Isolate isolate,
mojo::ServiceProviderPtr service_provider) {
mojo::ServiceProviderPtr service_provider,
mojo::asset_bundle::AssetBundlePtr root_bundle) {
DartState* state = DartState::From(isolate);
state->SetUserData(&kInternalsKey, new Internals(service_provider.Pass()));
state->SetUserData(&kInternalsKey, new Internals(service_provider.Pass(),
root_bundle.Pass()));
Dart_Handle library =
Dart_LookupLibrary(Dart_NewStringFromCString(kLibraryName));
CHECK(!LogIfError(library));
CHECK(!LogIfError(Dart_SetNativeResolver(library, Resolver, Symbolizer)));
}
Internals::Internals(mojo::ServiceProviderPtr platform_service_provider)
: service_provider_impl_(GetProxy(&service_provider_)),
Internals::Internals(mojo::ServiceProviderPtr platform_service_provider,
mojo::asset_bundle::AssetBundlePtr root_bundle)
: root_bundle_(root_bundle.Pass()),
service_provider_impl_(GetProxy(&service_provider_)),
platform_service_provider_(platform_service_provider.Pass()) {
service_provider_impl_.set_fallback_service_provider(
platform_service_provider_.get());
......@@ -106,5 +116,9 @@ mojo::Handle Internals::TakeServicesProvidedByEmbedder() {
return service_provider_.PassInterface().PassHandle().release();
}
mojo::Handle Internals::TakeRootBundleHandle() {
return root_bundle_.PassInterface().PassHandle().release();
}
} // namespace shell
} // namespace sky
......@@ -26,18 +26,22 @@ class Internals
~Internals() override;
static void Create(Dart_Isolate isolate,
mojo::ServiceProviderPtr platform_service_provider);
mojo::ServiceProviderPtr platform_service_provider,
mojo::asset_bundle::AssetBundlePtr root_bundle);
mojo::Handle TakeServicesProvidedByEmbedder();
mojo::Handle TakeRootBundleHandle();
private:
explicit Internals(mojo::ServiceProviderPtr platform_service_provider);
explicit Internals(mojo::ServiceProviderPtr platform_service_provider,
mojo::asset_bundle::AssetBundlePtr root_bundle);
// |mojo::InterfaceFactory<mojo::asset_bundle::AssetUnpacker>| implementation:
void Create(
mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<mojo::asset_bundle::AssetUnpacker>) override;
mojo::asset_bundle::AssetBundlePtr root_bundle_;
mojo::ServiceProviderPtr service_provider_;
mojo::ServiceProviderImpl service_provider_impl_;
mojo::ServiceProviderPtr platform_service_provider_;
......
......@@ -30,6 +30,10 @@ void NotifyTestComplete(Dart_NativeArguments args) {
GetInternals()->NotifyTestComplete(StdStringFromDart(test_result));
}
void TakeRootBundleHandle(Dart_NativeArguments args) {
Dart_SetIntegerReturnValue(args, 0);
}
void TakeShellProxyHandle(Dart_NativeArguments args) {
Dart_SetIntegerReturnValue(args,
GetInternals()->TakeShellProxyHandle().value());
......@@ -52,10 +56,11 @@ void TakeServiceRegistry(Dart_NativeArguments args) {
const DartBuiltin::Natives kNativeFunctions[] = {
{"notifyTestComplete", NotifyTestComplete, 1},
{"takeShellProxyHandle", TakeShellProxyHandle, 0},
{"takeRootBundleHandle", TakeRootBundleHandle, 0},
{"takeServiceRegistry", TakeServiceRegistry, 0},
{"takeServicesProvidedByEmbedder", TakeServicesProvidedByEmbedder, 0},
{"takeServicesProvidedToEmbedder", TakeServicesProvidedToEmbedder, 0},
{"takeServiceRegistry", TakeServiceRegistry, 0},
{"takeShellProxyHandle", TakeShellProxyHandle, 0},
};
const DartBuiltin& GetBuiltin() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册