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..1928daf828c859bba96bfcf3b52d90e300e78ff5 100644 |
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc |
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc |
@@ -179,15 +179,18 @@ 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), |
+ open_tabs_delegate_(nullptr), |
last_local_model_index_(kHistorySeparatorIndex), |
default_favicon_( |
ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
IDR_DEFAULT_FAVICON)), |
+#if !defined(OS_MACOSX) |
+ tab_restore_service_observer_(this), |
+ sync_observer_(this), |
+#endif // !defined(OS_MACOSX) |
weak_ptr_factory_(this) { |
// Invoke asynchronous call to load tabs from local last session, which does |
// nothing if the tabs have already been loaded or they shouldn't be loaded. |
@@ -197,13 +200,21 @@ RecentTabsSubMenuModel::RecentTabsSubMenuModel( |
if (service) { |
service->LoadTabsFromLastSession(); |
- // TODO(sail): enable this when mac implements the dynamic menu, together with |
- // MenuModelDelegate::MenuStructureChanged(). |
+// Mac doesn't support the dynamic menu. |
#if !defined(OS_MACOSX) |
- service->AddObserver(this); |
+ tab_restore_service_observer_.Add(service); |
#endif |
} |
+// Mac doesn't support the dynamic menu. |
+#if !defined(OS_MACOSX) |
+ browser_sync::ProfileSyncService* sync_service = |
+ ProfileSyncServiceFactory::GetInstance()->GetForProfile( |
+ browser_->profile()); |
+ if (sync_service && sync_service->IsSyncActive()) |
pavely
2017/03/24 01:20:05
Is this line executed once per process or every ti
Peter Kasting
2017/03/24 01:35:21
Looks like it's called each time the menu is opene
pavely
2017/03/24 04:13:22
Yeah, we should remove call to IsSyncActive(). If
|
+ sync_observer_.Add(sync_service); |
+#endif // !defined(OS_MACOSX) |
+ |
Build(); |
// Retrieve accelerator key for IDC_RESTORE_TAB now, because on ASH, it's not |
@@ -231,12 +242,7 @@ RecentTabsSubMenuModel::RecentTabsSubMenuModel( |
} |
} |
-RecentTabsSubMenuModel::~RecentTabsSubMenuModel() { |
- sessions::TabRestoreService* service = |
- TabRestoreServiceFactory::GetForProfile(browser_->profile()); |
- if (service) |
- service->RemoveObserver(this); |
-} |
+RecentTabsSubMenuModel::~RecentTabsSubMenuModel() {} |
bool RecentTabsSubMenuModel::IsCommandIdChecked(int command_id) const { |
return false; |
@@ -474,8 +480,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 +713,17 @@ 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); |
+ |
+ other_devices_tab_cancelable_task_tracker_.TryCancelAll(); |
+ |
+ other_devices_tab_navigation_items_.clear(); |
+} |
+ |
sync_sessions::OpenTabsUIDelegate* |
RecentTabsSubMenuModel::GetOpenTabsUIDelegate() { |
if (!open_tabs_delegate_) { |
@@ -736,3 +752,16 @@ void RecentTabsSubMenuModel::TabRestoreServiceDestroyed( |
sessions::TabRestoreService* service) { |
TabRestoreServiceChanged(service); |
} |
+ |
+void RecentTabsSubMenuModel::OnSyncCycleCompleted(syncer::SyncService* sync) {} |
+ |
+void RecentTabsSubMenuModel::OnForeignSessionUpdated( |
+ syncer::SyncService* sync) { |
+ ClearTabsFromOtherDevices(); |
+ |
+ BuildTabsFromOtherDevices(); |
+ |
+ ui::MenuModelDelegate* menu_model_delegate = GetMenuModelDelegate(); |
+ if (menu_model_delegate) |
+ menu_model_delegate->OnMenuStructureChanged(); |
+} |