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

Add system-level routing

We now respect the "route" field in Intents to load a route other than '/'.
Also, use popRoute rather than events to indicate that the framework has asked
us to go back.
上级 2689e040
dart:io,::,_setupHooks
dart:mojo.internal,MojoHandleWatcher,_start
dart:ui,::,_beginFrame
dart:ui,::,_dispatchEvent
dart:ui,::,_dispatchPointerPacket
dart:ui,::,_getCreateTimerClosure
dart:ui,::,_getGetBaseURLClosure
dart:ui,::,_getMainClosure
dart:ui,::,_getPrintClosure
dart:ui,::,_getScheduleMicrotaskClosure
dart:ui,::,_popRoute
dart:ui,::,_pushRoute
dart:ui,::,_updateWindowMetrics
dart:ui,Canvas,Canvas.
dart:ui,Drawable,Drawable.
......
......@@ -20,9 +20,19 @@ void _updateWindowMetrics(double devicePixelRatio,
window.onMetricsChanged();
}
void _dispatchEvent(String eventType, double timeStamp) {
void _pushRoute(String route) {
assert(window.defaultRouteName == null);
window.defaultRouteName = route;
// TODO(abarth): If we ever start calling _pushRoute other than before main,
// we should add a change notification callback.
}
void _popRoute() {
if (window.onPopRoute != null)
window.onPopRoute();
// TODO(abarth): Remove after engine roll.
if (window.onEvent != null)
window.onEvent(eventType, timeStamp);
window.onEvent('back', 0.0);
}
void _dispatchPointerPacket(ByteData serializedPacket) {
......
......@@ -31,10 +31,13 @@ class Window {
WindowPadding _padding;
_FrameCallback onBeginFrame;
_EventCallback onEvent;
_EventCallback onEvent; // TODO(abarth): Remove.
_PointerPacketCallback onPointerPacket;
VoidCallback onMetricsChanged;
String defaultRouteName;
VoidCallback onPopRoute;
void scheduleFrame() native "Window_scheduleFrame";
void render(Scene scene) native "Window_render";
}
......
......@@ -66,18 +66,26 @@ void Window::UpdateWindowMetrics(const SkyDisplayMetrics& metrics) {
});
}
void Window::DispatchEvent(const String& event_type, double time_stamp) {
void Window::PushRoute(const std::string& route) {
DartState* dart_state = library_.dart_state().get();
if (!dart_state)
return;
DartState::Scope scope(dart_state);
DartInvokeField(library_.value(), "_dispatchEvent", {
DartConverter<String>::ToDart(dart_state, event_type),
ToDart(time_stamp)
DartInvokeField(library_.value(), "_pushRoute", {
StdStringToDart(route),
});
}
void Window::PopRoute() {
DartState* dart_state = library_.dart_state().get();
if (!dart_state)
return;
DartState::Scope scope(dart_state);
DartInvokeField(library_.value(), "_popRoute", {});
}
void Window::DispatchPointerPacket(const pointer::PointerPacketPtr& packet) {
DartState* dart_state = library_.dart_state().get();
if (!dart_state)
......
......@@ -33,10 +33,12 @@ class Window {
void DidCreateIsolate();
void UpdateWindowMetrics(const SkyDisplayMetrics& metrics);
void DispatchEvent(const String& event_type, double time_stamp);
void DispatchPointerPacket(const pointer::PointerPacketPtr& packet);
void BeginFrame(base::TimeTicks frameTime);
void PushRoute(const std::string& route);
void PopRoute();
static void RegisterNatives(DartLibraryNatives* natives);
private:
......
......@@ -33,6 +33,14 @@ void SkyView::SetDisplayMetrics(const SkyDisplayMetrics& metrics) {
GetWindow()->UpdateWindowMetrics(display_metrics_);
}
void SkyView::PushRoute(const std::string& route) {
GetWindow()->PushRoute(route);
}
void SkyView::PopRoute() {
GetWindow()->PopRoute();
}
void SkyView::CreateView(const String& name) {
DCHECK(!dart_controller_);
......@@ -68,14 +76,6 @@ std::unique_ptr<sky::compositor::LayerTree> SkyView::BeginFrame(
return std::move(layer_tree_);
}
void SkyView::HandleInputEvent(const WebInputEvent& inputEvent) {
TRACE_EVENT0("input", "SkyView::HandleInputEvent");
if (inputEvent.type == WebInputEvent::Back) {
GetWindow()->DispatchEvent("back", inputEvent.timeStampMS);
}
}
void SkyView::HandlePointerPacket(const pointer::PointerPacketPtr& packet) {
TRACE_EVENT0("input", "SkyView::HandlePointerPacket");
GetWindow()->DispatchPointerPacket(packet);
......
......@@ -38,6 +38,8 @@ class SkyView : public WindowClient {
const SkyDisplayMetrics& display_metrics() const { return display_metrics_; }
void SetDisplayMetrics(const SkyDisplayMetrics& metrics);
void PushRoute(const std::string& route);
void PopRoute();
std::unique_ptr<sky::compositor::LayerTree> BeginFrame(
base::TimeTicks frame_time);
......@@ -50,7 +52,6 @@ class SkyView : public WindowClient {
void RunFromSnapshot(const WebString& name,
mojo::ScopedDataPipeConsumerHandle snapshot);
void HandleInputEvent(const WebInputEvent& event);
void HandlePointerPacket(const pointer::PointerPacketPtr& packet);
void StartDartTracing();
......
......@@ -36,9 +36,11 @@ interface SkyEngine {
OnActivityResumed();
OnViewportMetricsChanged(ViewportMetrics metrics);
OnInputEvent(InputEvent event);
OnPointerPacket(pointer.PointerPacket packet);
PushRoute(string route);
PopRoute();
RunFromFile(string main, string package_root);
RunFromPrecompiledSnapshot(string path);
RunFromSnapshot(string path);
......
......@@ -81,9 +81,7 @@ public class SkyActivity extends Activity {
@Override
public void onBackPressed() {
if (mView != null) {
InputEvent event = new InputEvent();
event.type = EventType.BACK;
mView.getEngine().onInputEvent(event);
mView.getEngine().popRoute();
return;
}
super.onBackPressed();
......@@ -140,6 +138,9 @@ public class SkyActivity extends Activity {
if (Intent.ACTION_RUN.equals(action)) {
mView.getEngine().runFromBundle(intent.getDataString());
String route = intent.getStringExtra("route");
if (route != null)
mView.getEngine().pushRoute(route);
return true;
}
......
......@@ -143,19 +143,6 @@ void Engine::OnViewportMetricsChanged(ViewportMetricsPtr metrics) {
sky_view_->SetDisplayMetrics(display_metrics_);
}
void Engine::OnInputEvent(InputEventPtr event) {
TRACE_EVENT0("flutter", "Engine::OnInputEvent");
if (event->type != EventType::BACK)
return;
scoped_ptr<blink::WebInputEvent> web_event(blink::WebInputEvent::create());
web_event->type = blink::WebInputEvent::Back;
web_event->timeStampMS = currentTimeMS();
if (sky_view_)
sky_view_->HandleInputEvent(*web_event);
}
void Engine::OnPointerPacket(pointer::PointerPacketPtr packet) {
TRACE_EVENT0("flutter", "Engine::OnPointerPacket");
......@@ -175,6 +162,8 @@ void Engine::RunFromLibrary(const std::string& name) {
sky_view_->RunFromLibrary(blink::WebString::fromUTF8(name),
dart_library_provider_.get());
sky_view_->SetDisplayMetrics(display_metrics_);
if (!initial_route_.empty())
sky_view_->PushRoute(initial_route_);
}
void Engine::RunFromSnapshotStream(
......@@ -184,6 +173,8 @@ void Engine::RunFromSnapshotStream(
sky_view_->CreateView(blink::WebString::fromUTF8(name));
sky_view_->RunFromSnapshot(blink::WebString::fromUTF8(name), snapshot.Pass());
sky_view_->SetDisplayMetrics(display_metrics_);
if (!initial_route_.empty())
sky_view_->PushRoute(initial_route_);
}
void Engine::RunFromPrecompiledSnapshot(const mojo::String& bundle_path) {
......@@ -196,6 +187,8 @@ void Engine::RunFromPrecompiledSnapshot(const mojo::String& bundle_path) {
sky_view_->CreateView("http://localhost");
sky_view_->RunFromPrecompiledSnapshot();
sky_view_->SetDisplayMetrics(display_metrics_);
if (!initial_route_.empty())
sky_view_->PushRoute(initial_route_);
}
void Engine::RunFromFile(const mojo::String& main,
......@@ -230,6 +223,18 @@ void Engine::RunFromAssetBundle(const mojo::String& url,
weak_factory_.GetWeakPtr(), url_str));
}
void Engine::PushRoute(const mojo::String& route) {
if (sky_view_)
sky_view_->PushRoute(route);
else
initial_route_ = route;
}
void Engine::PopRoute() {
if (sky_view_)
sky_view_->PopRoute();
}
void Engine::OnActivityPaused() {
activity_running_ = false;
StopAnimator();
......
......@@ -61,7 +61,6 @@ class Engine : public UIDelegate,
// SkyEngine implementation:
void SetServices(ServicesDataPtr services) override;
void OnViewportMetricsChanged(ViewportMetricsPtr metrics) override;
void OnInputEvent(InputEventPtr event) override;
void OnPointerPacket(pointer::PointerPacketPtr packet) override;
void RunFromFile(const mojo::String& main,
......@@ -71,7 +70,8 @@ class Engine : public UIDelegate,
void RunFromBundle(const mojo::String& path) override;
void RunFromAssetBundle(const mojo::String& url,
mojo::asset_bundle::AssetBundlePtr bundle) override;
void PushRoute(const mojo::String& route) override;
void PopRoute() override;
void OnActivityPaused() override;
void OnActivityResumed() override;
......@@ -96,6 +96,7 @@ class Engine : public UIDelegate,
std::unique_ptr<blink::SkyView> sky_view_;
gfx::Size physical_size_;
std::string initial_route_;
blink::SkyDisplayMetrics display_metrics_;
mojo::Binding<SkyEngine> binding_;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册