diff --git a/engine/core/frame/FrameHost.cpp b/engine/core/frame/FrameHost.cpp index 7ac39500d5fffc3469dcba5f2a4b4804b14c6959..458ce032e3bc1878360c51773559c1fe0c70ad3d 100644 --- a/engine/core/frame/FrameHost.cpp +++ b/engine/core/frame/FrameHost.cpp @@ -35,12 +35,12 @@ namespace blink { -PassOwnPtr FrameHost::create(Page& page, ServiceProvider& services) +PassOwnPtr FrameHost::create(Page& page, ServiceProvider* services) { return adoptPtr(new FrameHost(page, services)); } -FrameHost::FrameHost(Page& page, ServiceProvider& services) +FrameHost::FrameHost(Page& page, ServiceProvider* services) : m_page(&page) , m_services(services) { diff --git a/engine/core/frame/FrameHost.h b/engine/core/frame/FrameHost.h index f17c1e81c1db0f0f892716520f710bc0af303d24..92b62283f7606cdebc81bbbbcc7398159997aa5e 100644 --- a/engine/core/frame/FrameHost.h +++ b/engine/core/frame/FrameHost.h @@ -55,14 +55,14 @@ class Settings; class FrameHost final { WTF_MAKE_NONCOPYABLE(FrameHost); WTF_MAKE_FAST_ALLOCATED; public: - static PassOwnPtr create(Page&, ServiceProvider&); + static PassOwnPtr create(Page&, ServiceProvider*); ~FrameHost(); // Careful: This function will eventually be removed. Page& page() const { return *m_page; } Settings& settings() const; - ServiceProvider& services() const { return m_services; } + 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. @@ -70,10 +70,10 @@ public: float deviceScaleFactor() const; private: - FrameHost(Page&, ServiceProvider&); + FrameHost(Page&, ServiceProvider*); Page* m_page; - ServiceProvider& m_services; + ServiceProvider* m_services; }; } diff --git a/engine/core/html/HTMLAnchorElement.cpp b/engine/core/html/HTMLAnchorElement.cpp index 6b0ee928f90eb60929ef1b3aa600f079d742e871..e7917b18ef0caec58805878bb1b9a0b9c0fa788f 100644 --- a/engine/core/html/HTMLAnchorElement.cpp +++ b/engine/core/html/HTMLAnchorElement.cpp @@ -117,7 +117,7 @@ void HTMLAnchorElement::handleClick(Event* event) return; mojo::URLRequestPtr request = mojo::URLRequest::New(); request->url = href().string().toUTF8(); - host->services().NavigatorHost()->RequestNavigate( + host->services()->NavigatorHost()->RequestNavigate( mojo::TARGET_SOURCE_NODE, request.Pass()); event->setDefaultHandled(); } diff --git a/engine/core/page/Page.cpp b/engine/core/page/Page.cpp index 07c85a778e5883aab10270d74bc67667d1345eeb..975515a7da66aafb4965cfe44df053683501363d 100644 --- a/engine/core/page/Page.cpp +++ b/engine/core/page/Page.cpp @@ -62,7 +62,7 @@ float deviceScaleFactor(LocalFrame* frame) return page->deviceScaleFactor(); } -Page::Page(PageClients& pageClients, ServiceProvider& services) +Page::Page(PageClients& pageClients, ServiceProvider* services) : SettingsDelegate(Settings::create()) , m_animator(this) , m_chromeClient(pageClients.chromeClient) diff --git a/engine/core/page/Page.h b/engine/core/page/Page.h index 20cd8d2785523a999de606ce8d6ce21f31ef56e9..d22b60a6a9f5b9460a736fe8599bfc1f5f60adba 100644 --- a/engine/core/page/Page.h +++ b/engine/core/page/Page.h @@ -84,7 +84,7 @@ public: SpellCheckerClient* spellCheckerClient; }; - Page(PageClients&, ServiceProvider&); + Page(PageClients&, ServiceProvider*); virtual ~Page(); FrameHost& frameHost() const { return *m_frameHost; } diff --git a/engine/public/platform/ServiceProvider.h b/engine/public/platform/ServiceProvider.h index 21d16019ad7e7216ad9eb090df0b9f9bfdb4b838..b0434db7b49db9484d818a2c419d74e5f5bfe89b 100644 --- a/engine/public/platform/ServiceProvider.h +++ b/engine/public/platform/ServiceProvider.h @@ -7,7 +7,6 @@ namespace mojo { class NavigatorHost; -class Shell; } namespace blink { @@ -15,7 +14,6 @@ namespace blink { class ServiceProvider { public: virtual mojo::NavigatorHost* NavigatorHost() = 0; - virtual mojo::Shell* Shell() = 0; protected: virtual ~ServiceProvider(); diff --git a/engine/public/web/WebViewClient.h b/engine/public/web/WebViewClient.h index c3334409390cab9fbc7b5fd880b9c90c1aef8beb..56becbdd428c23087785ad7de276b96f9251eb11 100644 --- a/engine/public/web/WebViewClient.h +++ b/engine/public/web/WebViewClient.h @@ -62,7 +62,7 @@ struct WebSize; class WebViewClient { public: - virtual ServiceProvider& services() = 0; + virtual ServiceProvider* services() { return nullptr; } // Initialize compositing for this widget. virtual void initializeLayerTreeView() { BLINK_ASSERT_NOT_REACHED(); }; diff --git a/shell/BUILD.gn b/shell/BUILD.gn index 3494b85863d8f52e05b0788743069bfd3cc1ca11..32b1c6a582bc1932fc49ef9c555a1acbc0f47e15 100644 --- a/shell/BUILD.gn +++ b/shell/BUILD.gn @@ -29,6 +29,10 @@ shared_library("sky_shell") { "gpu/ganesh_surface.h", "gpu/rasterizer.cc", "gpu/rasterizer.h", + "ui/engine.cc", + "ui/engine.h", + "ui/platform_impl.cc", + "ui/platform_impl.h", "library_loader.cc", "shell.cc", "shell.h", @@ -38,12 +42,13 @@ shared_library("sky_shell") { "sky_view.h", ] - configs += [ "//third_party/khronos:khronos_headers" ] - deps = [ "//base", + "//base:i18n", "//build/config/sanitizers:deps", + "//mojo/edk/system", "//skia", + "//sky/engine", "//ui/gfx/geometry", "//ui/gl", ":jni_headers", diff --git a/shell/shell.cc b/shell/shell.cc index 757a9e91c2e703b3979dfdbb8f9bae1a91168602..3a54bb2c09fb6c976252357d760af314fb8a2419 100644 --- a/shell/shell.cc +++ b/shell/shell.cc @@ -24,6 +24,13 @@ void Shell::Init() { gpu_thread_->Start(); rasterizer_.reset(new Rasterizer()); + ui_thread_.reset(new base::Thread("ui_thread")); + ui_thread_->Start(); + engine_.reset(new Engine()); + + ui_thread_->message_loop()->PostTask( + FROM_HERE, base::Bind(&Engine::Init, engine_->GetWeakPtr())); + view_.reset(new SkyView(this)); view_->Init(); } diff --git a/shell/shell.h b/shell/shell.h index eb69f669b06d2570968d959ccb82ec6d02d9d3d3..bcb812e269b4e45787a3bc3f39dea2a020d9c2ca 100644 --- a/shell/shell.h +++ b/shell/shell.h @@ -10,6 +10,7 @@ #include "base/memory/scoped_ptr.h" #include "sky/shell/gpu/rasterizer.h" #include "sky/shell/sky_view.h" +#include "sky/shell/ui/engine.h" namespace base { class Thread; @@ -33,9 +34,11 @@ class Shell : public SkyView::Delegate { scoped_refptr java_task_runner_; scoped_ptr gpu_thread_; + scoped_ptr ui_thread_; scoped_ptr view_; scoped_ptr rasterizer_; + scoped_ptr engine_; DISALLOW_COPY_AND_ASSIGN(Shell); }; diff --git a/shell/sky_main.cc b/shell/sky_main.cc index 4cbea0b0f64847237244305d609c5359d076c027..4ae0b940be6b917be21e07fc786750b3a69212ae 100644 --- a/shell/sky_main.cc +++ b/shell/sky_main.cc @@ -10,6 +10,7 @@ #include "base/at_exit.h" #include "base/bind.h" #include "base/command_line.h" +#include "base/i18n/icu_util.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/macros.h" @@ -63,6 +64,7 @@ static void Init(JNIEnv* env, g_java_message_loop.Get().reset(new base::MessageLoopForUI); base::MessageLoopForUI::current()->Start(); + base::i18n::InitializeICU(); gfx::GLSurface::InitializeOneOff(); g_shell.Get().reset(new Shell(g_java_message_loop.Get()->task_runner())); diff --git a/shell/ui/engine.cc b/shell/ui/engine.cc new file mode 100644 index 0000000000000000000000000000000000000000..ed1971d3677d276578b3fe96b13c714a2f1bc761 --- /dev/null +++ b/shell/ui/engine.cc @@ -0,0 +1,36 @@ +// 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. + +#include "sky/shell/ui/engine.h" + +#include "sky/engine/public/web/Sky.h" +#include "sky/engine/public/web/WebLocalFrame.h" +#include "sky/engine/public/web/WebView.h" +#include "sky/shell/ui/platform_impl.h" + +namespace sky { +namespace shell { + +Engine::Engine() : web_view_(nullptr), weak_factory_(this) { +} + +Engine::~Engine() { + if (web_view_) + web_view_->close(); +} + +base::WeakPtr Engine::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + +void Engine::Init() { + platform_impl_.reset(new PlatformImpl); + blink::initialize(platform_impl_.get()); + + web_view_ = blink::WebView::create(this); + web_view_->setMainFrame(blink::WebLocalFrame::create(this)); +} + +} // namespace shell +} // namespace sky diff --git a/shell/ui/engine.h b/shell/ui/engine.h new file mode 100644 index 0000000000000000000000000000000000000000..cba0c7a7ad9541e7f7c683af0cd8fbeb87b51101 --- /dev/null +++ b/shell/ui/engine.h @@ -0,0 +1,40 @@ +// 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. + +#ifndef SKY_SHELL_UI_ENGINE_H_ +#define SKY_SHELL_UI_ENGINE_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "sky/engine/public/web/WebFrameClient.h" +#include "sky/engine/public/web/WebViewClient.h" + +namespace sky { +namespace shell { +class PlatformImpl; + +class Engine : public blink::WebFrameClient, + public blink::WebViewClient { + public: + Engine(); + ~Engine() override; + + base::WeakPtr GetWeakPtr(); + + void Init(); + + private: + scoped_ptr platform_impl_; + blink::WebView* web_view_; + + base::WeakPtrFactory weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(Engine); +}; + +} // namespace shell +} // namespace sky + +#endif // SKY_SHELL_UI_ENGINE_H_ diff --git a/shell/ui/platform_impl.cc b/shell/ui/platform_impl.cc new file mode 100644 index 0000000000000000000000000000000000000000..dca0039fd3c9ae519dad810816db5f92768d19c4 --- /dev/null +++ b/shell/ui/platform_impl.cc @@ -0,0 +1,26 @@ +// 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. + +#include "sky/shell/ui/platform_impl.h" + +namespace sky { +namespace shell { + +PlatformImpl::PlatformImpl() + : main_thread_task_runner_(base::MessageLoop::current()->task_runner()) { +} + +PlatformImpl::~PlatformImpl() { +} + +blink::WebString PlatformImpl::defaultLocale() { + return blink::WebString::fromUTF8("en-US"); +} + +base::SingleThreadTaskRunner* PlatformImpl::mainThreadTaskRunner() { + return main_thread_task_runner_.get(); +} + +} // namespace shell +} // namespace sky diff --git a/shell/ui/platform_impl.h b/shell/ui/platform_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..5a62d0e8f217b72680e1b6f041cf76c7c5ff9ed4 --- /dev/null +++ b/shell/ui/platform_impl.h @@ -0,0 +1,32 @@ +// 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. + +#ifndef SKY_SHELL_UI_PLATFORM_IMPL_H_ +#define SKY_SHELL_UI_PLATFORM_IMPL_H_ + +#include "base/message_loop/message_loop.h" +#include "sky/engine/public/platform/Platform.h" + +namespace sky { +namespace shell { + +class PlatformImpl : public blink::Platform { + public: + PlatformImpl(); + ~PlatformImpl() override; + + // blink::Platform: + blink::WebString defaultLocale() override; + base::SingleThreadTaskRunner* mainThreadTaskRunner() override; + + private: + scoped_refptr main_thread_task_runner_; + + DISALLOW_COPY_AND_ASSIGN(PlatformImpl); +}; + +} // namespace shell +} // namespace sky + +#endif // SKY_SHELL_UI_PLATFORM_IMPL_H_ diff --git a/viewer/document_view.cc b/viewer/document_view.cc index 09e3a21e458aa3413d3226359af0e6d13e5867e7..1a2e2867f1739ece9e6161c6d0cfa26c3811d0bf 100644 --- a/viewer/document_view.cc +++ b/viewer/document_view.cc @@ -279,18 +279,14 @@ void DocumentView::didCreateScriptContext(blink::WebLocalFrame* frame, gin::ConvertToV8(isolate, internals)); } -blink::ServiceProvider& DocumentView::services() { - return *this; +blink::ServiceProvider* DocumentView::services() { + return this; } mojo::NavigatorHost* DocumentView::NavigatorHost() { return navigator_host_.get(); } -mojo::Shell* DocumentView::Shell() { - return shell_; -} - 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 ae1895be9db16ad3beb7cb2189b9be6b86888973..018214448821999ed716382354d6b111c91319b8 100644 --- a/viewer/document_view.h +++ b/viewer/document_view.h @@ -98,11 +98,10 @@ class DocumentView : public blink::ServiceProvider, v8::Handle) override; // WebViewClient methods: - blink::ServiceProvider& services() override; + blink::ServiceProvider* services() override; // Services methods: mojo::NavigatorHost* NavigatorHost() override; - mojo::Shell* Shell() override; // ViewManagerDelegate methods: void OnEmbed(mojo::View* root,