Commit d5a28e18 authored by Rohit Rao's avatar Rohit Rao Committed by Commit Bot

[ios] Fixes an infinite sync loop in RecentTabsMediator.

|reloadSessions| previously had code to trigger another sync refresh.
The old sync sessions implementation would detect that nothing had
changed and break the update cycle, but a new implementation notifies
observers unconditionally.  This was leading to an infinite loop of sync
updates.

BUG=854049

Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I85dbf2810f5ff6e009812a33ad643fb54cfdc8c4
Reviewed-on: https://chromium-review.googlesource.com/1106001Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarMikel Astiz <mastiz@chromium.org>
Commit-Queue: Rohit Rao <rohitrao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#568476}
parent fc71474c
......@@ -53,7 +53,7 @@
- (void)start {
_tableViewController.handsetCommandHandler = self.handsetCommandHandler;
[self.mediator initObservers];
[self.mediator reloadSessions];
[self.mediator configureConsumer];
}
- (void)stop {
......
......@@ -65,7 +65,7 @@
self.mediator = [[RecentTabsMediator alloc] init];
self.mediator.browserState = self.browserState;
// Set the consumer first before calling [self.mediator initObservers] and
// then [self.mediator reloadSessions].
// then [self.mediator configureConsumer].
self.mediator.consumer = recentTabsTableViewController;
// 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
......@@ -73,7 +73,7 @@
recentTabsTableViewController.imageDataSource = self.mediator;
recentTabsTableViewController.delegate = self.mediator;
[self.mediator initObservers];
[self.mediator reloadSessions];
[self.mediator configureConsumer];
// Present RecentTabsNavigationController.
self.recentTabsNavigationController = [[TableViewNavigationController alloc]
......
......@@ -26,9 +26,15 @@ class ChromeBrowserState;
// accordingly.
@interface RecentTabsMediator
: NSObject<ClosedTabsObserving,
RecentTabsImageDataSource,
SyncedSessionsObserver,
LegacyRecentTabsTableViewControllerDelegate>
LegacyRecentTabsTableViewControllerDelegate,
RecentTabsImageDataSource>
// The consumer for this object. This can change during the lifetime of this
// object and may be nil.
@property(nonatomic, strong) id<RecentTabsTableConsumer> consumer;
// The coordinator's BrowserState.
@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
// Starts observing the he user's signed-in and chrome-sync states.
- (void)initObservers;
......@@ -36,12 +42,10 @@ class ChromeBrowserState;
// Disconnects the mediator from all observers.
- (void)disconnect;
// The consumer for this object. This can change during the lifetime of this
// object and may be nil.
@property(nonatomic, strong) id<RecentTabsTableConsumer> consumer;
// Configures the consumer with current data. Intended to be called immediately
// after initialization.
- (void)configureConsumer;
// The coordinator's BrowserState.
@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
@end
#endif // IOS_CHROME_BROWSER_UI_RECENT_TABS_RECENT_TABS_MEDIATOR_H_
......@@ -30,7 +30,7 @@ const CGFloat kFaviconWidthHeight = 24;
const CGFloat kFaviconMinWidthHeight = 16;
} // namespace
@interface RecentTabsMediator () {
@interface RecentTabsMediator ()<SyncedSessionsObserver> {
std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge>
_syncedSessionsObserver;
std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver;
......@@ -47,8 +47,6 @@ const CGFloat kFaviconMinWidthHeight = 16;
- (BOOL)isSyncCompleted;
// Reload the panel.
- (void)refreshSessionsView;
// Force a contact to the sync server to reload remote sessions.
- (void)reloadSessionsData;
@end
......@@ -88,10 +86,13 @@ const CGFloat kFaviconMinWidthHeight = 16;
}
}
- (void)configureConsumer {
[self refreshSessionsView];
}
#pragma mark - SyncedSessionsObserver
- (void)reloadSessions {
[self reloadSessionsData];
[self refreshSessionsView];
}
......@@ -168,13 +169,6 @@ const CGFloat kFaviconMinWidthHeight = 16;
return _syncedSessionsObserver->IsFirstSyncCycleCompleted();
}
- (void)reloadSessionsData {
const syncer::ModelTypeSet types(syncer::SESSIONS);
// Requests a sync refresh of the sessions for the current profile.
ProfileSyncServiceFactory::GetForBrowserState(_browserState)
->TriggerRefresh(types);
}
#pragma mark - RecentTabsTableViewControllerDelegate
- (void)refreshSessionsView {
......
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