Chromium Code Reviews| Index: chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc |
| diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc |
| index 1cd8dbb53938649b46e6fe1d8814cff42fc41596..507f56855f2cf807c33a56c3e92d1f0cda42bf52 100644 |
| --- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc |
| +++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc |
| @@ -179,11 +179,9 @@ const int RecentTabsSubMenuModel::kDisabledRecentlyClosedHeaderCommandId = 1121; |
| RecentTabsSubMenuModel::RecentTabsSubMenuModel( |
| ui::AcceleratorProvider* accelerator_provider, |
| - Browser* browser, |
| - sync_sessions::OpenTabsUIDelegate* open_tabs_delegate) |
| + Browser* browser) |
| : ui::SimpleMenuModel(this), |
| browser_(browser), |
| - open_tabs_delegate_(open_tabs_delegate), |
| last_local_model_index_(kHistorySeparatorIndex), |
| default_favicon_( |
| ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
| @@ -204,6 +202,15 @@ RecentTabsSubMenuModel::RecentTabsSubMenuModel( |
| #endif |
| } |
| +#if !defined(OS_MACOSX) |
|
Peter Kasting
2017/03/23 04:48:34
Nit: Add note about why this isn't on for Mac
|
| + browser_sync::ProfileSyncService* sync_service = |
| + ProfileSyncServiceFactory::GetInstance()->GetForProfile( |
| + browser_->profile()); |
| + if (sync_service && sync_service->IsSyncActive()) { |
|
Peter Kasting
2017/03/23 04:48:34
Nit: No {}
|
| + sync_service->AddObserver(this); |
| + } |
| +#endif |
| + |
| Build(); |
| // Retrieve accelerator key for IDC_RESTORE_TAB now, because on ASH, it's not |
| @@ -236,6 +243,15 @@ RecentTabsSubMenuModel::~RecentTabsSubMenuModel() { |
| TabRestoreServiceFactory::GetForProfile(browser_->profile()); |
| if (service) |
| service->RemoveObserver(this); |
| + |
| +#if !defined(OS_MACOSX) |
| + browser_sync::ProfileSyncService* sync_service = |
| + ProfileSyncServiceFactory::GetInstance()->GetForProfile( |
| + browser_->profile()); |
| + if (sync_service) { |
| + sync_service->RemoveObserver(this); |
|
Peter Kasting
2017/03/23 04:48:34
Can this be done with a ScopedObserver class membe
|
| + } |
| +#endif |
| } |
| bool RecentTabsSubMenuModel::IsCommandIdChecked(int command_id) const { |
| @@ -474,8 +490,7 @@ void RecentTabsSubMenuModel::BuildLocalEntries() { |
| void RecentTabsSubMenuModel::BuildTabsFromOtherDevices() { |
| // All other devices' items (device headers or tabs) use AddItem*() to append |
| - // a menu item, because they are always only built once (i.e. invoked from |
| - // Constructor()) and don't change after that. |
| + // a menu item, because they take always place in the end of menu. |
| sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(); |
| std::vector<const sync_sessions::SyncedSession*> sessions; |
| @@ -708,6 +723,20 @@ void RecentTabsSubMenuModel::ClearLocalEntries() { |
| local_window_items_.clear(); |
| } |
| +void RecentTabsSubMenuModel::ClearTabsFromOtherDevices() { |
| + DCHECK_GE(last_local_model_index_, 0); |
| + int count = GetItemCount(); |
| + for (int index = count - 1; index > last_local_model_index_; --index) |
| + RemoveItemAt(index); |
| + |
| + // Cancel asynchronous FaviconService::GetFaviconImageForPageURL() tasks of |
|
Peter Kasting
2017/03/23 04:48:34
Nit: These comments (here and below) add nothing t
|
| + // all tabs from the other devices. |
| + other_devices_tab_cancelable_task_tracker_.TryCancelAll(); |
| + |
| + // Remove all tab from the other devices navigation items. |
| + other_devices_tab_navigation_items_.clear(); |
| +} |
| + |
| sync_sessions::OpenTabsUIDelegate* |
| RecentTabsSubMenuModel::GetOpenTabsUIDelegate() { |
| if (!open_tabs_delegate_) { |
| @@ -736,3 +765,14 @@ void RecentTabsSubMenuModel::TabRestoreServiceDestroyed( |
| sessions::TabRestoreService* service) { |
| TabRestoreServiceChanged(service); |
| } |
| + |
| +void RecentTabsSubMenuModel::OnForeignSessionUpdated( |
| + syncer::SyncService* sync) { |
| + ClearTabsFromOtherDevices(); |
| + |
| + BuildTabsFromOtherDevices(); |
| + |
| + ui::MenuModelDelegate* menu_model_delegate = GetMenuModelDelegate(); |
| + if (menu_model_delegate) |
| + menu_model_delegate->OnMenuStructureChanged(); |
| +} |