Commit 71abbc33 authored by Mark Cogan's avatar Mark Cogan Committed by Commit Bot

[iOS] Refactor TabModelSyncedWindowDelegate into a BrowserAgent

Bug: 1050134
Change-Id: Ic84167df95cb1b4e0c3bf86cda3677bc18f27283
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2074885
Commit-Queue: Mark Cogan <marq@chromium.org>
Reviewed-by: default avatarMohammad Refaat <mrefaat@chromium.org>
Cr-Commit-Position: refs/heads/master@{#745133}
parent f7bddeee
......@@ -12,6 +12,7 @@
#import "ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.h"
#import "ios/chrome/browser/sessions/session_restoration_browser_agent.h"
#import "ios/chrome/browser/sessions/session_service_ios.h"
#include "ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h"
#import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h"
#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
......@@ -25,6 +26,7 @@ void AttachBrowserAgents(Browser* browser) {
}
TabInsertionBrowserAgent::CreateForBrowser(browser);
AttachInfobarOverlayBrowserAgent(browser);
SyncedWindowDelegateBrowserAgent::CreateForBrowser(browser);
SessionRestorationBrowserAgent::CreateForBrowser(
browser, [SessionServiceIOS sharedService]);
......
......@@ -13,9 +13,9 @@
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios.h"
#include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios_factory.h"
#include "ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/tabs/tab_model_list.h"
#include "ios/chrome/browser/tabs/tab_model_synced_window_delegate.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
#include "url/gurl.h"
......
......@@ -25,7 +25,7 @@
#include "ios/chrome/browser/sync/glue/sync_start_util.h"
#include "ios/chrome/browser/sync/model_type_store_service_factory.h"
#import "ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h"
#include "ios/chrome/browser/tabs/tab_model_synced_window_delegate_getter.h"
#include "ios/chrome/browser/tabs/ios_synced_window_delegate_getter.h"
#include "ios/chrome/common/channel_info.h"
#include "ios/web/public/thread/web_thread.h"
#include "url/gurl.h"
......@@ -56,7 +56,7 @@ class SyncSessionsClientImpl : public sync_sessions::SyncSessionsClient {
explicit SyncSessionsClientImpl(ChromeBrowserState* browser_state)
: browser_state_(browser_state),
window_delegates_getter_(
std::make_unique<TabModelSyncedWindowDelegatesGetter>()),
std::make_unique<IOSSyncedWindowDelegatesGetter>()),
local_session_event_router_(
std::make_unique<IOSChromeLocalSessionEventRouter>(
browser_state_,
......
......@@ -4,12 +4,12 @@
source_set("tabs") {
sources = [
"ios_synced_window_delegate_getter.h",
"synced_window_delegate_browser_agent.h",
"tab_helper_util.h",
"tab_model.h",
"tab_model_list.h",
"tab_model_list_observer.h",
"tab_model_synced_window_delegate.h",
"tab_model_synced_window_delegate_getter.h",
"tab_parenting_global_observer.cc",
"tab_parenting_global_observer.h",
"tab_title_util.h",
......@@ -18,6 +18,7 @@ source_set("tabs") {
deps = [
"//components/sessions",
"//components/sync_sessions",
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/sessions:serialisation",
"//ios/chrome/browser/sessions:session_service",
"//ios/chrome/browser/web_state_list",
......@@ -31,11 +32,11 @@ source_set("tabs_internal") {
sources = [
"closing_web_state_observer.h",
"closing_web_state_observer.mm",
"ios_synced_window_delegate_getter.mm",
"synced_window_delegate_browser_agent.mm",
"tab_helper_util.mm",
"tab_model.mm",
"tab_model_list.mm",
"tab_model_synced_window_delegate.mm",
"tab_model_synced_window_delegate_getter.mm",
"tab_parenting_observer.h",
"tab_parenting_observer.mm",
"tab_title_util.h",
......
......@@ -2,12 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_TABS_TAB_MODEL_SYNCED_WINDOW_DELEGATE_GETTER_H_
#define IOS_CHROME_BROWSER_TABS_TAB_MODEL_SYNCED_WINDOW_DELEGATE_GETTER_H_
#ifndef IOS_CHROME_BROWSER_TABS_IOS_SYNCED_WINDOW_DELEGATE_GETTER_H_
#define IOS_CHROME_BROWSER_TABS_IOS_SYNCED_WINDOW_DELEGATE_GETTER_H_
#include <set>
#include "base/macros.h"
#include "components/sessions/core/session_id.h"
#include "components/sync_sessions/synced_window_delegates_getter.h"
......@@ -15,19 +12,21 @@ namespace browser_sync {
class SyncedWindowDelegate;
}
class TabModelSyncedWindowDelegatesGetter
class IOSSyncedWindowDelegatesGetter
: public sync_sessions::SyncedWindowDelegatesGetter {
public:
TabModelSyncedWindowDelegatesGetter();
~TabModelSyncedWindowDelegatesGetter() override;
IOSSyncedWindowDelegatesGetter();
// Not copyable or moveable
IOSSyncedWindowDelegatesGetter(const IOSSyncedWindowDelegatesGetter&) =
delete;
IOSSyncedWindowDelegatesGetter& operator=(
const IOSSyncedWindowDelegatesGetter&) = delete;
~IOSSyncedWindowDelegatesGetter() override;
// sync_sessions::SyncedWindowDelegatesGetter:
SyncedWindowDelegateMap GetSyncedWindowDelegates() override;
const sync_sessions::SyncedWindowDelegate* FindById(
SessionID session_id) override;
private:
DISALLOW_COPY_AND_ASSIGN(TabModelSyncedWindowDelegatesGetter);
};
#endif // IOS_CHROME_BROWSER_TABS_TAB_MODEL_SYNCED_WINDOW_DELEGATE_GETTER_H_
#endif // IOS_CHROME_BROWSER_TABS_IOS_SYNCED_WINDOW_DELEGATE_GETTER_H_
......@@ -2,27 +2,29 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/chrome/browser/tabs/tab_model_synced_window_delegate_getter.h"
#include "ios/chrome/browser/tabs/ios_synced_window_delegate_getter.h"
#include <vector>
#include "base/logging.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/tabs/tab_model_list.h"
#import "ios/chrome/browser/tabs/tab_model_synced_window_delegate.h"
#include "ios/chrome/browser/main/browser_list.h"
#include "ios/chrome/browser/main/browser_list_factory.h"
#import "ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
TabModelSyncedWindowDelegatesGetter::TabModelSyncedWindowDelegatesGetter() {}
IOSSyncedWindowDelegatesGetter::IOSSyncedWindowDelegatesGetter() {}
TabModelSyncedWindowDelegatesGetter::~TabModelSyncedWindowDelegatesGetter() {}
IOSSyncedWindowDelegatesGetter::~IOSSyncedWindowDelegatesGetter() {}
TabModelSyncedWindowDelegatesGetter::SyncedWindowDelegateMap
TabModelSyncedWindowDelegatesGetter::GetSyncedWindowDelegates() {
IOSSyncedWindowDelegatesGetter::SyncedWindowDelegateMap
IOSSyncedWindowDelegatesGetter::GetSyncedWindowDelegates() {
SyncedWindowDelegateMap synced_window_delegates;
std::vector<ChromeBrowserState*> browser_states =
......@@ -32,12 +34,12 @@ TabModelSyncedWindowDelegatesGetter::GetSyncedWindowDelegates() {
for (auto* browser_state : browser_states) {
DCHECK(!browser_state->IsOffTheRecord());
NSArray<TabModel*>* tabModels =
TabModelList::GetTabModelsForChromeBrowserState(browser_state);
for (TabModel* tabModel in tabModels) {
if (tabModel.webStateList->GetActiveWebState()) {
BrowserList* browsers =
BrowserListFactory::GetForBrowserState(browser_state);
for (Browser* browser : browsers->AllRegularBrowsers()) {
if (browser->GetWebStateList()->GetActiveWebState()) {
sync_sessions::SyncedWindowDelegate* synced_window_delegate =
tabModel.syncedWindowDelegate;
SyncedWindowDelegateBrowserAgent::FromBrowser(browser);
synced_window_delegates[synced_window_delegate->GetSessionId()] =
synced_window_delegate;
}
......@@ -48,7 +50,7 @@ TabModelSyncedWindowDelegatesGetter::GetSyncedWindowDelegates() {
}
const sync_sessions::SyncedWindowDelegate*
TabModelSyncedWindowDelegatesGetter::FindById(SessionID session_id) {
IOSSyncedWindowDelegatesGetter::FindById(SessionID session_id) {
for (const auto& iter : GetSyncedWindowDelegates()) {
if (session_id == iter.second->GetSessionId())
return iter.second;
......
......@@ -2,12 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_TABS_TAB_MODEL_SYNCED_WINDOW_DELEGATE_H_
#define IOS_CHROME_BROWSER_TABS_TAB_MODEL_SYNCED_WINDOW_DELEGATE_H_
#ifndef IOS_CHROME_BROWSER_TABS_SYNCED_WINDOW_DELEGATE_BROWSER_AGENT_H_
#define IOS_CHROME_BROWSER_TABS_SYNCED_WINDOW_DELEGATE_BROWSER_AGENT_H_
#include "base/macros.h"
#include "components/sessions/core/session_id.h"
#include "components/sync_sessions/synced_window_delegate.h"
#include "ios/chrome/browser/main/browser_observer.h"
#include "ios/chrome/browser/main/browser_user_data.h"
#include "ios/chrome/browser/web_state_list/web_state_list_observer.h"
class WebStateList;
......@@ -18,12 +19,18 @@ class SyncedTabDelegate;
// A TabModelSyncedWindowDelegate is the iOS-based implementation of
// SyncedWindowDelegate.
class TabModelSyncedWindowDelegate : public sync_sessions::SyncedWindowDelegate,
public WebStateListObserver {
class SyncedWindowDelegateBrowserAgent
: public sync_sessions::SyncedWindowDelegate,
BrowserObserver,
public BrowserUserData<SyncedWindowDelegateBrowserAgent>,
public WebStateListObserver {
public:
// This constructor does not add the constructed object as an observere of
// |web_state_list|; calling code is expected to do that.
explicit TabModelSyncedWindowDelegate(WebStateList* web_state_list);
// Not copyable or moveable
SyncedWindowDelegateBrowserAgent(const SyncedWindowDelegateBrowserAgent&) =
delete;
SyncedWindowDelegateBrowserAgent& operator=(
const SyncedWindowDelegateBrowserAgent&) = delete;
~SyncedWindowDelegateBrowserAgent() override;
// Return the tab id for the tab at |index|.
SessionID GetTabIdAt(int index) const override;
......@@ -51,13 +58,18 @@ class TabModelSyncedWindowDelegate : public sync_sessions::SyncedWindowDelegate,
int index) override;
private:
explicit SyncedWindowDelegateBrowserAgent(Browser* browser);
friend class BrowserUserData<SyncedWindowDelegateBrowserAgent>;
BROWSER_USER_DATA_KEY_DECL();
// BrowserObserver
void BrowserDestroyed(Browser* browser) override;
// Sets the window id of |web_state| to |session_id_|.
void SetWindowIdForWebState(web::WebState* web_state);
WebStateList* web_state_list_;
SessionID session_id_;
DISALLOW_COPY_AND_ASSIGN(TabModelSyncedWindowDelegate);
};
#endif // IOS_CHROME_BROWSER_TABS_TAB_MODEL_SYNCED_WINDOW_DELEGATE_H_
#endif // IOS_CHROME_BROWSER_TABS_SYNCED_WINDOW_DELEGATE_BROWSER_AGENT_H_
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/chrome/browser/tabs/tab_model_synced_window_delegate.h"
#include "ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h"
#include "base/logging.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
......@@ -15,19 +15,26 @@
#error "This file requires ARC support."
#endif
TabModelSyncedWindowDelegate::TabModelSyncedWindowDelegate(
WebStateList* web_state_list)
: web_state_list_(web_state_list), session_id_(SessionID::NewUnique()) {
BROWSER_USER_DATA_KEY_IMPL(SyncedWindowDelegateBrowserAgent)
SyncedWindowDelegateBrowserAgent::SyncedWindowDelegateBrowserAgent(
Browser* browser)
: web_state_list_(browser->GetWebStateList()),
session_id_(SessionID::NewUnique()) {
browser->AddObserver(this);
for (int index = 0; index < web_state_list_->count(); ++index) {
SetWindowIdForWebState(web_state_list_->GetWebStateAt(index));
}
web_state_list_->AddObserver(this);
}
SessionID TabModelSyncedWindowDelegate::GetTabIdAt(int index) const {
SyncedWindowDelegateBrowserAgent::~SyncedWindowDelegateBrowserAgent() {}
SessionID SyncedWindowDelegateBrowserAgent::GetTabIdAt(int index) const {
return GetTabAt(index)->GetSessionId();
}
bool TabModelSyncedWindowDelegate::IsSessionRestoreInProgress() const {
bool SyncedWindowDelegateBrowserAgent::IsSessionRestoreInProgress() const {
// On iOS, the WebStateList restoration is done in a batch operation on the
// main thread.
// * as this is in a batch operation, no event is forwarded to the sync engine
......@@ -39,47 +46,47 @@ bool TabModelSyncedWindowDelegate::IsSessionRestoreInProgress() const {
return false;
}
bool TabModelSyncedWindowDelegate::ShouldSync() const {
bool SyncedWindowDelegateBrowserAgent::ShouldSync() const {
return true;
}
bool TabModelSyncedWindowDelegate::HasWindow() const {
bool SyncedWindowDelegateBrowserAgent::HasWindow() const {
return true;
}
SessionID TabModelSyncedWindowDelegate::GetSessionId() const {
SessionID SyncedWindowDelegateBrowserAgent::GetSessionId() const {
return session_id_;
}
int TabModelSyncedWindowDelegate::GetTabCount() const {
int SyncedWindowDelegateBrowserAgent::GetTabCount() const {
return web_state_list_->count();
}
int TabModelSyncedWindowDelegate::GetActiveIndex() const {
int SyncedWindowDelegateBrowserAgent::GetActiveIndex() const {
DCHECK_NE(web_state_list_->active_index(), WebStateList::kInvalidIndex);
return web_state_list_->active_index();
}
bool TabModelSyncedWindowDelegate::IsTypeNormal() const {
bool SyncedWindowDelegateBrowserAgent::IsTypeNormal() const {
return true;
}
bool TabModelSyncedWindowDelegate::IsTypePopup() const {
bool SyncedWindowDelegateBrowserAgent::IsTypePopup() const {
return false;
}
bool TabModelSyncedWindowDelegate::IsTabPinned(
bool SyncedWindowDelegateBrowserAgent::IsTabPinned(
const sync_sessions::SyncedTabDelegate* tab) const {
return false;
}
sync_sessions::SyncedTabDelegate* TabModelSyncedWindowDelegate::GetTabAt(
sync_sessions::SyncedTabDelegate* SyncedWindowDelegateBrowserAgent::GetTabAt(
int index) const {
return IOSChromeSyncedTabDelegate::FromWebState(
web_state_list_->GetWebStateAt(index));
}
void TabModelSyncedWindowDelegate::WebStateInsertedAt(
void SyncedWindowDelegateBrowserAgent::WebStateInsertedAt(
WebStateList* web_state_list,
web::WebState* web_state,
int index,
......@@ -88,7 +95,7 @@ void TabModelSyncedWindowDelegate::WebStateInsertedAt(
SetWindowIdForWebState(web_state);
}
void TabModelSyncedWindowDelegate::WebStateReplacedAt(
void SyncedWindowDelegateBrowserAgent::WebStateReplacedAt(
WebStateList* web_state_list,
web::WebState* old_web_state,
web::WebState* new_web_state,
......@@ -97,7 +104,12 @@ void TabModelSyncedWindowDelegate::WebStateReplacedAt(
SetWindowIdForWebState(new_web_state);
}
void TabModelSyncedWindowDelegate::SetWindowIdForWebState(
void SyncedWindowDelegateBrowserAgent::SetWindowIdForWebState(
web::WebState* web_state) {
IOSChromeSessionTabHelper::FromWebState(web_state)->SetWindowID(session_id_);
}
void SyncedWindowDelegateBrowserAgent::BrowserDestroyed(Browser* browser) {
web_state_list_->RemoveObserver(this);
browser->RemoveObserver(this);
}
......@@ -9,7 +9,7 @@
#import <UIKit/UIKit.h>
class ChromeBrowserState;
class TabModelSyncedWindowDelegate;
class SyncedWindowDelegateBrowserAgent;
class WebStateList;
class Browser;
......@@ -22,7 +22,7 @@ class Browser;
// The delegate for sync.
@property(nonatomic, readonly)
TabModelSyncedWindowDelegate* syncedWindowDelegate;
SyncedWindowDelegateBrowserAgent* syncedWindowDelegate;
// BrowserState associated with this TabModel.
@property(nonatomic, readonly) ChromeBrowserState* browserState;
......
......@@ -38,8 +38,8 @@
#import "ios/chrome/browser/snapshots/snapshot_cache.h"
#import "ios/chrome/browser/snapshots/snapshot_cache_factory.h"
#import "ios/chrome/browser/tabs/closing_web_state_observer.h"
#import "ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h"
#import "ios/chrome/browser/tabs/tab_model_list.h"
#import "ios/chrome/browser/tabs/tab_model_synced_window_delegate.h"
#import "ios/chrome/browser/tabs/tab_parenting_observer.h"
#import "ios/chrome/browser/web/tab_id_tab_helper.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
......@@ -218,10 +218,6 @@ void RecordMainFrameNavigationMetric(web::WebState* web_state) {
// WebStateListObserverBridges.
NSArray<id<WebStateListObserving>>* _retainedWebStateListObservers;
// The delegate for sync (the actual object will be owned by the observers
// vector, above).
TabModelSyncedWindowDelegate* _syncedWindowDelegate;
// Counters for metrics.
WebStateListMetricsObserver* _webStateListMetricsObserver;
......@@ -284,17 +280,9 @@ void RecordMainFrameNavigationMetric(web::WebState* web_state) {
_sessionRestorationBrowserAgent =
SessionRestorationBrowserAgent::FromBrowser(browser);
_tabUsageRecorder = TabUsageRecorderBrowserAgent::FromBrowser(browser);
// Tab sync handles incognito browser states by filtering on profile, so
// it's important to the backend code to always have a sync window delegate.
std::unique_ptr<TabModelSyncedWindowDelegate> syncedWindowDelegate =
std::make_unique<TabModelSyncedWindowDelegate>(_webStateList);
// Keep a weak ref to the the window delegate, which is then moved into
// the web state list observers list.
_syncedWindowDelegate = syncedWindowDelegate.get();
_webStateListObservers.push_back(std::move(syncedWindowDelegate));
_syncedWindowDelegate =
SyncedWindowDelegateBrowserAgent::FromBrowser(browser);
NSMutableArray<id<WebStateListObserving>>* retainedWebStateListObservers =
[[NSMutableArray alloc] init];
......
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