diff options
author | fsamuel <fsamuel@chromium.org> | 2015-06-18 15:21:17 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-18 22:21:50 +0000 |
commit | 0404e9268e3488f6fd99249bcc757b74c3d382ff (patch) | |
tree | 8f341fb42392c0427f78bd6b93ab530ff72b2b2d | |
parent | c3994e9fb2f44a428ad4bff03af3d2e2b9c10eec (diff) | |
download | chromium_src-0404e9268e3488f6fd99249bcc757b74c3d382ff.zip chromium_src-0404e9268e3488f6fd99249bcc757b74c3d382ff.tar.gz chromium_src-0404e9268e3488f6fd99249bcc757b74c3d382ff.tar.bz2 |
Mandoline: Implement BrowserManager to manage multiple browser windows
Each Browser object represents a single Browser window. BrowserManager deals
with lifetime management and later perhaps messaging between browser windows.
BUG=496935
Review URL: https://codereview.chromium.org/1182713003
Cr-Commit-Position: refs/heads/master@{#335144}
-rw-r--r-- | components/view_manager/public/cpp/lib/view_manager_init.cc | 14 | ||||
-rw-r--r-- | components/view_manager/public/cpp/view_manager_init.h | 5 | ||||
-rw-r--r-- | mandoline/services/core_services/core_services_application_delegate.cc | 4 | ||||
-rw-r--r-- | mandoline/ui/browser/BUILD.gn | 2 | ||||
-rw-r--r-- | mandoline/ui/browser/browser.cc | 59 | ||||
-rw-r--r-- | mandoline/ui/browser/browser.h | 30 | ||||
-rw-r--r-- | mandoline/ui/browser/browser_manager.cc | 62 | ||||
-rw-r--r-- | mandoline/ui/browser/browser_manager.h | 64 | ||||
-rw-r--r-- | mandoline/ui/browser/desktop/desktop_ui.cc | 3 | ||||
-rw-r--r-- | mandoline/ui/browser/desktop/desktop_ui.h | 2 | ||||
-rw-r--r-- | mandoline/ui/browser/main.cc | 4 |
11 files changed, 170 insertions, 79 deletions
diff --git a/components/view_manager/public/cpp/lib/view_manager_init.cc b/components/view_manager/public/cpp/lib/view_manager_init.cc index 2b5ca5c..17cf779 100644 --- a/components/view_manager/public/cpp/lib/view_manager_init.cc +++ b/components/view_manager/public/cpp/lib/view_manager_init.cc @@ -30,15 +30,17 @@ class ViewManagerInit::ClientFactory ViewManagerInit::ViewManagerInit(ApplicationImpl* app, ViewManagerDelegate* delegate, ViewManagerRootClient* root_client) - : app_(app), delegate_(delegate), client_factory_(new ClientFactory(this)) { + : app_(app), + connection_(nullptr), + delegate_(delegate), + client_factory_(new ClientFactory(this)) { mojo::URLRequestPtr request(mojo::URLRequest::New()); request->url = mojo::String::From("mojo:view_manager"); - ApplicationConnection* connection = - app_->ConnectToApplication(request.Pass()); - connection->AddService(client_factory_.get()); - connection->ConnectToService(&service_); + connection_ = app_->ConnectToApplication(request.Pass()); + connection_->AddService(client_factory_.get()); + connection_->ConnectToService(&service_); service_.set_error_handler(this); - connection->ConnectToService(&view_manager_root_); + connection_->ConnectToService(&view_manager_root_); if (root_client) { root_client_binding_.reset(new Binding<ViewManagerRootClient>(root_client)); ViewManagerRootClientPtr root_client_ptr; diff --git a/components/view_manager/public/cpp/view_manager_init.h b/components/view_manager/public/cpp/view_manager_init.h index 316597c..5bff817 100644 --- a/components/view_manager/public/cpp/view_manager_init.h +++ b/components/view_manager/public/cpp/view_manager_init.h @@ -14,6 +14,7 @@ namespace mojo { +class ApplicationConnection; class ApplicationImpl; class ViewManagerDelegate; @@ -32,6 +33,9 @@ class ViewManagerInit : public mojo::ErrorHandler { // supplied to the constructor. ViewManagerRoot* view_manager_root() { return view_manager_root_.get(); } + // Returns the application connection established with the view manager. + ApplicationConnection* connection() { return connection_; } + private: class ClientFactory; @@ -41,6 +45,7 @@ class ViewManagerInit : public mojo::ErrorHandler { void OnConnectionError() override; ApplicationImpl* app_; + ApplicationConnection* connection_; ViewManagerDelegate* delegate_; scoped_ptr<ClientFactory> client_factory_; ViewManagerServicePtr service_; diff --git a/mandoline/services/core_services/core_services_application_delegate.cc b/mandoline/services/core_services/core_services_application_delegate.cc index b31fff8b..fb7194c 100644 --- a/mandoline/services/core_services/core_services_application_delegate.cc +++ b/mandoline/services/core_services/core_services_application_delegate.cc @@ -12,7 +12,7 @@ #include "components/resource_provider/resource_provider_app.h" #include "components/view_manager/surfaces/surfaces_service_application.h" #include "components/view_manager/view_manager_app.h" -#include "mandoline/ui/browser/browser.h" +#include "mandoline/ui/browser/browser_manager.h" #include "mojo/application/public/cpp/application_connection.h" #include "mojo/application/public/cpp/application_impl.h" #include "mojo/application/public/cpp/application_runner.h" @@ -122,7 +122,7 @@ void CoreServicesApplicationDelegate::StartApplication( scoped_ptr<mojo::ApplicationDelegate> delegate; if (url == "mojo://browser/") - delegate.reset(new mandoline::Browser); + delegate.reset(new mandoline::BrowserManager); else if (url == "mojo://clipboard/") delegate.reset(new clipboard::ClipboardApplicationDelegate); else if (url == "mojo://filesystem_service/") diff --git a/mandoline/ui/browser/BUILD.gn b/mandoline/ui/browser/BUILD.gn index c46d388..d5258a3 100644 --- a/mandoline/ui/browser/BUILD.gn +++ b/mandoline/ui/browser/BUILD.gn @@ -29,6 +29,8 @@ source_set("lib") { sources = [ "browser.cc", "browser.h", + "browser_manager.cc", + "browser_manager.h", "navigator_host_impl.cc", "navigator_host_impl.h", ] diff --git a/mandoline/ui/browser/browser.cc b/mandoline/ui/browser/browser.cc index 1ffb1ce..eb56630 100644 --- a/mandoline/ui/browser/browser.cc +++ b/mandoline/ui/browser/browser.cc @@ -11,6 +11,7 @@ #include "mandoline/tab/frame.h" #include "mandoline/tab/frame_connection.h" #include "mandoline/tab/frame_tree.h" +#include "mandoline/ui/browser/browser_manager.h" #include "mandoline/ui/browser/browser_ui.h" #include "mojo/application/public/cpp/application_runner.h" #include "mojo/common/common_type_converters.h" @@ -32,28 +33,15 @@ gfx::Size GetInitialViewportSize() { } // namespace -Browser::Browser() - : root_(nullptr), +Browser::Browser(mojo::ApplicationImpl* app, BrowserManager* browser_manager) + : view_manager_init_(app, this, this), + root_(nullptr), content_(nullptr), omnibox_(nullptr), navigator_host_(this), - app_(nullptr) { -} - -Browser::~Browser() { - // Destruct ui_ manually while |this| is alive and reset the pointer first. - // This is to avoid a double delete when OnViewManagerDestroyed gets - // called. - delete ui_.release(); -} - -void Browser::ReplaceContentWithRequest(mojo::URLRequestPtr request) { - Embed(request.Pass()); -} - -void Browser::Initialize(mojo::ApplicationImpl* app) { - app_ = app; - view_manager_init_.reset(new mojo::ViewManagerInit(app, this, this)); + app_(app), + browser_manager_(browser_manager) { + view_manager_init_.connection()->AddService<ViewEmbedder>(this); ui_.reset(BrowserUI::Create(this, app)); @@ -70,17 +58,15 @@ void Browser::Initialize(mojo::ApplicationImpl* app) { } } -bool Browser::ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) { - connection->AddService<LaunchHandler>(this); - // TODO: register embed interface here. - return true; +Browser::~Browser() { + // Destruct ui_ manually while |this| is alive and reset the pointer first. + // This is to avoid a double delete when OnViewManagerDestroyed gets + // called. + ui_.reset(); } -bool Browser::ConfigureOutgoingConnection( - mojo::ApplicationConnection* connection) { - connection->AddService<ViewEmbedder>(this); - return true; +void Browser::ReplaceContentWithRequest(mojo::URLRequestPtr request) { + Embed(request.Pass()); } void Browser::OnEmbed(mojo::View* root) { @@ -98,13 +84,13 @@ void Browser::OnEmbed(mojo::View* root) { content_ = root->view_manager()->CreateView(); ui_->Init(root_); - view_manager_init_->view_manager_root()->SetViewportSize( + view_manager_init_.view_manager_root()->SetViewportSize( mojo::Size::From(GetInitialViewportSize())); root_->AddChild(content_); content_->SetVisible(true); - view_manager_init_->view_manager_root()->AddAccelerator( + view_manager_init_.view_manager_root()->AddAccelerator( mojo::KEYBOARD_CODE_BROWSER_BACK, mojo::EVENT_FLAGS_NONE); // Now that we're ready, either load a pending url or the default url. @@ -149,7 +135,7 @@ void Browser::OnEmbedForDescendant(mojo::View* view, void Browser::OnViewManagerDestroyed(mojo::ViewManager* view_manager) { ui_.reset(); root_ = nullptr; - app_->Terminate(); + browser_manager_->BrowserClosed(this); } void Browser::OnAccelerator(mojo::EventPtr event) { @@ -199,12 +185,6 @@ void Browser::Embed(mojo::URLRequestPtr request) { navigator_host_.RecordNavigation(gurl.spec()); } -void Browser::LaunchURL(const mojo::String& url) { - mojo::URLRequestPtr request(mojo::URLRequest::New()); - request->url = url; - ReplaceContentWithRequest(request.Pass()); -} - void Browser::Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest<mojo::NavigatorHost> request) { navigator_host_.Bind(request.Pass()); @@ -215,11 +195,6 @@ void Browser::Create(mojo::ApplicationConnection* connection, view_embedder_bindings_.AddBinding(this, request.Pass()); } -void Browser::Create(mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<LaunchHandler> request) { - launch_handler_bindings_.AddBinding(this, request.Pass()); -} - void Browser::ShowOmnibox(mojo::URLRequestPtr request) { if (!omnibox_) { omnibox_ = root_->view_manager()->CreateView(); diff --git a/mandoline/ui/browser/browser.h b/mandoline/ui/browser/browser.h index 92c7d72..fa6c48d 100644 --- a/mandoline/ui/browser/browser.h +++ b/mandoline/ui/browser/browser.h @@ -7,10 +7,10 @@ #include "components/view_manager/public/cpp/view_manager.h" #include "components/view_manager/public/cpp/view_manager_delegate.h" +#include "components/view_manager/public/cpp/view_manager_init.h" #include "components/view_manager/public/interfaces/view_manager_root.mojom.h" #include "mandoline/services/navigation/public/interfaces/navigation.mojom.h" #include "mandoline/ui/browser/navigator_host_impl.h" -#include "mandoline/ui/browser/public/interfaces/launch_handler.mojom.h" #include "mandoline/ui/browser/public/interfaces/omnibox.mojom.h" #include "mandoline/ui/browser/public/interfaces/view_embedder.mojom.h" #include "mojo/application/public/cpp/application_delegate.h" @@ -26,20 +26,18 @@ class ViewManagerInit; namespace mandoline { +class BrowserManager; class BrowserUI; class FrameTree; -class Browser : public mojo::ApplicationDelegate, - public mojo::ViewManagerDelegate, +class Browser : public mojo::ViewManagerDelegate, public mojo::ViewManagerRootClient, public OmniboxClient, public ViewEmbedder, - public LaunchHandler, public mojo::InterfaceFactory<mojo::NavigatorHost>, - public mojo::InterfaceFactory<ViewEmbedder>, - public mojo::InterfaceFactory<LaunchHandler> { + public mojo::InterfaceFactory<ViewEmbedder> { public: - Browser(); + Browser(mojo::ApplicationImpl* app, BrowserManager* browser_manager); ~Browser() override; void ReplaceContentWithRequest(mojo::URLRequestPtr request); @@ -50,13 +48,6 @@ class Browser : public mojo::ApplicationDelegate, const GURL& current_url() const { return current_url_; } private: - // Overridden from mojo::ApplicationDelegate: - void Initialize(mojo::ApplicationImpl* app) override; - bool ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) override; - bool ConfigureOutgoingConnection( - mojo::ApplicationConnection* connection) override; - // Overridden from mojo::ViewManagerDelegate: void OnEmbed(mojo::View* root) override; void OnEmbedForDescendant(mojo::View* view, @@ -73,9 +64,6 @@ class Browser : public mojo::ApplicationDelegate, // Overridden from ViewEmbedder: void Embed(mojo::URLRequestPtr request) override; - // Overridden from LaunchHandler: - void LaunchURL(const mojo::String& url) override; - // Overridden from mojo::InterfaceFactory<mojo::NavigatorHost>: void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest<mojo::NavigatorHost> request) override; @@ -84,13 +72,9 @@ class Browser : public mojo::ApplicationDelegate, void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest<ViewEmbedder> request) override; - // Overridden from mojo::InterfaceFactory<LaunchHandler>: - void Create(mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<LaunchHandler> request) override; - void ShowOmnibox(mojo::URLRequestPtr request); - scoped_ptr<mojo::ViewManagerInit> view_manager_init_; + mojo::ViewManagerInit view_manager_init_; // Only support being embedded once, so both application-level // and embedding-level state are shared on the same object. @@ -101,7 +85,6 @@ class Browser : public mojo::ApplicationDelegate, mojo::URLRequestPtr pending_request_; mojo::WeakBindingSet<ViewEmbedder> view_embedder_bindings_; - mojo::WeakBindingSet<LaunchHandler> launch_handler_bindings_; NavigatorHostImpl navigator_host_; @@ -109,6 +92,7 @@ class Browser : public mojo::ApplicationDelegate, scoped_ptr<BrowserUI> ui_; mojo::ApplicationImpl* app_; + BrowserManager* browser_manager_; scoped_ptr<FrameTree> frame_tree_; diff --git a/mandoline/ui/browser/browser_manager.cc b/mandoline/ui/browser/browser_manager.cc new file mode 100644 index 0000000..8b4089d --- /dev/null +++ b/mandoline/ui/browser/browser_manager.cc @@ -0,0 +1,62 @@ +// 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 "mandoline/ui/browser/browser_manager.h" + +#include "mandoline/ui/browser/browser.h" + +namespace mandoline { + +BrowserManager::BrowserManager() + : app_(nullptr) { +} + +BrowserManager::~BrowserManager() { + DCHECK(browsers_.empty()); +} + +Browser* BrowserManager::CreateBrowser() { + DCHECK(app_); + Browser* browser = new Browser(app_, this); + browsers_.insert(browser); + return browser; +} + +void BrowserManager::BrowserClosed(Browser* browser) { + scoped_ptr<Browser> browser_owner(browser); + DCHECK_GT(browsers_.count(browser), 0u); + browsers_.erase(browser); + if (browsers_.empty()) + app_->Terminate(); +} + +void BrowserManager::LaunchURL(const mojo::String& url) { + DCHECK(!browsers_.empty()); + mojo::URLRequestPtr request(mojo::URLRequest::New()); + request->url = url; + // TODO(fsamuel): Create a new Browser once we support multiple browser + // windows. + (*browsers_.begin())->ReplaceContentWithRequest(request.Pass()); +} + +void BrowserManager::Initialize(mojo::ApplicationImpl* app) { + app_ = app; +#if defined(USE_AURA) + aura_init_.reset(new AuraInit(app->shell())); +#endif + CreateBrowser(); +} + +bool BrowserManager::ConfigureIncomingConnection( + mojo::ApplicationConnection* connection) { + connection->AddService<LaunchHandler>(this); + return true; +} + +void BrowserManager::Create(mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<LaunchHandler> request) { + launch_handler_bindings_.AddBinding(this, request.Pass()); +} + +} // namespace mandoline diff --git a/mandoline/ui/browser/browser_manager.h b/mandoline/ui/browser/browser_manager.h new file mode 100644 index 0000000..341f5a4 --- /dev/null +++ b/mandoline/ui/browser/browser_manager.h @@ -0,0 +1,64 @@ +// 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 MANDOLINE_UI_BROWSER_BROWSER_MANAGER_H_ +#define MANDOLINE_UI_BROWSER_BROWSER_MANAGER_H_ + +#include <set> + +#include "base/memory/scoped_vector.h" +#include "mandoline/ui/browser/public/interfaces/launch_handler.mojom.h" +#include "mojo/application/public/cpp/application_delegate.h" +#include "mojo/application/public/cpp/application_impl.h" +#include "mojo/application/public/cpp/connect.h" +#include "mojo/common/weak_binding_set.h" + +#if defined(USE_AURA) +#include "mandoline/ui/aura/aura_init.h" +#endif + +namespace mandoline { + +class Browser; + +// BrowserManager creates and manages the lifetime of Browsers. +class BrowserManager : public mojo::ApplicationDelegate, + public LaunchHandler, + public mojo::InterfaceFactory<LaunchHandler> { + public: + BrowserManager(); + ~BrowserManager() override; + + // BrowserManager owns the returned Browser. + Browser* CreateBrowser(); + + // Invoked by |browser| when it has closed. + void BrowserClosed(Browser* browser); + + private: + // Overridden from LaunchHandler: + void LaunchURL(const mojo::String& url) override; + + // Overridden from mojo::ApplicationDelegate: + void Initialize(mojo::ApplicationImpl* app) override; + bool ConfigureIncomingConnection( + mojo::ApplicationConnection* connection) override; + + // Overridden from mojo::InterfaceFactory<LaunchHandler>: + void Create(mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<LaunchHandler> request) override; + + mojo::ApplicationImpl* app_; +#if defined(USE_AURA) + scoped_ptr<AuraInit> aura_init_; +#endif + mojo::WeakBindingSet<LaunchHandler> launch_handler_bindings_; + std::set<Browser*> browsers_; + + DISALLOW_COPY_AND_ASSIGN(BrowserManager); +}; + +} // namespace mandoline + +#endif // MANDOLINE_UI_BROWSER_BROWSER_MANAGER_H_ diff --git a/mandoline/ui/browser/desktop/desktop_ui.cc b/mandoline/ui/browser/desktop/desktop_ui.cc index b417243..9476b87 100644 --- a/mandoline/ui/browser/desktop/desktop_ui.cc +++ b/mandoline/ui/browser/desktop/desktop_ui.cc @@ -21,8 +21,7 @@ namespace mandoline { // DesktopUI, public: DesktopUI::DesktopUI(Browser* browser, mojo::ApplicationImpl* application_impl) - : aura_init_(application_impl->shell()), - browser_(browser), + : browser_(browser), application_impl_(application_impl), omnibox_launcher_(nullptr), root_(nullptr), diff --git a/mandoline/ui/browser/desktop/desktop_ui.h b/mandoline/ui/browser/desktop/desktop_ui.h index 3be7f10..a83f6b2 100644 --- a/mandoline/ui/browser/desktop/desktop_ui.h +++ b/mandoline/ui/browser/desktop/desktop_ui.h @@ -5,7 +5,6 @@ #ifndef MANDOLINE_UI_BROWSER_DESKTOP_DESKTOP_UI_H_ #define MANDOLINE_UI_BROWSER_DESKTOP_DESKTOP_UI_H_ -#include "mandoline/ui/aura/aura_init.h" #include "mandoline/ui/browser/browser_ui.h" #include "mandoline/ui/browser/public/interfaces/omnibox.mojom.h" #include "ui/views/controls/button/button.h" @@ -43,7 +42,6 @@ class DesktopUI : public BrowserUI, // Overridden from views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; - AuraInit aura_init_; Browser* browser_; mojo::ApplicationImpl* application_impl_; views::LabelButton* omnibox_launcher_; diff --git a/mandoline/ui/browser/main.cc b/mandoline/ui/browser/main.cc index e95aee4..a7128af 100644 --- a/mandoline/ui/browser/main.cc +++ b/mandoline/ui/browser/main.cc @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mandoline/ui/browser/browser.h" +#include "mandoline/ui/browser/browser_manager.h" #include "mojo/application/public/cpp/application_runner.h" #include "third_party/mojo/src/mojo/public/c/system/main.h" MojoResult MojoMain(MojoHandle shell_handle) { - mojo::ApplicationRunner runner(new mandoline::Browser); + mojo::ApplicationRunner runner(new mandoline::BrowserManager); return runner.Run(shell_handle); } |