Commit 677ce7b7 authored by sczs's avatar sczs Committed by Commit Bot

[ios] Recent Tabs Mediator ignores TRS changes if close all tabs is happening.

In order to avoid a RecentTabsTableVC update everytime a tab is closed after
Closed All Tabs has been triggered, RecentTabs mediator stops forwarding
any update signals to its consumer (RecentTabsTableVC) while all close tabs
is taking place. Once this operation is complete it will tell its consumer
to update, thus only refreshing once per Close All Tabs operation.

Bug: 994229
Change-Id: I9eec07fada9863fbaae600ed1dc9675527c24681
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1860526
Commit-Queue: Sergio Collazos <sczs@chromium.org>
Reviewed-by: default avataredchin <edchin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#707242}
parent 44891bed
......@@ -34,6 +34,7 @@ source_set("recent_tabs") {
"//ios/chrome/browser/ui/table_view:feature_flags",
"//ios/chrome/browser/ui/util",
"//ios/chrome/browser/url_loading",
"//ios/chrome/browser/web_state_list",
"//ui/base",
]
public_deps = [
......
......@@ -15,6 +15,7 @@
namespace ios {
class ChromeBrowserState;
}
class WebStateList;
@protocol RecentTabsConsumer;
......@@ -35,6 +36,9 @@ class ChromeBrowserState;
// The coordinator's BrowserState.
@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
// The WebStateList that this mediator listens for.
@property(nonatomic, assign) WebStateList* webStateList;
// Starts observing the he user's signed-in and chrome-sync states.
- (void)initObservers;
......
......@@ -17,6 +17,8 @@
#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
#import "ios/chrome/browser/ui/recent_tabs/recent_tabs_consumer.h"
#import "ios/chrome/browser/ui/recent_tabs/sessions_sync_user_state.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
......@@ -30,7 +32,8 @@ const CGFloat kFaviconWidthHeight = 24;
const CGFloat kFaviconMinWidthHeight = 16;
} // namespace
@interface RecentTabsMediator ()<SyncedSessionsObserver> {
@interface RecentTabsMediator () <SyncedSessionsObserver,
WebStateListObserving> {
std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge>
_syncedSessionsObserver;
std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver;
......@@ -47,13 +50,26 @@ const CGFloat kFaviconMinWidthHeight = 16;
- (BOOL)isSyncCompleted;
// Reload the panel.
- (void)refreshSessionsView;
// YES if Tabs are being updated in batch. (e.g. Closing All, or Undoing a Close
// All).
@property(nonatomic, assign) BOOL processingBatchOperation;
@end
@implementation RecentTabsMediator
@implementation RecentTabsMediator {
std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
}
@synthesize browserState = _browserState;
@synthesize consumer = _consumer;
- (instancetype)init {
self = [super init];
if (self) {
_webStateListObserver = std::make_unique<WebStateListObserverBridge>(self);
}
return self;
}
#pragma mark - Public Interface
- (void)initObservers {
......@@ -76,6 +92,12 @@ const CGFloat kFaviconMinWidthHeight = 16;
- (void)disconnect {
_syncedSessionsObserver.reset();
if (_webStateList) {
_webStateList->RemoveObserver(_webStateListObserver.get());
_webStateListObserver.reset();
_webStateList = nullptr;
}
if (_closedTabsObserver) {
sessions::TabRestoreService* restoreService =
IOSChromeTabRestoreServiceFactory::GetForBrowserState(_browserState);
......@@ -106,13 +128,38 @@ const CGFloat kFaviconMinWidthHeight = 16;
sessions::TabRestoreService* restoreService =
IOSChromeTabRestoreServiceFactory::GetForBrowserState(_browserState);
restoreService->LoadTabsFromLastSession();
[self.consumer refreshRecentlyClosedTabs];
// A WebStateList batch operation can result in batch changes to the
// TabRestoreService (e.g., closing or restoring all tabs). To properly batch
// process TabRestoreService changes, those changes must be executed inside
// the WebStateList batch operation callback. This allows RecentTabs to ignore
// individual tabRestoreServiceChanged calls that correspond to the
// WebStateList batch operation. The consumer is updated once after the batch
// operation is completed.
if (!self.processingBatchOperation)
[self.consumer refreshRecentlyClosedTabs];
}
- (void)tabRestoreServiceDestroyed:(sessions::TabRestoreService*)service {
[self.consumer setTabRestoreService:nullptr];
}
#pragma mark - WebStateListObserving
- (void)webStateListWillBeginBatchOperation:(WebStateList*)webStateList {
self.processingBatchOperation = YES;
}
- (void)webStateListBatchOperationEnded:(WebStateList*)webStateList {
self.processingBatchOperation = NO;
// A WebStateList batch operation can result in batch changes to the
// TabRestoreService (e.g., closing or restoring all tabs). Individual
// TabRestoreService updates are ignored between
// |-webStateListWillBeginBatchOperation:| and
// |-webStateListBatchOperationEnded:|. The consumer is updated once after the
// batch operation is complete.
[self.consumer refreshRecentlyClosedTabs];
}
#pragma mark - TableViewFaviconDataSource
- (void)faviconForURL:(const GURL&)URL
......@@ -126,6 +173,18 @@ const CGFloat kFaviconMinWidthHeight = 16;
});
}
#pragma mark - Setters/Getters
- (void)setWebStateList:(WebStateList*)webStateList {
if (_webStateList)
_webStateList->RemoveObserver(_webStateListObserver.get());
_webStateList = webStateList;
if (_webStateList)
_webStateList->AddObserver(_webStateListObserver.get());
}
#pragma mark - Private
- (BOOL)isSignedIn {
......
......@@ -177,6 +177,7 @@
self.remoteTabsMediator = [[RecentTabsMediator alloc] init];
self.remoteTabsMediator.browserState = _regularTabModel.browserState;
self.remoteTabsMediator.consumer = baseViewController.remoteTabsConsumer;
self.remoteTabsMediator.webStateList = self.regularTabModel.webStateList;
// TODO(crbug.com/845636) : Currently, the image data source must be set
// before the mediator starts updating its consumer. Fix this so that order of
// calls does not matter.
......
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