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

Side by Side Diff: chrome/browser/ui/cocoa/history_menu_bridge.mm

Issue 573553004: Eliminate NOTIFICATION_HISTORY_LOADED notification (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move HistoryServiceObserver functions to private Created 6 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/cocoa/history_menu_bridge.h" 5 #include "chrome/browser/ui/cocoa/history_menu_bridge.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/sys_string_conversions.h" 10 #include "base/strings/sys_string_conversions.h"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 58
59 HistoryMenuBridge::HistoryItem::~HistoryItem() { 59 HistoryMenuBridge::HistoryItem::~HistoryItem() {
60 } 60 }
61 61
62 HistoryMenuBridge::HistoryMenuBridge(Profile* profile) 62 HistoryMenuBridge::HistoryMenuBridge(Profile* profile)
63 : controller_([[HistoryMenuCocoaController alloc] initWithBridge:this]), 63 : controller_([[HistoryMenuCocoaController alloc] initWithBridge:this]),
64 profile_(profile), 64 profile_(profile),
65 history_service_(NULL), 65 history_service_(NULL),
66 tab_restore_service_(NULL), 66 tab_restore_service_(NULL),
67 create_in_progress_(false), 67 create_in_progress_(false),
68 need_recreate_(false) { 68 need_recreate_(false),
69 history_service_observer_(this) {
69 // If we don't have a profile, do not bother initializing our data sources. 70 // If we don't have a profile, do not bother initializing our data sources.
70 // This shouldn't happen except in unit tests. 71 // This shouldn't happen except in unit tests.
71 if (profile_) { 72 if (profile_) {
72 // Check to see if the history service is ready. Because it loads async, it 73 // Check to see if the history service is ready. Because it loads async, it
73 // may not be ready when the Bridge is created. If this happens, register 74 // may not be ready when the Bridge is created. If this happens, register
74 // for a notification that tells us the HistoryService is ready. 75 // for a notification that tells us the HistoryService is ready.
75 HistoryService* hs = HistoryServiceFactory::GetForProfile( 76 HistoryService* hs = HistoryServiceFactory::GetForProfile(
76 profile_, Profile::EXPLICIT_ACCESS); 77 profile_, Profile::EXPLICIT_ACCESS);
77 if (hs != NULL && hs->BackendLoaded()) { 78 if (hs && hs->BackendLoaded()) {
Peter Kasting 2014/11/17 18:45:31 Nit: Longer, but seems a little clearer to me:
nshaik 2014/11/17 23:24:29 Done.
78 history_service_ = hs; 79 history_service_ = hs;
79 Init(); 80 Init();
81 } else if (hs) {
82 history_service_observer_.Add(hs);
80 } 83 }
81 84
82 tab_restore_service_ = TabRestoreServiceFactory::GetForProfile(profile_); 85 tab_restore_service_ = TabRestoreServiceFactory::GetForProfile(profile_);
83 if (tab_restore_service_) { 86 if (tab_restore_service_) {
84 tab_restore_service_->AddObserver(this); 87 tab_restore_service_->AddObserver(this);
85 // If the tab entries are already loaded, invoke the observer method to 88 // If the tab entries are already loaded, invoke the observer method to
86 // build the "Recently Closed" section. Otherwise it will be when the 89 // build the "Recently Closed" section. Otherwise it will be when the
87 // backend loads. 90 // backend loads.
88 if (!tab_restore_service_->IsLoaded()) 91 if (!tab_restore_service_->IsLoaded())
89 tab_restore_service_->LoadTabsFromLastSession(); 92 tab_restore_service_->LoadTabsFromLastSession();
90 else 93 else
91 TabRestoreServiceChanged(tab_restore_service_); 94 TabRestoreServiceChanged(tab_restore_service_);
92 } 95 }
93 } 96 }
94 97
95 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 98 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
96 default_favicon_.reset( 99 default_favicon_.reset(
97 rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage()); 100 rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage());
98 101
99 // Set the static icons in the menu. 102 // Set the static icons in the menu.
100 NSMenuItem* item = [HistoryMenu() itemWithTag:IDC_SHOW_HISTORY]; 103 NSMenuItem* item = [HistoryMenu() itemWithTag:IDC_SHOW_HISTORY];
101 [item setImage:rb.GetNativeImageNamed(IDR_HISTORY_FAVICON).ToNSImage()]; 104 [item setImage:rb.GetNativeImageNamed(IDR_HISTORY_FAVICON).ToNSImage()];
102 105
103 // The service is not ready for use yet, so become notified when it does.
104 if (!history_service_) {
105 registrar_.Add(
106 this, chrome::NOTIFICATION_HISTORY_LOADED,
107 content::Source<Profile>(profile_));
108 }
109 } 106 }
110 107
111 // Note that all requests sent to either the history service or the favicon 108 // Note that all requests sent to either the history service or the favicon
112 // service will be automatically cancelled by their respective Consumers, so 109 // service will be automatically cancelled by their respective Consumers, so
113 // task cancellation is not done manually here in the dtor. 110 // task cancellation is not done manually here in the dtor.
114 HistoryMenuBridge::~HistoryMenuBridge() { 111 HistoryMenuBridge::~HistoryMenuBridge() {
115 // Unregister ourselves as observers and notifications. 112 // Unregister ourselves as observers and notifications.
116 DCHECK(profile_); 113 DCHECK(profile_);
117 if (history_service_) { 114 if (history_service_) {
118 registrar_.Remove(this, chrome::NOTIFICATION_HISTORY_URLS_DELETED, 115 registrar_.Remove(this, chrome::NOTIFICATION_HISTORY_URLS_DELETED,
119 content::Source<Profile>(profile_)); 116 content::Source<Profile>(profile_));
120 history_service_->RemoveObserver(this);
121 } else {
122 registrar_.Remove(this, chrome::NOTIFICATION_HISTORY_LOADED,
123 content::Source<Profile>(profile_));
124 } 117 }
125 118
126 if (tab_restore_service_) 119 if (tab_restore_service_)
127 tab_restore_service_->RemoveObserver(this); 120 tab_restore_service_->RemoveObserver(this);
128 121
129 // Since the map owns the HistoryItems, delete anything that still exists. 122 // Since the map owns the HistoryItems, delete anything that still exists.
130 std::map<NSMenuItem*, HistoryItem*>::iterator it = menu_item_map_.begin(); 123 std::map<NSMenuItem*, HistoryItem*>::iterator it = menu_item_map_.begin();
131 while (it != menu_item_map_.end()) { 124 while (it != menu_item_map_.end()) {
132 HistoryItem* item = it->second; 125 HistoryItem* item = it->second;
133 menu_item_map_.erase(it++); 126 menu_item_map_.erase(it++);
134 delete item; 127 delete item;
135 } 128 }
136 } 129 }
137 130
138 void HistoryMenuBridge::Observe(int type, 131 void HistoryMenuBridge::Observe(int type,
139 const content::NotificationSource& source, 132 const content::NotificationSource& source,
140 const content::NotificationDetails& details) { 133 const content::NotificationDetails& details) {
141 // A history service is now ready. Check to see if it's the one for the main
142 // profile. If so, perform final initialization.
143 if (type == chrome::NOTIFICATION_HISTORY_LOADED) {
144 HistoryService* hs = HistoryServiceFactory::GetForProfile(
145 profile_, Profile::EXPLICIT_ACCESS);
146 if (hs != NULL && hs->BackendLoaded()) {
147 history_service_ = hs;
148 Init();
149
150 // Found our HistoryService, so stop listening for this notification.
151 registrar_.Remove(this,
152 chrome::NOTIFICATION_HISTORY_LOADED,
153 content::Source<Profile>(profile_));
154 }
155 }
156
157 // All other notification types that we observe indicate that the history has 134 // All other notification types that we observe indicate that the history has
158 // changed. 135 // changed.
Peter Kasting 2014/11/17 18:45:32 Nit: Please update the comment ("other" is now con
nshaik 2014/11/17 23:24:29 Done.
159 OnHistoryChanged(); 136 OnHistoryChanged();
160 } 137 }
161 138
162 void HistoryMenuBridge::TabRestoreServiceChanged(TabRestoreService* service) { 139 void HistoryMenuBridge::TabRestoreServiceChanged(TabRestoreService* service) {
163 const TabRestoreService::Entries& entries = service->entries(); 140 const TabRestoreService::Entries& entries = service->entries();
164 141
165 // Clear the history menu before rebuilding. 142 // Clear the history menu before rebuilding.
166 NSMenu* menu = HistoryMenu(); 143 NSMenu* menu = HistoryMenu();
167 ClearMenuSection(menu, kRecentlyClosed); 144 ClearMenuSection(menu, kRecentlyClosed);
168 145
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 const history::RedirectList& redirects, 253 const history::RedirectList& redirects,
277 base::Time visit_time) { 254 base::Time visit_time) {
278 OnHistoryChanged(); 255 OnHistoryChanged();
279 } 256 }
280 257
281 void HistoryMenuBridge::OnURLsModified(HistoryService* history_service, 258 void HistoryMenuBridge::OnURLsModified(HistoryService* history_service,
282 const history::URLRows& changed_urls) { 259 const history::URLRows& changed_urls) {
283 OnHistoryChanged(); 260 OnHistoryChanged();
284 } 261 }
285 262
263 void HistoryMenuBridge::OnHistoryServiceLoaded(
264 HistoryService* history_service) {
265 DCHECK(history_service);
266 DCHECK(history_service->BackendLoaded());
Peter Kasting 2014/11/17 18:45:31 Nit: I dunno how valuable these DCHECKs are (doesn
nshaik 2014/11/17 23:24:29 Done.
267 history_service_ = history_service;
268 Init();
269 }
270
286 HistoryMenuBridge::HistoryItem* HistoryMenuBridge::HistoryItemForMenuItem( 271 HistoryMenuBridge::HistoryItem* HistoryMenuBridge::HistoryItemForMenuItem(
287 NSMenuItem* item) { 272 NSMenuItem* item) {
288 std::map<NSMenuItem*, HistoryItem*>::iterator it = menu_item_map_.find(item); 273 std::map<NSMenuItem*, HistoryItem*>::iterator it = menu_item_map_.find(item);
289 if (it != menu_item_map_.end()) { 274 if (it != menu_item_map_.end()) {
290 return it->second; 275 return it->second;
291 } 276 }
292 return NULL; 277 return NULL;
293 } 278 }
294 279
295 HistoryService* HistoryMenuBridge::service() { 280 HistoryService* HistoryMenuBridge::service() {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 } 463 }
479 464
480 void HistoryMenuBridge::CancelFaviconRequest(HistoryItem* item) { 465 void HistoryMenuBridge::CancelFaviconRequest(HistoryItem* item) {
481 DCHECK(item); 466 DCHECK(item);
482 if (item->icon_requested) { 467 if (item->icon_requested) {
483 cancelable_task_tracker_.TryCancel(item->icon_task_id); 468 cancelable_task_tracker_.TryCancel(item->icon_task_id);
484 item->icon_requested = false; 469 item->icon_requested = false;
485 item->icon_task_id = base::CancelableTaskTracker::kBadTaskId; 470 item->icon_task_id = base::CancelableTaskTracker::kBadTaskId;
486 } 471 }
487 } 472 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698