summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfsamuel <fsamuel@chromium.org>2015-06-18 15:21:17 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-18 22:21:50 +0000
commit0404e9268e3488f6fd99249bcc757b74c3d382ff (patch)
tree8f341fb42392c0427f78bd6b93ab530ff72b2b2d
parentc3994e9fb2f44a428ad4bff03af3d2e2b9c10eec (diff)
downloadchromium_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.cc14
-rw-r--r--components/view_manager/public/cpp/view_manager_init.h5
-rw-r--r--mandoline/services/core_services/core_services_application_delegate.cc4
-rw-r--r--mandoline/ui/browser/BUILD.gn2
-rw-r--r--mandoline/ui/browser/browser.cc59
-rw-r--r--mandoline/ui/browser/browser.h30
-rw-r--r--mandoline/ui/browser/browser_manager.cc62
-rw-r--r--mandoline/ui/browser/browser_manager.h64
-rw-r--r--mandoline/ui/browser/desktop/desktop_ui.cc3
-rw-r--r--mandoline/ui/browser/desktop/desktop_ui.h2
-rw-r--r--mandoline/ui/browser/main.cc4
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);
}