Commit 43e756dd authored by Mark Cogan's avatar Mark Cogan Committed by Commit Bot

[iOS] Move dispatcher to Browser.

As the first step in making coordinators more consistent in their
public APIs and internal usage of Browser, CommandDispatcher is moving
to be created and owned by Browser instances.

Note that this still leaves us with two dispatchers per scene; one for
regular tabs and one for OTR tabs. Untangling that is a separate (and
more painful) effort.

This change should have no direct side effects

Change-Id: I81211a33616cf3c47cc8c286da09166bf1003d8d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1940244
Commit-Queue: Mark Cogan <marq@chromium.org>
Reviewed-by: default avatarStepan Khapugin <stkhapugin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#720017}
parent 4e25b3ef
......@@ -16,6 +16,7 @@ source_set("main") {
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/sessions:serialisation",
"//ios/chrome/browser/tabs",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/web_state_list",
]
configs += [ "//build/config/compiler:enable_arc" ]
......@@ -34,6 +35,7 @@ source_set("test_support") {
"//base",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/tabs",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/web_state_list",
]
configs += [ "//build/config/compiler:enable_arc" ]
......
......@@ -11,6 +11,7 @@
#include "base/supports_user_data.h"
class BrowserObserver;
@class CommandDispatcher;
@class TabModel;
class WebStateList;
......@@ -40,6 +41,9 @@ class Browser : public base::SupportsUserData {
// Accessor for the WebStateList.
virtual WebStateList* GetWebStateList() const = 0;
// Accessor for the CommandDispatcher.
virtual CommandDispatcher* GetCommandDispatcher() const = 0;
// Adds and removes observers.
virtual void AddObserver(BrowserObserver* observer) = 0;
virtual void RemoveObserver(BrowserObserver* observer) = 0;
......
......@@ -11,6 +11,7 @@
#include "base/macros.h"
#include "base/observer_list.h"
@class SceneState;
@class TabModel;
class WebStateList;
class WebStateListDelegate;
......@@ -26,14 +27,16 @@ class ChromeBrowserState;
// See src/docs/ios/objects.md for more information.
class BrowserImpl : public Browser {
public:
// Constructs a BrowserImpl attached to |browser_state|.
explicit BrowserImpl(ios::ChromeBrowserState* browser_state);
// Constructs a BrowserImpl attached to |browser_state| in the context of
// |scene_state|
BrowserImpl(ios::ChromeBrowserState* browser_state);
~BrowserImpl() override;
// Browser.
ios::ChromeBrowserState* GetBrowserState() const override;
TabModel* GetTabModel() const override;
WebStateList* GetWebStateList() const override;
CommandDispatcher* GetCommandDispatcher() const override;
void AddObserver(BrowserObserver* observer) override;
void RemoveObserver(BrowserObserver* observer) override;
......@@ -48,6 +51,7 @@ class BrowserImpl : public Browser {
__strong TabModel* tab_model_;
std::unique_ptr<WebStateListDelegate> web_state_list_delegate_;
std::unique_ptr<WebStateList> web_state_list_;
__strong CommandDispatcher* command_dispatcher_;
base::ObserverList<BrowserObserver, /* check_empty= */ true> observers_;
DISALLOW_COPY_AND_ASSIGN(BrowserImpl);
......
......@@ -11,6 +11,7 @@
#import "ios/chrome/browser/main/browser_web_state_list_delegate.h"
#import "ios/chrome/browser/sessions/session_service_ios.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_list_delegate.h"
......@@ -19,7 +20,8 @@
#endif
BrowserImpl::BrowserImpl(ios::ChromeBrowserState* browser_state)
: browser_state_(browser_state) {
: browser_state_(browser_state),
command_dispatcher_([[CommandDispatcher alloc] init]) {
DCHECK(browser_state_);
web_state_list_delegate_ = std::make_unique<BrowserWebStateListDelegate>();
......@@ -60,6 +62,10 @@ WebStateList* BrowserImpl::GetWebStateList() const {
return web_state_list_.get();
}
CommandDispatcher* BrowserImpl::GetCommandDispatcher() const {
return command_dispatcher_;
}
void BrowserImpl::AddObserver(BrowserObserver* observer) {
observers_.AddObserver(observer);
}
......
......@@ -27,6 +27,7 @@ class TestBrowser : public Browser {
ios::ChromeBrowserState* GetBrowserState() const override;
TabModel* GetTabModel() const override;
WebStateList* GetWebStateList() const override;
CommandDispatcher* GetCommandDispatcher() const override;
void AddObserver(BrowserObserver* observer) override;
void RemoveObserver(BrowserObserver* observer) override;
......@@ -34,6 +35,7 @@ class TestBrowser : public Browser {
ios::ChromeBrowserState* browser_state_ = nullptr;
TabModel* tab_model_ = nil;
WebStateList* web_state_list_ = nullptr;
__strong CommandDispatcher* command_dispatcher_ = nil;
base::ObserverList<BrowserObserver, /* check_empty= */ true> observers_;
DISALLOW_COPY_AND_ASSIGN(TestBrowser);
......
......@@ -6,6 +6,7 @@
#include "ios/chrome/browser/main/browser_observer.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -15,11 +16,14 @@ TestBrowser::TestBrowser(ios::ChromeBrowserState* browser_state,
TabModel* tab_model)
: browser_state_(browser_state),
tab_model_(tab_model),
web_state_list_(tab_model_.webStateList) {}
web_state_list_(tab_model_.webStateList),
command_dispatcher_([[CommandDispatcher alloc] init]) {}
TestBrowser::TestBrowser(ios::ChromeBrowserState* browser_state,
WebStateList* web_state_list)
: browser_state_(browser_state), web_state_list_(web_state_list) {}
: browser_state_(browser_state),
web_state_list_(web_state_list),
command_dispatcher_([[CommandDispatcher alloc] init]) {}
TestBrowser::~TestBrowser() {
for (auto& observer : observers_) {
......@@ -39,6 +43,10 @@ WebStateList* TestBrowser::GetWebStateList() const {
return web_state_list_;
}
CommandDispatcher* TestBrowser::GetCommandDispatcher() const {
return command_dispatcher_;
}
void TestBrowser::AddObserver(BrowserObserver* observer) {
observers_.AddObserver(observer);
}
......
......@@ -69,8 +69,8 @@
// Whether the coordinator is started.
@property(nonatomic, assign, getter=isStarted) BOOL started;
// Handles command dispatching.
@property(nonatomic, strong) CommandDispatcher* dispatcher;
// Handles command dispatching, provided by the Browser instance.
@property(nonatomic, weak) CommandDispatcher* dispatcher;
// The coordinator managing the container view controller.
@property(nonatomic, strong)
......@@ -158,13 +158,20 @@
#pragma mark - ChromeCoordinator
- (instancetype)initWithBaseViewController:(UIViewController*)viewController
browser:(Browser*)browser {
if (self = [super initWithBaseViewController:viewController
browser:browser]) {
_dispatcher = browser->GetCommandDispatcher();
}
return self;
}
- (void)start {
if (self.started)
return;
DCHECK(self.browserState);
DCHECK(!self.viewController);
self.dispatcher = [[CommandDispatcher alloc] init];
[self startBrowserContainer];
[self createViewController];
[self startChildCoordinators];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment