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 @@ ...@@ -53,7 +53,7 @@
- (void)start { - (void)start {
_tableViewController.handsetCommandHandler = self.handsetCommandHandler; _tableViewController.handsetCommandHandler = self.handsetCommandHandler;
[self.mediator initObservers]; [self.mediator initObservers];
[self.mediator reloadSessions]; [self.mediator configureConsumer];
} }
- (void)stop { - (void)stop {
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
self.mediator = [[RecentTabsMediator alloc] init]; self.mediator = [[RecentTabsMediator alloc] init];
self.mediator.browserState = self.browserState; self.mediator.browserState = self.browserState;
// Set the consumer first before calling [self.mediator initObservers] and // Set the consumer first before calling [self.mediator initObservers] and
// then [self.mediator reloadSessions]. // then [self.mediator configureConsumer].
self.mediator.consumer = recentTabsTableViewController; self.mediator.consumer = recentTabsTableViewController;
// TODO(crbug.com/845636) : Currently, the image data source must be set // 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 // before the mediator starts updating its consumer. Fix this so that order of
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
recentTabsTableViewController.imageDataSource = self.mediator; recentTabsTableViewController.imageDataSource = self.mediator;
recentTabsTableViewController.delegate = self.mediator; recentTabsTableViewController.delegate = self.mediator;
[self.mediator initObservers]; [self.mediator initObservers];
[self.mediator reloadSessions]; [self.mediator configureConsumer];
// Present RecentTabsNavigationController. // Present RecentTabsNavigationController.
self.recentTabsNavigationController = [[TableViewNavigationController alloc] self.recentTabsNavigationController = [[TableViewNavigationController alloc]
......
...@@ -26,9 +26,15 @@ class ChromeBrowserState; ...@@ -26,9 +26,15 @@ class ChromeBrowserState;
// accordingly. // accordingly.
@interface RecentTabsMediator @interface RecentTabsMediator
: NSObject<ClosedTabsObserving, : NSObject<ClosedTabsObserving,
RecentTabsImageDataSource, LegacyRecentTabsTableViewControllerDelegate,
SyncedSessionsObserver, RecentTabsImageDataSource>
LegacyRecentTabsTableViewControllerDelegate>
// 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. // Starts observing the he user's signed-in and chrome-sync states.
- (void)initObservers; - (void)initObservers;
...@@ -36,12 +42,10 @@ class ChromeBrowserState; ...@@ -36,12 +42,10 @@ class ChromeBrowserState;
// Disconnects the mediator from all observers. // Disconnects the mediator from all observers.
- (void)disconnect; - (void)disconnect;
// The consumer for this object. This can change during the lifetime of this // Configures the consumer with current data. Intended to be called immediately
// object and may be nil. // after initialization.
@property(nonatomic, strong) id<RecentTabsTableConsumer> consumer; - (void)configureConsumer;
// The coordinator's BrowserState.
@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
@end @end
#endif // IOS_CHROME_BROWSER_UI_RECENT_TABS_RECENT_TABS_MEDIATOR_H_ #endif // IOS_CHROME_BROWSER_UI_RECENT_TABS_RECENT_TABS_MEDIATOR_H_
...@@ -30,7 +30,7 @@ const CGFloat kFaviconWidthHeight = 24; ...@@ -30,7 +30,7 @@ const CGFloat kFaviconWidthHeight = 24;
const CGFloat kFaviconMinWidthHeight = 16; const CGFloat kFaviconMinWidthHeight = 16;
} // namespace } // namespace
@interface RecentTabsMediator () { @interface RecentTabsMediator ()<SyncedSessionsObserver> {
std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge> std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge>
_syncedSessionsObserver; _syncedSessionsObserver;
std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver; std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver;
...@@ -47,8 +47,6 @@ const CGFloat kFaviconMinWidthHeight = 16; ...@@ -47,8 +47,6 @@ const CGFloat kFaviconMinWidthHeight = 16;
- (BOOL)isSyncCompleted; - (BOOL)isSyncCompleted;
// Reload the panel. // Reload the panel.
- (void)refreshSessionsView; - (void)refreshSessionsView;
// Force a contact to the sync server to reload remote sessions.
- (void)reloadSessionsData;
@end @end
...@@ -88,10 +86,13 @@ const CGFloat kFaviconMinWidthHeight = 16; ...@@ -88,10 +86,13 @@ const CGFloat kFaviconMinWidthHeight = 16;
} }
} }
- (void)configureConsumer {
[self refreshSessionsView];
}
#pragma mark - SyncedSessionsObserver #pragma mark - SyncedSessionsObserver
- (void)reloadSessions { - (void)reloadSessions {
[self reloadSessionsData];
[self refreshSessionsView]; [self refreshSessionsView];
} }
...@@ -168,13 +169,6 @@ const CGFloat kFaviconMinWidthHeight = 16; ...@@ -168,13 +169,6 @@ const CGFloat kFaviconMinWidthHeight = 16;
return _syncedSessionsObserver->IsFirstSyncCycleCompleted(); 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 #pragma mark - RecentTabsTableViewControllerDelegate
- (void)refreshSessionsView { - (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