Merge pull request #1276 from j9brown/native2

Remove dependency on view manager and fix issue #1189.
This commit is contained in:
Jeff Brown 2015-09-23 16:59:55 -07:00
commit 6b4ab4d649
8 changed files with 159 additions and 203 deletions

View File

@ -18,8 +18,6 @@ source_set("compositor") {
"rasterizer_ganesh.h",
"resource_manager.cc",
"resource_manager.h",
"surface_allocator.cc",
"surface_allocator.h",
"surface_holder.cc",
"surface_holder.h",
"texture_cache.cc",

View File

@ -1,26 +0,0 @@
// Copyright 2014 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.
#include "services/sky/compositor/surface_allocator.h"
#include "base/logging.h"
namespace sky {
SurfaceAllocator::SurfaceAllocator(uint32_t id_namespace)
: id_namespace_(id_namespace), next_id_(1) {
DCHECK(id_namespace);
}
SurfaceAllocator::~SurfaceAllocator() {
}
mojo::SurfaceIdPtr SurfaceAllocator::CreateSurfaceId() {
auto id = mojo::SurfaceId::New();
id->local = next_id_++;
id->id_namespace = id_namespace_;
return id.Pass();
}
} // namespace sky

View File

@ -1,29 +0,0 @@
// Copyright 2014 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.
#ifndef SKY_VIEWER_COMPOSITOR_SURFACE_ALLOCATOR_H_
#define SKY_VIEWER_COMPOSITOR_SURFACE_ALLOCATOR_H_
#include "base/basictypes.h"
#include "mojo/services/surfaces/public/interfaces/surface_id.mojom.h"
namespace sky {
class SurfaceAllocator {
public:
SurfaceAllocator(uint32_t id_namespace);
~SurfaceAllocator();
mojo::SurfaceIdPtr CreateSurfaceId();
private:
uint32_t id_namespace_;
uint32_t next_id_;
DISALLOW_COPY_AND_ASSIGN(SurfaceAllocator);
};
} // namespace sky
#endif // SKY_VIEWER_COMPOSITOR_SURFACE_ALLOCATOR_H_

View File

@ -9,7 +9,6 @@
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/interfaces/application/shell.mojom.h"
#include "services/sky/compositor/surface_allocator.h"
namespace sky {

View File

@ -18,8 +18,6 @@ class Shell;
}
namespace sky {
class SurfaceAllocator;
class SurfaceHolder : public mojo::ResourceReturner {
public:
class Client {

View File

@ -15,9 +15,8 @@
#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/interfaces/application/shell.mojom.h"
#include "mojo/services/view_manager/public/cpp/view.h"
#include "mojo/services/view_manager/public/cpp/view_manager.h"
#include "mojo/services/view_manager/public/interfaces/view_manager.mojom.h"
#include "mojo/services/surfaces/public/cpp/surfaces_utils.h"
#include "mojo/services/surfaces/public/interfaces/quads.mojom.h"
#include "services/asset_bundle/asset_unpacker_job.h"
#include "services/sky/compositor/layer_host.h"
#include "services/sky/compositor/rasterizer_bitmap.h"
@ -73,25 +72,22 @@ scoped_ptr<ui::TouchEvent> ConvertToUITouchEvent(
} // namespace
DocumentView::DocumentView(
mojo::InterfaceRequest<mojo::ServiceProvider> services,
mojo::ServiceProviderPtr exported_services,
mojo::InterfaceRequest<mojo::ServiceProvider> exported_services,
mojo::ServiceProviderPtr imported_services,
mojo::URLResponsePtr response,
mojo::Shell* shell)
: response_(response.Pass()),
exported_services_(services.Pass()),
imported_services_(exported_services.Pass()),
exported_services_(exported_services.Pass()),
imported_services_(imported_services.Pass()),
shell_(shell),
root_(nullptr),
view_manager_client_factory_(shell_, this),
bitmap_rasterizer_(nullptr),
event_dispatcher_binding_(this),
weak_factory_(this) {
exported_services_.AddService(&view_manager_client_factory_);
InitServiceRegistry();
InitViewport();
}
DocumentView::~DocumentView() {
if (root_)
root_->RemoveObserver(this);
ui::GestureRecognizer::Get()->CleanupStateForConsumer(this);
}
@ -99,32 +95,67 @@ base::WeakPtr<DocumentView> DocumentView::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void DocumentView::OnEmbed(
mojo::View* root,
mojo::InterfaceRequest<mojo::ServiceProvider> services_provided_to_embedder,
mojo::ServiceProviderPtr services_provided_by_embedder) {
root_ = root;
void DocumentView::InitViewport() {
mojo::ServiceProviderPtr viewport_service_provider;
shell_->ConnectToApplication("mojo:native_viewport_service",
mojo::GetProxy(&viewport_service_provider),
nullptr);
mojo::ConnectToService(viewport_service_provider.get(), &viewport_service_);
viewport_service_.set_connection_error_handler(
base::Bind(&DocumentView::OnViewportConnectionError,
base::Unretained(this)));
if (services_provided_by_embedder.get()) {
mojo::ConnectToService(services_provided_by_embedder.get(),
&navigator_host_);
}
mojo::NativeViewportEventDispatcherPtr dispatcher;
event_dispatcher_binding_.Bind(GetProxy(&dispatcher));
viewport_service_->SetEventDispatcher(dispatcher.Pass());
services_provided_to_embedder_ = services_provided_to_embedder.Pass();
services_provided_by_embedder_ = services_provided_by_embedder.Pass();
// Match the Nexus 5 aspect ratio initially.
auto size = mojo::Size::New();
size->width = 320;
size->height = 640;
Load(response_.Pass());
auto requested_configuration = mojo::SurfaceConfiguration::New();
UpdateRootSizeAndViewportMetrics(root_->bounds());
root_->AddObserver(this);
viewport_service_->Create(size.Clone(),
requested_configuration.Pass(),
base::Bind(&DocumentView::OnViewportCreated,
base::Unretained(this)));
}
void DocumentView::OnViewManagerDisconnected(mojo::ViewManager* view_manager) {
// TODO(ksimbili): Need to figure out how to shutdown when view manager
// doesn't connect.
void DocumentView::OnViewportConnectionError() {
delete this;
}
void DocumentView::OnViewportCreated(mojo::ViewportMetricsPtr metrics) {
viewport_service_->Show();
mojo::ContextProviderPtr onscreen_context_provider;
viewport_service_->GetContextProvider(GetProxy(&onscreen_context_provider));
mojo::ServiceProviderPtr surfaces_service_provider;
shell_->ConnectToApplication("mojo:surfaces_service",
mojo::GetProxy(&surfaces_service_provider),
nullptr);
mojo::DisplayFactoryPtr display_factory;
mojo::ConnectToService(surfaces_service_provider.get(), &display_factory);
display_factory->Create(onscreen_context_provider.Pass(),
nullptr, GetProxy(&display_));
Load(response_.Pass());
UpdateViewportMetrics(metrics.Pass());
RequestUpdatedViewportMetrics();
}
void DocumentView::OnViewportMetricsChanged(mojo::ViewportMetricsPtr metrics) {
UpdateViewportMetrics(metrics.Pass());
RequestUpdatedViewportMetrics();
}
void DocumentView::RequestUpdatedViewportMetrics() {
viewport_service_->RequestMetrics(
base::Bind(&DocumentView::OnViewportMetricsChanged,
base::Unretained(this)));
}
void DocumentView::LoadFromSnapshotStream(
String name, mojo::ScopedDataPipeConsumerHandle snapshot) {
if (sky_view_) {
@ -171,11 +202,15 @@ mojo::ScopedMessagePipeHandle DocumentView::TakeRootBundleHandle() {
}
mojo::ScopedMessagePipeHandle DocumentView::TakeServicesProvidedToEmbedder() {
return services_provided_to_embedder_.PassMessagePipe();
// TODO(jeffbrown): Stubbed out until we migrate from native viewport
// to a new view system that supports embedding again.
return mojo::ScopedMessagePipeHandle();
}
mojo::ScopedMessagePipeHandle DocumentView::TakeServicesProvidedByEmbedder() {
return services_provided_by_embedder_.PassInterface().PassHandle();
// TODO(jeffbrown): Stubbed out until we migrate from native viewport
// to a new view system that supports embedding again.
return mojo::ScopedMessagePipeHandle();
}
mojo::ScopedMessagePipeHandle DocumentView::TakeServiceRegistry() {
@ -196,8 +231,29 @@ void DocumentView::BeginFrame(base::TimeTicks frame_time) {
}
void DocumentView::OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) {
if (root_)
root_->SetSurfaceId(surface_id.Pass());
mojo::FramePtr frame = mojo::Frame::New();
frame->resources.resize(0u);
mojo::Rect bounds;
bounds.width = viewport_metrics_->size->width;
bounds.height = viewport_metrics_->size->height;
mojo::PassPtr pass = mojo::CreateDefaultPass(1, bounds);
pass->shared_quad_states.push_back(mojo::CreateDefaultSQS(
*viewport_metrics_->size));
mojo::QuadPtr quad = mojo::Quad::New();
quad->material = mojo::MATERIAL_SURFACE_CONTENT;
quad->rect = bounds.Clone();
quad->opaque_rect = bounds.Clone();
quad->visible_rect = bounds.Clone();
quad->shared_quad_state_index = 0u;
quad->surface_quad_state = mojo::SurfaceQuadState::New();
quad->surface_quad_state->surface = surface_id.Pass();
pass->quads.push_back(quad.Pass());
frame->passes.push_back(pass.Pass());
display_->SubmitFrame(frame.Pass(), base::Bind(&base::DoNothing));
}
void DocumentView::PaintContents(SkCanvas* canvas, const gfx::Rect& clip) {
@ -208,12 +264,6 @@ void DocumentView::PaintContents(SkCanvas* canvas, const gfx::Rect& clip) {
}
}
float DocumentView::GetDevicePixelRatio() const {
if (root_)
return root_->viewport_metrics().device_pixel_ratio;
return 1.f;
}
void DocumentView::DidCreateIsolate(Dart_Isolate isolate) {
Internals::Create(isolate, this);
}
@ -222,49 +272,30 @@ mojo::NavigatorHost* DocumentView::NavigatorHost() {
return navigator_host_.get();
}
void DocumentView::OnViewBoundsChanged(mojo::View* view,
const mojo::Rect& old_bounds,
const mojo::Rect& new_bounds) {
DCHECK_EQ(view, root_);
UpdateRootSizeAndViewportMetrics(new_bounds);
}
void DocumentView::OnViewViewportMetricsChanged(
mojo::View* view,
const mojo::ViewportMetrics& old_metrics,
const mojo::ViewportMetrics& new_metrics) {
DCHECK_EQ(view, root_);
UpdateRootSizeAndViewportMetrics(root_->bounds());
}
void DocumentView::UpdateRootSizeAndViewportMetrics(
const mojo::Rect& new_bounds) {
float device_pixel_ratio = GetDevicePixelRatio();
void DocumentView::UpdateViewportMetrics(
mojo::ViewportMetricsPtr viewport_metrics) {
viewport_metrics_ = viewport_metrics.Pass();
if (sky_view_) {
blink::SkyDisplayMetrics metrics;
mojo::Rect bounds = root_->bounds();
metrics.physical_size = blink::WebSize(bounds.width, bounds.height);
metrics.device_pixel_ratio = device_pixel_ratio;
metrics.physical_size = blink::WebSize(
viewport_metrics_->size->width,
viewport_metrics_->size->height);
metrics.device_pixel_ratio = viewport_metrics_->device_pixel_ratio;
sky_view_->SetDisplayMetrics(metrics);
return;
}
}
void DocumentView::OnViewFocusChanged(mojo::View* gained_focus,
mojo::View* lost_focus) {
void DocumentView::OnEvent(mojo::EventPtr event,
const mojo::Callback<void()>& callback) {
HandleInputEvent(event.Pass());
callback.Run();
}
void DocumentView::OnViewDestroyed(mojo::View* view) {
DCHECK_EQ(view, root_);
root_ = nullptr;
}
void DocumentView::OnViewInputEvent(
mojo::View* view, const mojo::EventPtr& event) {
float device_pixel_ratio = GetDevicePixelRatio();
void DocumentView::HandleInputEvent(mojo::EventPtr event) {
if (!viewport_metrics_)
return;
float device_pixel_ratio = viewport_metrics_->device_pixel_ratio;
scoped_ptr<blink::WebInputEvent> web_event =
ConvertEvent(event, device_pixel_ratio);
if (!web_event)
@ -302,15 +333,8 @@ void DocumentView::StartDebuggerInspectorBackend() {
}
void DocumentView::InitServiceRegistry() {
mojo::ConnectToService(imported_services_.get(), &service_registry_);
mojo::Array<mojo::String> interface_names(1);
interface_names[0] = mojo::ViewManagerClient::Name_;
mojo::ServiceProviderImpl* sp_impl(new mojo::ServiceProviderImpl());
sp_impl->AddService(&view_manager_client_factory_);
mojo::ServiceProviderPtr sp;
service_registry_service_provider_binding_.reset(
new mojo::StrongBinding<mojo::ServiceProvider>(sp_impl, &sp));
service_registry_->AddServices(interface_names.Pass(), sp.Pass());
if (imported_services_)
mojo::ConnectToService(imported_services_.get(), &service_registry_);
}
void DocumentView::ScheduleFrame() {

View File

@ -13,12 +13,11 @@
#include "mojo/public/interfaces/application/application.mojom.h"
#include "mojo/services/asset_bundle/public/interfaces/asset_bundle.mojom.h"
#include "mojo/services/content_handler/public/interfaces/content_handler.mojom.h"
#include "mojo/services/native_viewport/public/interfaces/native_viewport.mojom.h"
#include "mojo/services/navigation/public/interfaces/navigation.mojom.h"
#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
#include "mojo/services/service_registry/public/interfaces/service_registry.mojom.h"
#include "mojo/services/view_manager/public/cpp/view_manager_client_factory.h"
#include "mojo/services/view_manager/public/cpp/view_manager_delegate.h"
#include "mojo/services/view_manager/public/cpp/view_observer.h"
#include "mojo/services/surfaces/public/interfaces/display.mojom.h"
#include "services/sky/compositor/layer_client.h"
#include "services/sky/compositor/layer_host_client.h"
#include "sky/compositor/layer_tree.h"
@ -27,11 +26,6 @@
#include "sky/engine/public/sky/sky_view_client.h"
#include "ui/events/gestures/gesture_types.h"
namespace mojo {
class ViewManager;
class View;
}
namespace sky {
class DartLibraryProviderImpl;
class LayerHost;
@ -41,14 +35,13 @@ class TextureLayer;
class DocumentView : public blink::ServiceProvider,
public blink::SkyViewClient,
public mojo::ViewManagerDelegate,
public mojo::ViewObserver,
public mojo::NativeViewportEventDispatcher,
public sky::LayerClient,
public sky::LayerHostClient,
public ui::GestureConsumer {
public:
DocumentView(mojo::InterfaceRequest<mojo::ServiceProvider> services,
mojo::ServiceProviderPtr exported_services,
DocumentView(mojo::InterfaceRequest<mojo::ServiceProvider> exported_services,
mojo::ServiceProviderPtr imported_services,
mojo::URLResponsePtr response,
mojo::Shell* shell);
~DocumentView() override;
@ -83,24 +76,14 @@ class DocumentView : public blink::ServiceProvider,
// Services methods:
mojo::NavigatorHost* NavigatorHost() override;
// ViewManagerDelegate methods:
void OnEmbed(mojo::View* root,
mojo::InterfaceRequest<mojo::ServiceProvider> services,
mojo::ServiceProviderPtr exposed_services) override;
void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override;
// NativeViewportEventDispatcher methods:
void OnEvent(mojo::EventPtr event,
const mojo::Callback<void()>& callback) override;
// ViewObserver methods:
void OnViewBoundsChanged(mojo::View* view,
const mojo::Rect& old_bounds,
const mojo::Rect& new_bounds) override;
void OnViewViewportMetricsChanged(
mojo::View* view,
const mojo::ViewportMetrics& old_metrics,
const mojo::ViewportMetrics& new_metrics) override;
void OnViewFocusChanged(mojo::View* gained_focus,
mojo::View* lost_focus) override;
void OnViewDestroyed(mojo::View* view) override;
void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override;
void OnViewportConnectionError();
void OnViewportCreated(mojo::ViewportMetricsPtr metrics);
void OnViewportMetricsChanged(mojo::ViewportMetricsPtr metrics);
void RequestUpdatedViewportMetrics();
void Load(mojo::URLResponsePtr response);
float GetDevicePixelRatio() const;
@ -109,29 +92,31 @@ class DocumentView : public blink::ServiceProvider,
void LoadFromSnapshotStream(String name,
mojo::ScopedDataPipeConsumerHandle snapshot);
void UpdateRootSizeAndViewportMetrics(const mojo::Rect& new_bounds);
void UpdateViewportMetrics(mojo::ViewportMetricsPtr viewport_metrics);
void HandleInputEvent(mojo::EventPtr event);
void InitServiceRegistry();
void InitViewport();
mojo::URLResponsePtr response_;
mojo::ServiceProviderImpl exported_services_;
mojo::ServiceProviderPtr imported_services_;
mojo::InterfaceRequest<mojo::ServiceProvider> services_provided_to_embedder_;
mojo::ServiceProviderPtr services_provided_by_embedder_;
mojo::NativeViewportPtr viewport_service_;
mojo::Shell* shell_;
mojo::asset_bundle::AssetBundlePtr root_bundle_;
mojo::NavigatorHostPtr navigator_host_;
std::unique_ptr<blink::SkyView> sky_view_;
mojo::View* root_;
mojo::ViewManagerClientFactory view_manager_client_factory_;
scoped_ptr<DartLibraryProviderImpl> library_provider_;
scoped_ptr<LayerHost> layer_host_;
scoped_refptr<TextureLayer> root_layer_;
std::unique_ptr<compositor::LayerTree> current_layer_tree_; // TODO(abarth): Integrate //sky/compositor and //services/sky/compositor.
compositor::PaintContext paint_context_;
RasterizerBitmap* bitmap_rasterizer_; // Used for pixel tests.
mojo::ServiceRegistryPtr service_registry_;
scoped_ptr<mojo::StrongBinding<mojo::ServiceProvider>>
service_registry_service_provider_binding_;
mojo::Binding<NativeViewportEventDispatcher> event_dispatcher_binding_;
mojo::ViewportMetricsPtr viewport_metrics_;
mojo::DisplayPtr display_;
base::WeakPtrFactory<DocumentView> weak_factory_;

View File

@ -105,37 +105,44 @@ class SkyBinding extends HitTestTarget {
/// A router that routes all pointer events received from the engine
final PointerRouter pointerRouter = new PointerRouter();
/// State for all pointers which are currently down.
/// We do not track the state of hovering pointers because we need
/// to hit-test them on each movement.
Map<int, _PointerState> _stateForPointer = new Map<int, _PointerState>();
_PointerState _createStateForPointer(sky.PointerEvent event, Point position) {
HitTestResult result = hitTest(position);
_PointerState state = new _PointerState(result: result, lastPosition: position);
_stateForPointer[event.pointer] = state;
return state;
}
_PointerState _getOrCreateStateForPointer(event, position) {
_PointerState state = _stateForPointer[event.pointer];
if (state == null)
state = _createStateForPointer(event, position);
return state;
}
void _handlePointerEvent(sky.PointerEvent event) {
Point position = new Point(event.x, event.y);
_PointerState state = _getOrCreateStateForPointer(event, position);
if (event.type == 'pointerup' || event.type == 'pointercancel') {
if (_hammingWeight(event.buttons) <= 1)
_stateForPointer.remove(event.pointer);
_PointerState state = _stateForPointer[event.pointer];
switch (event.type) {
case 'pointerdown':
if (state == null) {
state = new _PointerState(result: hitTest(position), lastPosition: position);
_stateForPointer[event.pointer] = state;
}
break;
case 'pointermove':
if (state == null) {
// The pointer is hovering, ignore it for now since we don't
// know what to do with it yet.
return;
}
event.dx = position.x - state.lastPosition.x;
event.dy = position.y - state.lastPosition.y;
state.lastPosition = position;
break;
case 'pointerup':
case 'pointercancel':
if (state == null) {
// This seems to be a spurious event. Ignore it.
return;
}
// Only remove the pointer state when the last button has been released.
if (_hammingWeight(event.buttons) <= 1)
_stateForPointer.remove(event.pointer);
break;
}
event.dx = position.x - state.lastPosition.x;
event.dy = position.y - state.lastPosition.y;
state.lastPosition = position;
return dispatchEvent(event, state.result);
dispatchEvent(event, state.result);
}
/// Determine which [HitTestTarget] objects are located at a given position