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

Side by Side Diff: chrome/browser/google/google_url_tracker.h

Issue 10753019: Merge 144201 - More comprehensive handling of NOTIFICATION_NAV_ENTRY_PENDING for GoogleURLTracker. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1180/src/
Patch Set: Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/google/google_url_tracker.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifndef CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_H_ 5 #ifndef CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_H_
6 #define CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_H_ 6 #define CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_H_
7 #pragma once 7 #pragma once
8 8
9 #include <map> 9 #include <map>
10 #include <string> 10 #include <string>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/gtest_prod_util.h" 13 #include "base/gtest_prod_util.h"
14 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h" 15 #include "base/memory/weak_ptr.h"
16 #include "chrome/browser/profiles/profile_keyed_service.h" 16 #include "chrome/browser/profiles/profile_keyed_service.h"
17 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h" 17 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
18 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_observer.h"
19 #include "content/public/browser/notification_registrar.h" 19 #include "content/public/browser/notification_registrar.h"
20 #include "content/public/browser/notification_source.h"
20 #include "content/public/common/url_fetcher.h" 21 #include "content/public/common/url_fetcher.h"
21 #include "googleurl/src/gurl.h" 22 #include "googleurl/src/gurl.h"
22 #include "net/base/network_change_notifier.h" 23 #include "net/base/network_change_notifier.h"
23 #include "net/url_request/url_fetcher_delegate.h" 24 #include "net/url_request/url_fetcher_delegate.h"
24 25
25 class GoogleURLTrackerInfoBarDelegate; 26 class GoogleURLTrackerInfoBarDelegate;
26 class PrefService; 27 class PrefService;
27 class Profile; 28 class Profile;
28 29
29 namespace content { 30 namespace content {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 // When |profile| is NULL or a testing profile, this function does nothing. 90 // When |profile| is NULL or a testing profile, this function does nothing.
90 static void GoogleURLSearchCommitted(Profile* profile); 91 static void GoogleURLSearchCommitted(Profile* profile);
91 92
92 static const char kDefaultGoogleHomepage[]; 93 static const char kDefaultGoogleHomepage[];
93 static const char kSearchDomainCheckURL[]; 94 static const char kSearchDomainCheckURL[];
94 95
95 private: 96 private:
96 friend class GoogleURLTrackerInfoBarDelegate; 97 friend class GoogleURLTrackerInfoBarDelegate;
97 friend class GoogleURLTrackerTest; 98 friend class GoogleURLTrackerTest;
98 99
99 typedef std::map<const InfoBarTabHelper*, 100 struct MapEntry {
100 GoogleURLTrackerInfoBarDelegate*> InfoBarMap; 101 MapEntry(); // Required by STL.
102 MapEntry(GoogleURLTrackerInfoBarDelegate* infobar,
103 const content::NotificationSource& navigation_controller_source,
104 const content::NotificationSource& tab_contents_source);
105 ~MapEntry();
106
107 GoogleURLTrackerInfoBarDelegate* infobar;
108 content::NotificationSource navigation_controller_source;
109 content::NotificationSource tab_contents_source;
110 };
111
112 typedef std::map<const InfoBarTabHelper*, MapEntry> InfoBarMap;
101 typedef GoogleURLTrackerInfoBarDelegate* (*InfoBarCreator)( 113 typedef GoogleURLTrackerInfoBarDelegate* (*InfoBarCreator)(
102 InfoBarTabHelper* infobar_helper, 114 InfoBarTabHelper* infobar_helper,
103 const GURL& search_url,
104 GoogleURLTracker* google_url_tracker, 115 GoogleURLTracker* google_url_tracker,
105 const GURL& new_google_url); 116 const GURL& new_google_url);
106 117
107 // net::URLFetcherDelegate: 118 // net::URLFetcherDelegate:
108 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 119 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
109 120
110 // content::NotificationObserver: 121 // content::NotificationObserver:
111 virtual void Observe(int type, 122 virtual void Observe(int type,
112 const content::NotificationSource& source, 123 const content::NotificationSource& source,
113 const content::NotificationDetails& details) OVERRIDE; 124 const content::NotificationDetails& details) OVERRIDE;
(...skipping 27 matching lines...) Expand all
141 // the notifications sent when the actual load is triggered. 152 // the notifications sent when the actual load is triggered.
142 void SearchCommitted(); 153 void SearchCommitted();
143 154
144 // Called by Observe() after SearchCommitted() registers notification 155 // Called by Observe() after SearchCommitted() registers notification
145 // listeners, to indicate that we've received the "load now pending" 156 // listeners, to indicate that we've received the "load now pending"
146 // notification. |navigation_controller_source| and |tab_contents_source| are 157 // notification. |navigation_controller_source| and |tab_contents_source| are
147 // NotificationSources pointing to the associated NavigationController and 158 // NotificationSources pointing to the associated NavigationController and
148 // TabContents, respectively, for this load; |infobar_helper| is the 159 // TabContents, respectively, for this load; |infobar_helper| is the
149 // InfoBarTabHelper of the associated tab; and |search_url| is the actual 160 // InfoBarTabHelper of the associated tab; and |search_url| is the actual
150 // search performed by the user, which if necessary we'll re-do on a new 161 // search performed by the user, which if necessary we'll re-do on a new
151 // domain later. This function creates a (still-invisible) InfoBarDelegate 162 // domain later. If there is already a visible GoogleURLTracker infobar for
152 // for the associated tab and begins listening for the "load committed" 163 // this tab, this function resets its associated navigation entry to point at
153 // notification that will tell us it's safe to show the infobar. 164 // the new pending entry. Otherwise this function creates a (still-invisible)
165 // InfoBarDelegate for the associated tab.
154 void OnNavigationPending( 166 void OnNavigationPending(
155 const content::NotificationSource& navigation_controller_source, 167 const content::NotificationSource& navigation_controller_source,
156 const content::NotificationSource& tab_contents_source, 168 const content::NotificationSource& tab_contents_source,
157 InfoBarTabHelper* infobar_helper, 169 InfoBarTabHelper* infobar_helper,
158 const GURL& search_url); 170 int pending_id);
159 171
160 // Called by Observe() once a load we're watching commits, or the associated 172 // Called by Observe() once a load we're watching commits, or the associated
161 // tab is closed. The first three args are the same as for 173 // tab is closed. |infobar_helper| is the same as for OnNavigationPending();
162 // OnNavigationPending(); |navigated| is true when this call is due to a 174 // |search_url| is valid when this call is due to a successful navigation
163 // successful navigation (indicating that we should show our infobar) as 175 // (indicating that we should show or update the relevant infobar) as opposed
164 // opposed to tab closue (which means we should delete the infobar). 176 // to tab closure (which means we should delete the infobar).
165 void OnNavigationCommittedOrTabClosed( 177 void OnNavigationCommittedOrTabClosed(const InfoBarTabHelper* infobar_helper,
166 const content::NotificationSource& navigation_controller_source, 178 const GURL& search_url);
167 const content::NotificationSource& tab_contents_source,
168 const InfoBarTabHelper* infobar_helper,
169 bool navigated);
170 179
171 // Closes all open infobars. If |redo_searches| is true, this also triggers 180 // Closes all open infobars. If |redo_searches| is true, this also triggers
172 // each tab to re-perform the user's search, but on the new Google TLD. 181 // each tab to re-perform the user's search, but on the new Google TLD.
173 void CloseAllInfoBars(bool redo_searches); 182 void CloseAllInfoBars(bool redo_searches);
174 183
184 // Unregisters any listeners for the notification sources in |map_entry|.
185 // This also sanity-DCHECKs that these are registered (or not) in the specific
186 // cases we expect. (|must_be_listening_for_commit| is used purely for this
187 // sanity-checking.)
188 void UnregisterForEntrySpecificNotifications(
189 const MapEntry& map_entry,
190 bool must_be_listening_for_commit);
191
175 Profile* profile_; 192 Profile* profile_;
176 content::NotificationRegistrar registrar_; 193 content::NotificationRegistrar registrar_;
177 InfoBarCreator infobar_creator_; 194 InfoBarCreator infobar_creator_;
178 // TODO(ukai): GoogleURLTracker should track google domain (e.g. google.co.uk) 195 // TODO(ukai): GoogleURLTracker should track google domain (e.g. google.co.uk)
179 // rather than URL (e.g. http://www.google.co.uk/), so that user could 196 // rather than URL (e.g. http://www.google.co.uk/), so that user could
180 // configure to use https in search engine templates. 197 // configure to use https in search engine templates.
181 GURL google_url_; 198 GURL google_url_;
182 GURL fetched_google_url_; 199 GURL fetched_google_url_;
183 base::WeakPtrFactory<GoogleURLTracker> weak_ptr_factory_; 200 base::WeakPtrFactory<GoogleURLTracker> weak_ptr_factory_;
184 scoped_ptr<net::URLFetcher> fetcher_; 201 scoped_ptr<net::URLFetcher> fetcher_;
185 int fetcher_id_; 202 int fetcher_id_;
186 bool in_startup_sleep_; // True if we're in the five-second "no fetching" 203 bool in_startup_sleep_; // True if we're in the five-second "no fetching"
187 // period that begins at browser start. 204 // period that begins at browser start.
188 bool already_fetched_; // True if we've already fetched a URL once this run; 205 bool already_fetched_; // True if we've already fetched a URL once this run;
189 // we won't fetch again until after a restart. 206 // we won't fetch again until after a restart.
190 bool need_to_fetch_; // True if a consumer actually wants us to fetch an 207 bool need_to_fetch_; // True if a consumer actually wants us to fetch an
191 // updated URL. If this is never set, we won't 208 // updated URL. If this is never set, we won't
192 // bother to fetch anything. 209 // bother to fetch anything.
193 // Consumers should observe 210 // Consumers should observe
194 // chrome::NOTIFICATION_GOOGLE_URL_UPDATED. 211 // chrome::NOTIFICATION_GOOGLE_URL_UPDATED.
195 bool need_to_prompt_; // True if the last fetched Google URL is not 212 bool need_to_prompt_; // True if the last fetched Google URL is not
196 // matched with current user's default Google URL 213 // matched with current user's default Google URL
197 // nor the last prompted Google URL. 214 // nor the last prompted Google URL.
215 bool search_committed_; // True when we're expecting a notification of a new
216 // pending search navigation.
198 InfoBarMap infobar_map_; 217 InfoBarMap infobar_map_;
199 218
200 DISALLOW_COPY_AND_ASSIGN(GoogleURLTracker); 219 DISALLOW_COPY_AND_ASSIGN(GoogleURLTracker);
201 }; 220 };
202 221
203 222
204 // This infobar delegate is declared here (rather than in the .cc file) so test 223 // This infobar delegate is declared here (rather than in the .cc file) so test
205 // code can subclass it. 224 // code can subclass it.
206 class GoogleURLTrackerInfoBarDelegate : public ConfirmInfoBarDelegate { 225 class GoogleURLTrackerInfoBarDelegate : public ConfirmInfoBarDelegate {
207 public: 226 public:
208 GoogleURLTrackerInfoBarDelegate(InfoBarTabHelper* infobar_helper, 227 GoogleURLTrackerInfoBarDelegate(InfoBarTabHelper* infobar_helper,
209 const GURL& search_url,
210 GoogleURLTracker* google_url_tracker, 228 GoogleURLTracker* google_url_tracker,
211 const GURL& new_google_url); 229 const GURL& new_google_url);
212 230
213 // ConfirmInfoBarDelegate: 231 // ConfirmInfoBarDelegate:
214 virtual bool Accept() OVERRIDE; 232 virtual bool Accept() OVERRIDE;
215 virtual bool Cancel() OVERRIDE; 233 virtual bool Cancel() OVERRIDE;
216 virtual string16 GetLinkText() const OVERRIDE; 234 virtual string16 GetLinkText() const OVERRIDE;
217 virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; 235 virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
236 virtual bool ShouldExpireInternal(
237 const content::LoadCommittedDetails& details) const OVERRIDE;
218 238
219 // Allows GoogleURLTracker to change the Google base URL after the infobar has 239 // Allows GoogleURLTracker to change the Google base URL after the infobar has
220 // been instantiated. This should only be called with an URL with the same 240 // been instantiated. This should only be called with an URL with the same
221 // TLD as the existing one, so that the prompt we're displaying will still be 241 // TLD as the existing one, so that the prompt we're displaying will still be
222 // correct. 242 // correct.
223 void SetGoogleURL(const GURL& new_google_url); 243 void SetGoogleURL(const GURL& new_google_url);
224 244
245 bool showing() const { return showing_; }
246 void set_pending_id(int pending_id) { pending_id_ = pending_id; }
247
225 // These are virtual so test code can override them in a subclass. 248 // These are virtual so test code can override them in a subclass.
226 virtual void Show(); 249 virtual void Show(const GURL& search_url);
227 virtual void Close(bool redo_search); 250 virtual void Close(bool redo_search);
228 251
229 protected: 252 protected:
230 virtual ~GoogleURLTrackerInfoBarDelegate(); 253 virtual ~GoogleURLTrackerInfoBarDelegate();
231 254
232 InfoBarTabHelper* map_key_; // What |google_url_tracker_| uses to track us. 255 InfoBarTabHelper* map_key_; // What |google_url_tracker_| uses to track us.
233 const GURL search_url_; 256 GURL search_url_;
234 GoogleURLTracker* google_url_tracker_; 257 GoogleURLTracker* google_url_tracker_;
235 GURL new_google_url_; 258 GURL new_google_url_;
236 bool showing_; // True if this delegate has been added to a TabContents. 259 bool showing_; // True if this delegate has been added to a TabContents.
260 int pending_id_;
237 261
238 private: 262 private:
239 // ConfirmInfoBarDelegate: 263 // ConfirmInfoBarDelegate:
240 virtual string16 GetMessageText() const OVERRIDE; 264 virtual string16 GetMessageText() const OVERRIDE;
241 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; 265 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
242 266
243 DISALLOW_COPY_AND_ASSIGN(GoogleURLTrackerInfoBarDelegate); 267 DISALLOW_COPY_AND_ASSIGN(GoogleURLTrackerInfoBarDelegate);
244 }; 268 };
245 269
246 #endif // CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_H_ 270 #endif // CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_H_
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/google/google_url_tracker.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698