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

Side by Side Diff: chrome/browser/ui/search/search_tab_helper.cc

Issue 73013002: [Clean up] Replace SearchTabHelper NAV_ENTRY_COMMITTED notification observer with WebContentsObserve (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix android compile error Created 7 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/search/search_tab_helper.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/search/search_tab_helper.h" 5 #include "chrome/browser/ui/search/search_tab_helper.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 19 matching lines...) Expand all
30 #include "chrome/browser/ui/omnibox/omnibox_view.h" 30 #include "chrome/browser/ui/omnibox/omnibox_view.h"
31 #include "chrome/browser/ui/search/search_ipc_router_policy_impl.h" 31 #include "chrome/browser/ui/search/search_ipc_router_policy_impl.h"
32 #include "chrome/browser/ui/tabs/tab_strip_model.h" 32 #include "chrome/browser/ui/tabs/tab_strip_model.h"
33 #include "chrome/browser/ui/tabs/tab_strip_model_utils.h" 33 #include "chrome/browser/ui/tabs/tab_strip_model_utils.h"
34 #include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h" 34 #include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h"
35 #include "chrome/common/url_constants.h" 35 #include "chrome/common/url_constants.h"
36 #include "content/public/browser/navigation_controller.h" 36 #include "content/public/browser/navigation_controller.h"
37 #include "content/public/browser/navigation_details.h" 37 #include "content/public/browser/navigation_details.h"
38 #include "content/public/browser/navigation_entry.h" 38 #include "content/public/browser/navigation_entry.h"
39 #include "content/public/browser/navigation_type.h" 39 #include "content/public/browser/navigation_type.h"
40 #include "content/public/browser/notification_service.h"
41 #include "content/public/browser/notification_types.h"
42 #include "content/public/browser/render_process_host.h" 40 #include "content/public/browser/render_process_host.h"
43 #include "content/public/browser/user_metrics.h" 41 #include "content/public/browser/user_metrics.h"
44 #include "content/public/browser/web_contents.h" 42 #include "content/public/browser/web_contents.h"
45 #include "content/public/browser/web_contents_view.h" 43 #include "content/public/browser/web_contents_view.h"
46 #include "content/public/common/page_transition_types.h" 44 #include "content/public/common/page_transition_types.h"
47 #include "content/public/common/referrer.h" 45 #include "content/public/common/referrer.h"
48 #include "grit/generated_resources.h" 46 #include "grit/generated_resources.h"
49 #include "ui/base/l10n/l10n_util.h" 47 #include "ui/base/l10n/l10n_util.h"
50 #include "url/gurl.h" 48 #include "url/gurl.h"
51 49
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 is_search_enabled_(chrome::IsInstantExtendedAPIEnabled()), 130 is_search_enabled_(chrome::IsInstantExtendedAPIEnabled()),
133 user_input_in_progress_(false), 131 user_input_in_progress_(false),
134 web_contents_(web_contents), 132 web_contents_(web_contents),
135 ipc_router_(web_contents, this, 133 ipc_router_(web_contents, this,
136 make_scoped_ptr(new SearchIPCRouterPolicyImpl(web_contents)) 134 make_scoped_ptr(new SearchIPCRouterPolicyImpl(web_contents))
137 .PassAs<SearchIPCRouter::Policy>()), 135 .PassAs<SearchIPCRouter::Policy>()),
138 instant_service_(NULL) { 136 instant_service_(NULL) {
139 if (!is_search_enabled_) 137 if (!is_search_enabled_)
140 return; 138 return;
141 139
142 // Observe NOTIFICATION_NAV_ENTRY_COMMITTED events so we can reset state
143 // associated with the WebContents (such as mode, last known most visited
144 // items, instant support state etc).
145 registrar_.Add(
146 this,
147 content::NOTIFICATION_NAV_ENTRY_COMMITTED,
148 content::Source<content::NavigationController>(
149 &web_contents->GetController()));
150
151 instant_service_ = 140 instant_service_ =
152 InstantServiceFactory::GetForProfile( 141 InstantServiceFactory::GetForProfile(
153 Profile::FromBrowserContext(web_contents_->GetBrowserContext())); 142 Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
154 if (instant_service_) 143 if (instant_service_)
155 instant_service_->AddObserver(this); 144 instant_service_->AddObserver(this);
156 } 145 }
157 146
158 SearchTabHelper::~SearchTabHelper() { 147 SearchTabHelper::~SearchTabHelper() {
159 if (instant_service_) 148 if (instant_service_)
160 instant_service_->RemoveObserver(this); 149 instant_service_->RemoveObserver(this);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } 205 }
217 206
218 void SearchTabHelper::OnTabActivated() { 207 void SearchTabHelper::OnTabActivated() {
219 ipc_router_.OnTabActivated(); 208 ipc_router_.OnTabActivated();
220 } 209 }
221 210
222 void SearchTabHelper::OnTabDeactivated() { 211 void SearchTabHelper::OnTabDeactivated() {
223 ipc_router_.OnTabDeactivated(); 212 ipc_router_.OnTabDeactivated();
224 } 213 }
225 214
226 void SearchTabHelper::Observe(
227 int type,
228 const content::NotificationSource& source,
229 const content::NotificationDetails& details) {
230 DCHECK_EQ(content::NOTIFICATION_NAV_ENTRY_COMMITTED, type);
231 content::LoadCommittedDetails* load_details =
232 content::Details<content::LoadCommittedDetails>(details).ptr();
233 if (!load_details->is_main_frame)
234 return;
235
236 // TODO(kmadhusu): Set the page initial states (such as omnibox margin, etc)
237 // from here. Please refer to crbug.com/247517 for more details.
238 if (chrome::ShouldAssignURLToInstantRenderer(web_contents_->GetURL(),
239 profile())) {
240 ipc_router_.SetDisplayInstantResults();
241 }
242
243 UpdateMode(true, false);
244
245 content::NavigationEntry* entry =
246 web_contents_->GetController().GetVisibleEntry();
247 DCHECK(entry);
248
249 // Already determined the instant support state for this page, do not reset
250 // the instant support state.
251 //
252 // When we get a navigation entry committed event, there seem to be two ways
253 // to tell whether the navigation was "in-page". Ideally, when
254 // LoadCommittedDetails::is_in_page is true, we should have
255 // LoadCommittedDetails::type to be NAVIGATION_TYPE_IN_PAGE. Unfortunately,
256 // they are different in some cases. To workaround this bug, we are checking
257 // (is_in_page || type == NAVIGATION_TYPE_IN_PAGE). Please refer to
258 // crbug.com/251330 for more details.
259 if (load_details->is_in_page ||
260 load_details->type == content::NAVIGATION_TYPE_IN_PAGE) {
261 // When an "in-page" navigation happens, we will not receive a
262 // DidFinishLoad() event. Therefore, we will not determine the Instant
263 // support for the navigated page. So, copy over the Instant support from
264 // the previous entry. If the page does not support Instant, update the
265 // location bar from here to turn off search terms replacement.
266 chrome::SetInstantSupportStateInNavigationEntry(model_.instant_support(),
267 entry);
268 if (model_.instant_support() == INSTANT_SUPPORT_NO)
269 UpdateLocationBar(web_contents_);
270 return;
271 }
272
273 model_.SetInstantSupportState(INSTANT_SUPPORT_UNKNOWN);
274 model_.SetVoiceSearchSupported(false);
275 chrome::SetInstantSupportStateInNavigationEntry(model_.instant_support(),
276 entry);
277 }
278
279 void SearchTabHelper::RenderViewCreated( 215 void SearchTabHelper::RenderViewCreated(
280 content::RenderViewHost* render_view_host) { 216 content::RenderViewHost* render_view_host) {
281 ipc_router_.SetPromoInformation(IsAppLauncherEnabled()); 217 ipc_router_.SetPromoInformation(IsAppLauncherEnabled());
282 } 218 }
283 219
284 void SearchTabHelper::DidNavigateMainFrame( 220 void SearchTabHelper::DidNavigateMainFrame(
285 const content::LoadCommittedDetails& details, 221 const content::LoadCommittedDetails& details,
286 const content::FrameNavigateParams& params) { 222 const content::FrameNavigateParams& params) {
287 if (IsCacheableNTP(web_contents_)) { 223 if (IsCacheableNTP(web_contents_)) {
288 if (details.http_status_code == 204 || details.http_status_code >= 400) { 224 if (details.http_status_code == 204 || details.http_status_code >= 400) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 264
329 void SearchTabHelper::DidFinishLoad( 265 void SearchTabHelper::DidFinishLoad(
330 int64 /* frame_id */, 266 int64 /* frame_id */,
331 const GURL& /* validated_url */, 267 const GURL& /* validated_url */,
332 bool is_main_frame, 268 bool is_main_frame,
333 content::RenderViewHost* /* render_view_host */) { 269 content::RenderViewHost* /* render_view_host */) {
334 if (is_main_frame) 270 if (is_main_frame)
335 DetermineIfPageSupportsInstant(); 271 DetermineIfPageSupportsInstant();
336 } 272 }
337 273
274 void SearchTabHelper::NavigationEntryCommitted(
275 const content::LoadCommittedDetails& load_details) {
276 if (!is_search_enabled_)
277 return;
278
279 if (!load_details.is_main_frame)
280 return;
281
282 // TODO(kmadhusu): Set the page initial states (such as omnibox margin, etc)
283 // from here. Please refer to crbug.com/247517 for more details.
284 if (chrome::ShouldAssignURLToInstantRenderer(web_contents_->GetURL(),
285 profile())) {
286 ipc_router_.SetDisplayInstantResults();
287 }
288
289 UpdateMode(true, false);
290
291 content::NavigationEntry* entry =
292 web_contents_->GetController().GetVisibleEntry();
293 DCHECK(entry);
294
295 // Already determined the instant support state for this page, do not reset
296 // the instant support state.
297 //
298 // When we get a navigation entry committed event, there seem to be two ways
299 // to tell whether the navigation was "in-page". Ideally, when
300 // LoadCommittedDetails::is_in_page is true, we should have
301 // LoadCommittedDetails::type to be NAVIGATION_TYPE_IN_PAGE. Unfortunately,
302 // they are different in some cases. To workaround this bug, we are checking
303 // (is_in_page || type == NAVIGATION_TYPE_IN_PAGE). Please refer to
304 // crbug.com/251330 for more details.
305 if (load_details.is_in_page ||
306 load_details.type == content::NAVIGATION_TYPE_IN_PAGE) {
307 // When an "in-page" navigation happens, we will not receive a
308 // DidFinishLoad() event. Therefore, we will not determine the Instant
309 // support for the navigated page. So, copy over the Instant support from
310 // the previous entry. If the page does not support Instant, update the
311 // location bar from here to turn off search terms replacement.
312 chrome::SetInstantSupportStateInNavigationEntry(model_.instant_support(),
313 entry);
314 if (model_.instant_support() == INSTANT_SUPPORT_NO)
315 UpdateLocationBar(web_contents_);
316 return;
317 }
318
319 model_.SetInstantSupportState(INSTANT_SUPPORT_UNKNOWN);
320 model_.SetVoiceSearchSupported(false);
321 chrome::SetInstantSupportStateInNavigationEntry(model_.instant_support(),
322 entry);
323 }
324
338 void SearchTabHelper::OnInstantSupportDetermined(bool supports_instant) { 325 void SearchTabHelper::OnInstantSupportDetermined(bool supports_instant) {
339 InstantSupportChanged(supports_instant); 326 InstantSupportChanged(supports_instant);
340 } 327 }
341 328
342 void SearchTabHelper::OnSetVoiceSearchSupport(bool supports_voice_search) { 329 void SearchTabHelper::OnSetVoiceSearchSupport(bool supports_voice_search) {
343 model_.SetVoiceSearchSupported(supports_voice_search); 330 model_.SetVoiceSearchSupported(supports_voice_search);
344 } 331 }
345 332
346 void SearchTabHelper::ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) { 333 void SearchTabHelper::ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) {
347 ipc_router_.SendThemeBackgroundInfo(theme_info); 334 ipc_router_.SendThemeBackgroundInfo(theme_info);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 void SearchTabHelper::RedirectToLocalNTP() { 545 void SearchTabHelper::RedirectToLocalNTP() {
559 // Extra parentheses to declare a variable. 546 // Extra parentheses to declare a variable.
560 content::NavigationController::LoadURLParams load_params( 547 content::NavigationController::LoadURLParams load_params(
561 (GURL(chrome::kChromeSearchLocalNtpUrl))); 548 (GURL(chrome::kChromeSearchLocalNtpUrl)));
562 load_params.referrer = content::Referrer(); 549 load_params.referrer = content::Referrer();
563 load_params.transition_type = content::PAGE_TRANSITION_SERVER_REDIRECT; 550 load_params.transition_type = content::PAGE_TRANSITION_SERVER_REDIRECT;
564 // Don't push a history entry. 551 // Don't push a history entry.
565 load_params.should_replace_current_entry = true; 552 load_params.should_replace_current_entry = true;
566 web_contents_->GetController().LoadURLWithParams(load_params); 553 web_contents_->GetController().LoadURLWithParams(load_params);
567 } 554 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/search/search_tab_helper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698