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(); |
+} |