Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Unified Diff: chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc

Issue 2768633003: Dynamic updating recent menu for tabs from other devices. (Closed)
Patch Set: Fixes compilation and test on Mac. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 ca0948d47734a9412a59d0b20a80a059e2544530..7b94070cc2cc8c2a75e10399247960b93266919a 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_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,19 @@ void RecentTabsSubMenuModel::TabRestoreServiceDestroyed(
sessions::TabRestoreService* service) {
TabRestoreServiceChanged(service);
}
+
+void RecentTabsSubMenuModel::OnSyncConfigurationCompleted(
+ syncer::SyncService* sync) {
+ OnForeignSessionUpdated(sync);
+}
+
+void RecentTabsSubMenuModel::OnForeignSessionUpdated(
+ syncer::SyncService* sync) {
+ ClearTabsFromOtherDevices();
+
+ BuildTabsFromOtherDevices();
+
+ ui::MenuModelDelegate* menu_model_delegate = GetMenuModelDelegate();
+ if (menu_model_delegate)
+ menu_model_delegate->OnMenuStructureChanged();
+}

Powered by Google App Engine
This is Rietveld 408576698