Chromium Code Reviews| Index: chrome/browser/google/google_url_tracker.cc |
| diff --git a/chrome/browser/google/google_url_tracker.cc b/chrome/browser/google/google_url_tracker.cc |
| index aa368692dcc4d086f4f2e99088e94660685b7a87..a5fc58a9eeec49a50d7de867a2faa23866b77606 100644 |
| --- a/chrome/browser/google/google_url_tracker.cc |
| +++ b/chrome/browser/google/google_url_tracker.cc |
| @@ -33,18 +33,15 @@ const char GoogleURLTracker::kDefaultGoogleHomepage[] = |
| const char GoogleURLTracker::kSearchDomainCheckURL[] = |
| "https://www.google.com/searchdomaincheck?format=url&type=chrome"; |
| -GoogleURLTracker::GoogleURLTracker( |
| - Profile* profile, |
| - scoped_ptr<GoogleURLTrackerClient> client, |
| - scoped_ptr<GoogleURLTrackerNavigationHelper> nav_helper, |
| - Mode mode) |
| +GoogleURLTracker::GoogleURLTracker(Profile* profile, |
| + scoped_ptr<GoogleURLTrackerClient> client, |
| + Mode mode) |
| : profile_(profile), |
| client_(client.Pass()), |
| - nav_helper_(nav_helper.Pass()), |
| infobar_creator_(base::Bind(&GoogleURLTrackerInfoBarDelegate::Create)), |
| - google_url_(mode == UNIT_TEST_MODE ? kDefaultGoogleHomepage |
| - : profile->GetPrefs()->GetString( |
| - prefs::kLastKnownGoogleURL)), |
| + google_url_(mode == UNIT_TEST_MODE ? |
| + kDefaultGoogleHomepage : |
| + profile->GetPrefs()->GetString(prefs::kLastKnownGoogleURL)), |
| fetcher_id_(0), |
| in_startup_sleep_(true), |
| already_fetched_(false), |
| @@ -54,7 +51,6 @@ GoogleURLTracker::GoogleURLTracker( |
| weak_ptr_factory_(this) { |
| net::NetworkChangeNotifier::AddIPAddressObserver(this); |
| client_->set_google_url_tracker(this); |
| - nav_helper_->SetGoogleURLTracker(this); |
| // Because this function can be called during startup, when kicking off a URL |
| // fetch can eat up 20 ms of time, we delay five seconds, which is hopefully |
| @@ -207,7 +203,6 @@ void GoogleURLTracker::OnIPAddressChanged() { |
| void GoogleURLTracker::Shutdown() { |
| client_.reset(); |
| - nav_helper_.reset(); |
| fetcher_.reset(); |
| weak_ptr_factory_.InvalidateWeakPtrs(); |
| net::NetworkChangeNotifier::RemoveIPAddressObserver(this); |
| @@ -221,7 +216,7 @@ void GoogleURLTracker::DeleteMapEntryForService( |
| DCHECK(i != entry_map_.end()); |
| GoogleURLTrackerMapEntry* map_entry = i->second; |
| - UnregisterForEntrySpecificNotifications(*map_entry, false); |
| + UnregisterForEntrySpecificNotifications(map_entry, false); |
| entry_map_.erase(i); |
| delete map_entry; |
| } |
| @@ -283,39 +278,42 @@ void GoogleURLTracker::SearchCommitted() { |
| } |
| void GoogleURLTracker::OnNavigationPending( |
| - content::NavigationController* navigation_controller, |
| + scoped_ptr<GoogleURLTrackerNavigationHelper> nav_helper, |
| InfoBarService* infobar_service, |
| int pending_id) { |
| + GoogleURLTrackerMapEntry* map_entry = NULL; |
| + |
| EntryMap::iterator i(entry_map_.find(infobar_service)); |
| + if (i != entry_map_.end()) |
| + map_entry = i->second; |
| if (search_committed_) { |
| search_committed_ = false; |
| - // Whether there's an existing infobar or not, we need to listen for the |
| - // load to commit, so we can show and/or update the infobar when it does. |
| - // (We may already be registered for this if there is an existing infobar |
| - // that had a previous pending search that hasn't yet committed.) |
| - if (!nav_helper_->IsListeningForNavigationCommit(navigation_controller)) { |
| - nav_helper_->SetListeningForNavigationCommit(navigation_controller, |
| - true); |
| - } |
| - if (i == entry_map_.end()) { |
| + if (!map_entry) { |
| // This is a search on a tab that doesn't have one of our infobars, so |
| // prepare to add one. Note that we only listen for the tab's destruction |
| // on this path; if there was already a map entry, then either it doesn't |
| // yet have an infobar and we're already registered for this, or it has an |
| // infobar and the infobar's owner will handle tearing it down when the |
| // tab is destroyed. |
| - nav_helper_->SetListeningForTabDestruction(navigation_controller, true); |
| - entry_map_.insert(std::make_pair( |
| - infobar_service, |
| - new GoogleURLTrackerMapEntry(this, infobar_service, |
| - navigation_controller))); |
| - } else if (i->second->has_infobar_delegate()) { |
| + map_entry = new GoogleURLTrackerMapEntry( |
| + this, infobar_service, nav_helper.Pass()); |
| + map_entry->navigation_helper()->SetListeningForTabDestruction(true); |
| + entry_map_.insert(std::make_pair(infobar_service, map_entry)); |
| + } else if (map_entry->infobar_delegate()) { |
| // This is a new search on a tab where we already have an infobar. |
| - i->second->infobar_delegate()->set_pending_id(pending_id); |
| + map_entry->infobar_delegate()->set_pending_id(pending_id); |
| } |
| - } else if (i != entry_map_.end()){ |
| - if (i->second->has_infobar_delegate()) { |
| + |
| + // Whether there's an existing infobar or not, we need to listen for the |
| + // load to commit, so we can show and/or update the infobar when it does. |
| + // (We may already be registered for this if there is an existing infobar |
| + // that had a previous pending search that hasn't yet committed.) |
| + if (!map_entry->navigation_helper()->IsListeningForNavigationCommit()) { |
|
Peter Kasting
2014/05/16 23:38:13
Nit: No {}
blundell
2014/05/17 19:23:54
Done.
|
| + map_entry->navigation_helper()->SetListeningForNavigationCommit(true); |
| + } |
| + } else if (map_entry) { |
| + if (map_entry->has_infobar_delegate()) { |
| // This is a non-search navigation on a tab with an infobar. If there was |
| // a previous pending search on this tab, this means it won't commit, so |
| // undo anything we did in response to seeing that. Note that if there |
| @@ -325,13 +323,13 @@ void GoogleURLTracker::OnNavigationPending( |
| // If this navigation actually commits, that will trigger the infobar's |
| // owner to expire the infobar if need be. If it doesn't commit, then |
| // simply leaving the infobar as-is will have been the right thing. |
| - UnregisterForEntrySpecificNotifications(*i->second, false); |
| - i->second->infobar_delegate()->set_pending_id(0); |
| + UnregisterForEntrySpecificNotifications(map_entry, false); |
| + map_entry->infobar_delegate()->set_pending_id(0); |
| } else { |
| // Non-search navigation on a tab with an entry that has not yet created |
| // an infobar. This means the original search won't commit, so delete the |
| // entry. |
| - i->second->Close(false); |
| + map_entry->Close(false); |
| } |
| } else { |
| // Non-search navigation on a tab without an infobars. This is irrelevant |
| @@ -346,7 +344,7 @@ void GoogleURLTracker::OnNavigationCommitted(InfoBarService* infobar_service, |
| GoogleURLTrackerMapEntry* map_entry = i->second; |
| DCHECK(search_url.is_valid()); |
| - UnregisterForEntrySpecificNotifications(*map_entry, true); |
| + UnregisterForEntrySpecificNotifications(map_entry, true); |
| if (map_entry->has_infobar_delegate()) { |
| map_entry->infobar_delegate()->Update(search_url); |
| } else { |
| @@ -362,7 +360,7 @@ void GoogleURLTracker::OnNavigationCommitted(InfoBarService* infobar_service, |
| } |
| void GoogleURLTracker::OnTabClosed( |
| - content::NavigationController* navigation_controller) { |
| + GoogleURLTrackerNavigationHelper* nav_helper) { |
| // Because InfoBarService tears itself down on tab destruction, it's possible |
| // to get a non-NULL InfoBarService pointer here, depending on which order |
| // notifications fired in. Likewise, the pointer in |entry_map_| (and in its |
| @@ -372,7 +370,7 @@ void GoogleURLTracker::OnTabClosed( |
| // function doesn't need to do even that, but others in the call chain from |
| // here might (and have comments pointing back here). |
| for (EntryMap::iterator i(entry_map_.begin()); i != entry_map_.end(); ++i) { |
| - if (i->second->navigation_controller() == navigation_controller) { |
| + if (i->second->navigation_helper() == nav_helper) { |
| i->second->Close(false); |
| return; |
| } |
| @@ -387,26 +385,22 @@ void GoogleURLTracker::CloseAllEntries(bool redo_searches) { |
| } |
| void GoogleURLTracker::UnregisterForEntrySpecificNotifications( |
| - const GoogleURLTrackerMapEntry& map_entry, |
| + GoogleURLTrackerMapEntry* map_entry, |
| bool must_be_listening_for_commit) { |
| // For tabs with map entries but no infobars, we should always be listening |
| // for both these notifications. For tabs with infobars, we may be listening |
| // for navigation commits if the user has performed a new search on this tab. |
| - if (nav_helper_->IsListeningForNavigationCommit( |
| - map_entry.navigation_controller())) { |
| - nav_helper_->SetListeningForNavigationCommit( |
| - map_entry.navigation_controller(), false); |
| + if (map_entry->navigation_helper()->IsListeningForNavigationCommit()) { |
| + map_entry->navigation_helper()->SetListeningForNavigationCommit(false); |
| } else { |
| DCHECK(!must_be_listening_for_commit); |
| - DCHECK(map_entry.has_infobar_delegate()); |
| + DCHECK(map_entry->has_infobar_delegate()); |
| } |
| const bool registered_for_tab_destruction = |
| - nav_helper_->IsListeningForTabDestruction( |
| - map_entry.navigation_controller()); |
| - DCHECK_NE(registered_for_tab_destruction, map_entry.has_infobar_delegate()); |
| + map_entry->navigation_helper()->IsListeningForTabDestruction(); |
| + DCHECK_NE(registered_for_tab_destruction, map_entry->has_infobar_delegate()); |
| if (registered_for_tab_destruction) { |
| - nav_helper_->SetListeningForTabDestruction( |
| - map_entry.navigation_controller(), false); |
| + map_entry->navigation_helper()->SetListeningForTabDestruction(false); |
| } |
| // Our global listeners for these other notifications should be in place iff |
| @@ -416,8 +410,7 @@ void GoogleURLTracker::UnregisterForEntrySpecificNotifications( |
| // See the various cases inside OnNavigationPending(). |
| for (EntryMap::const_iterator i(entry_map_.begin()); i != entry_map_.end(); |
| ++i) { |
| - if (nav_helper_->IsListeningForNavigationCommit( |
| - i->second->navigation_controller())) { |
| + if (i->second->navigation_helper()->IsListeningForNavigationCommit()) { |
| DCHECK(client_->IsListeningForNavigationStart()); |
| return; |
| } |