From 97565a73db1f1ec90709e2129546f3dcd0ecaeea Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Fri, 31 Oct 2014 10:54:03 -0700 Subject: [PATCH] Introduce blink::ServiceProvider This CL is a warmup for making hyperlinks actually work. ServiceProvider lets the embedder inject a bundle of services that are specific to the embedding context (e.g., NavigatorHost). Services that are independent to the embedding context can be injected via blink::Platform. R=eseidel@chromium.org Review URL: https://codereview.chromium.org/696733003 --- engine/core/frame/FrameHost.cpp | 7 ++-- engine/core/frame/FrameHost.h | 8 +++- engine/core/page/Page.cpp | 4 +- engine/core/page/Page.h | 3 +- engine/core/testing/DummyPageHolder.cpp | 2 +- engine/platform/BUILD.gn | 1 + engine/platform/exported/ServiceProvider.cpp | 13 +++++++ engine/public/platform/ServiceProvider.h | 24 ++++++++++++ engine/public/web/WebViewClient.h | 3 ++ engine/web/WebViewImpl.cpp | 2 +- viewer/document_view.cc | 8 ++++ viewer/document_view.h | 39 +++++++++++++------- 12 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 engine/platform/exported/ServiceProvider.cpp create mode 100644 engine/public/platform/ServiceProvider.h diff --git a/engine/core/frame/FrameHost.cpp b/engine/core/frame/FrameHost.cpp index 15370957ce5..446a52f5081 100644 --- a/engine/core/frame/FrameHost.cpp +++ b/engine/core/frame/FrameHost.cpp @@ -38,13 +38,14 @@ namespace blink { -PassOwnPtr FrameHost::create(Page& page) +PassOwnPtr FrameHost::create(Page& page, ServiceProvider* services) { - return adoptPtr(new FrameHost(page)); + return adoptPtr(new FrameHost(page, services)); } -FrameHost::FrameHost(Page& page) +FrameHost::FrameHost(Page& page, ServiceProvider* services) : m_page(&page) + , m_services(services) , m_eventHandlerRegistry(adoptPtr(new EventHandlerRegistry(*this))) { } diff --git a/engine/core/frame/FrameHost.h b/engine/core/frame/FrameHost.h index f82aa6e6af3..f30f392720c 100644 --- a/engine/core/frame/FrameHost.h +++ b/engine/core/frame/FrameHost.h @@ -42,6 +42,7 @@ namespace blink { class Chrome; class EventHandlerRegistry; class Page; +class ServiceProvider; class Settings; class UseCounter; class Visitor; @@ -58,7 +59,7 @@ class Visitor; class FrameHost final : public DummyBase { WTF_MAKE_NONCOPYABLE(FrameHost); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; public: - static PassOwnPtr create(Page&); + static PassOwnPtr create(Page&, ServiceProvider*); ~FrameHost(); // Careful: This function will eventually be removed. @@ -67,6 +68,8 @@ public: Chrome& chrome() const; UseCounter& useCounter() const; + ServiceProvider* services() const { return m_services; } + // Corresponds to pixel density of the device where this Page is // being displayed. In multi-monitor setups this can vary between pages. // This value does not account for Page zoom, use LocalFrame::devicePixelRatio instead. @@ -77,9 +80,10 @@ public: void trace(Visitor*); private: - explicit FrameHost(Page&); + FrameHost(Page&, ServiceProvider*); RawPtr m_page; + ServiceProvider* m_services; const OwnPtr m_eventHandlerRegistry; }; diff --git a/engine/core/page/Page.cpp b/engine/core/page/Page.cpp index 305bfe13aa7..1acce8d7c0b 100644 --- a/engine/core/page/Page.cpp +++ b/engine/core/page/Page.cpp @@ -91,7 +91,7 @@ float deviceScaleFactor(LocalFrame* frame) return page->deviceScaleFactor(); } -Page::Page(PageClients& pageClients) +Page::Page(PageClients& pageClients, ServiceProvider* services) : SettingsDelegate(Settings::create()) , m_animator(this) , m_autoscrollController(AutoscrollController::create(*this)) @@ -110,7 +110,7 @@ Page::Page(PageClients& pageClients) #if ENABLE(ASSERT) , m_isPainting(false) #endif - , m_frameHost(FrameHost::create(*this)) + , m_frameHost(FrameHost::create(*this, services)) { ASSERT(m_editorClient); diff --git a/engine/core/page/Page.h b/engine/core/page/Page.h index 8e9555d4955..42f9a39872b 100644 --- a/engine/core/page/Page.h +++ b/engine/core/page/Page.h @@ -56,6 +56,7 @@ class RenderObject; class VisibleSelection; class ScrollableArea; class ScrollingCoordinator; +class ServiceProvider; class Settings; class SpellCheckerClient; class UndoStack; @@ -83,7 +84,7 @@ public: SpellCheckerClient* spellCheckerClient; }; - explicit Page(PageClients&); + Page(PageClients&, ServiceProvider*); virtual ~Page(); void makeOrdinary(); diff --git a/engine/core/testing/DummyPageHolder.cpp b/engine/core/testing/DummyPageHolder.cpp index 7661ef40240..a1f6c181103 100644 --- a/engine/core/testing/DummyPageHolder.cpp +++ b/engine/core/testing/DummyPageHolder.cpp @@ -59,7 +59,7 @@ DummyPageHolder::DummyPageHolder( m_pageClients.editorClient = pageClients->editorClient; m_pageClients.spellCheckerClient = pageClients->spellCheckerClient; } - m_page = adoptPtr(new Page(m_pageClients)); + m_page = adoptPtr(new Page(m_pageClients, 0)); // FIXME(sky): Delete the tests that use DummyPageHolder since // they no longer work and we're not running them. diff --git a/engine/platform/BUILD.gn b/engine/platform/BUILD.gn index 38fd8586b14..424e10c8cac 100644 --- a/engine/platform/BUILD.gn +++ b/engine/platform/BUILD.gn @@ -186,6 +186,7 @@ component("platform") { "clipboard/ClipboardUtilities.h", "clipboard/ClipboardUtilitiesPosix.cpp", "exported/Platform.cpp", + "exported/ServiceProvider.cpp", "exported/WebActiveGestureAnimation.cpp", "exported/WebActiveGestureAnimation.h", "exported/WebArrayBuffer.cpp", diff --git a/engine/platform/exported/ServiceProvider.cpp b/engine/platform/exported/ServiceProvider.cpp new file mode 100644 index 00000000000..1e92b102302 --- /dev/null +++ b/engine/platform/exported/ServiceProvider.cpp @@ -0,0 +1,13 @@ +// 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 "config.h" +#include "public/platform/ServiceProvider.h" + +namespace blink { + +ServiceProvider::~ServiceProvider() { +} + +} // namespace blink diff --git a/engine/public/platform/ServiceProvider.h b/engine/public/platform/ServiceProvider.h new file mode 100644 index 00000000000..1aade2cb0fc --- /dev/null +++ b/engine/public/platform/ServiceProvider.h @@ -0,0 +1,24 @@ +// 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_ENGINE_PUBLIC_PLATOFORM_SERVICES_H_ +#define SKY_ENGINE_PUBLIC_PLATOFORM_SERVICES_H_ + +namespace mojo { +class NavigatorHost; +} + +namespace blink { + +class ServiceProvider { + public: + virtual mojo::NavigatorHost* NavigatorHost() = 0; + + protected: + virtual ~ServiceProvider(); +}; + +} // namespace blink + +#endif diff --git a/engine/public/web/WebViewClient.h b/engine/public/web/WebViewClient.h index 8e98aba6d5d..791301ffad7 100644 --- a/engine/public/web/WebViewClient.h +++ b/engine/public/web/WebViewClient.h @@ -44,6 +44,7 @@ namespace blink { +class ServiceProvider; class WebCompositorOutputSurface; class WebElement; class WebGestureEvent; @@ -66,6 +67,8 @@ struct WebSize; // easily reused as part of an implementation of WebViewClient. class WebViewClient : virtual public WebWidgetClient { public: + virtual ServiceProvider* services() = 0; + // Editing ------------------------------------------------------------- // This method is called in response to WebView's handleInputEvent() diff --git a/engine/web/WebViewImpl.cpp b/engine/web/WebViewImpl.cpp index fd1768ff812..b28e54ed713 100644 --- a/engine/web/WebViewImpl.cpp +++ b/engine/web/WebViewImpl.cpp @@ -194,7 +194,7 @@ WebViewImpl::WebViewImpl(WebViewClient* client) pageClients.editorClient = &m_editorClientImpl; pageClients.spellCheckerClient = &m_spellCheckerClientImpl; - m_page = adoptPtr(new Page(pageClients)); + m_page = adoptPtr(new Page(pageClients, m_client->services())); m_page->makeOrdinary(); setDeviceScaleFactor(m_client->screenInfo().deviceScaleFactor); diff --git a/viewer/document_view.cc b/viewer/document_view.cc index cac3398cf8a..f1d36df3734 100644 --- a/viewer/document_view.cc +++ b/viewer/document_view.cc @@ -187,6 +187,14 @@ void DocumentView::didCreateScriptContext(blink::WebLocalFrame* frame, gin::ConvertToV8(isolate, internals)); } +blink::ServiceProvider* DocumentView::services() { + return this; +} + +mojo::NavigatorHost* DocumentView::NavigatorHost() { + return navigator_host_.get(); +} + void DocumentView::OnViewBoundsChanged(mojo::View* view, const mojo::Rect& old_bounds, const mojo::Rect& new_bounds) { diff --git a/viewer/document_view.h b/viewer/document_view.h index 8af973d437e..aac7f1d9e8a 100644 --- a/viewer/document_view.h +++ b/viewer/document_view.h @@ -17,6 +17,7 @@ #include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" #include "mojo/services/public/interfaces/network/url_loader.mojom.h" +#include "sky/engine/public/platform/ServiceProvider.h" #include "sky/engine/public/web/WebFrameClient.h" #include "sky/engine/public/web/WebViewClient.h" #include "sky/viewer/services/inspector_impl.h" @@ -35,6 +36,7 @@ class ScriptRunner; class WebLayerTreeViewImpl; class DocumentView : public mojo::InterfaceImpl, + public blink::ServiceProvider, public blink::WebViewClient, public blink::WebFrameClient, public mojo::ViewManagerDelegate, @@ -67,31 +69,40 @@ class DocumentView : public mojo::InterfaceImpl, virtual blink::WebLayerTreeView* initializeLayerTreeView(); // WebFrameClient methods: - virtual void frameDetached(blink::WebFrame*); - virtual blink::WebNavigationPolicy decidePolicyForNavigation( - const blink::WebFrameClient::NavigationPolicyInfo& info); - virtual void didAddMessageToConsole( + void frameDetached(blink::WebFrame*) override; + blink::WebNavigationPolicy decidePolicyForNavigation( + const blink::WebFrameClient::NavigationPolicyInfo& info) override; + void didAddMessageToConsole( const blink::WebConsoleMessage& message, const blink::WebString& source_name, unsigned source_line, - const blink::WebString& stack_trace); - virtual void didCreateScriptContext( - blink::WebLocalFrame*, v8::Handle, int extensionGroup, int worldId); + const blink::WebString& stack_trace) override; + void didCreateScriptContext( + blink::WebLocalFrame*, + v8::Handle, + int extensionGroup, + int worldId) override; + + // WebViewClient methods: + blink::ServiceProvider* services() override; + + // Services methods: + mojo::NavigatorHost* NavigatorHost() override; // ViewManagerDelegate methods: - virtual void OnEmbed( + void OnEmbed( mojo::ViewManager* view_manager, mojo::View* root, mojo::ServiceProviderImpl* exported_services, scoped_ptr imported_services) override; - virtual void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override; + void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override; // ViewObserver methods: - virtual void OnViewBoundsChanged(mojo::View* view, - const mojo::Rect& old_bounds, - const mojo::Rect& new_bounds) override; - virtual void OnViewDestroyed(mojo::View* view) override; - virtual void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override; + void OnViewBoundsChanged(mojo::View* view, + const mojo::Rect& old_bounds, + const mojo::Rect& new_bounds) override; + void OnViewDestroyed(mojo::View* view) override; + void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override; void Load(mojo::URLResponsePtr response);