OLD | NEW |
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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 #include "ui/base/page_transition_types.h" | 53 #include "ui/base/page_transition_types.h" |
54 #include "url/gurl.h" | 54 #include "url/gurl.h" |
55 | 55 |
56 DEFINE_WEB_CONTENTS_USER_DATA_KEY(SearchTabHelper); | 56 DEFINE_WEB_CONTENTS_USER_DATA_KEY(SearchTabHelper); |
57 | 57 |
58 namespace { | 58 namespace { |
59 | 59 |
60 bool IsCacheableNTP(const content::WebContents* contents) { | 60 bool IsCacheableNTP(const content::WebContents* contents) { |
61 const content::NavigationEntry* entry = | 61 const content::NavigationEntry* entry = |
62 contents->GetController().GetLastCommittedEntry(); | 62 contents->GetController().GetLastCommittedEntry(); |
63 return chrome::NavEntryIsInstantNTP(contents, entry) && | 63 return search::NavEntryIsInstantNTP(contents, entry) && |
64 entry->GetURL() != GURL(chrome::kChromeSearchLocalNtpUrl); | 64 entry->GetURL() != GURL(chrome::kChromeSearchLocalNtpUrl); |
65 } | 65 } |
66 | 66 |
67 bool IsNTP(const content::WebContents* contents) { | 67 bool IsNTP(const content::WebContents* contents) { |
68 // We can't use WebContents::GetURL() because that uses the active entry, | 68 // We can't use WebContents::GetURL() because that uses the active entry, |
69 // whereas we want the visible entry. | 69 // whereas we want the visible entry. |
70 const content::NavigationEntry* entry = | 70 const content::NavigationEntry* entry = |
71 contents->GetController().GetVisibleEntry(); | 71 contents->GetController().GetVisibleEntry(); |
72 if (entry && entry->GetVirtualURL() == GURL(chrome::kChromeUINewTabURL)) | 72 if (entry && entry->GetVirtualURL() == GURL(chrome::kChromeUINewTabURL)) |
73 return true; | 73 return true; |
74 | 74 |
75 return chrome::IsInstantNTP(contents); | 75 return search::IsInstantNTP(contents); |
76 } | 76 } |
77 | 77 |
78 bool IsSearchResults(const content::WebContents* contents) { | 78 bool IsSearchResults(const content::WebContents* contents) { |
79 return !chrome::GetSearchTerms(contents).empty(); | 79 return !search::GetSearchTerms(contents).empty(); |
80 } | 80 } |
81 | 81 |
82 bool IsLocal(const content::WebContents* contents) { | 82 bool IsLocal(const content::WebContents* contents) { |
83 if (!contents) | 83 if (!contents) |
84 return false; | 84 return false; |
85 const content::NavigationEntry* entry = | 85 const content::NavigationEntry* entry = |
86 contents->GetController().GetVisibleEntry(); | 86 contents->GetController().GetVisibleEntry(); |
87 return entry && entry->GetURL() == GURL(chrome::kChromeSearchLocalNtpUrl); | 87 return entry && entry->GetURL() == GURL(chrome::kChromeSearchLocalNtpUrl); |
88 } | 88 } |
89 | 89 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 } | 136 } |
137 | 137 |
138 bool OmniboxHasFocus(OmniboxView* omnibox) { | 138 bool OmniboxHasFocus(OmniboxView* omnibox) { |
139 return omnibox && omnibox->model()->has_focus(); | 139 return omnibox && omnibox->model()->has_focus(); |
140 } | 140 } |
141 | 141 |
142 } // namespace | 142 } // namespace |
143 | 143 |
144 SearchTabHelper::SearchTabHelper(content::WebContents* web_contents) | 144 SearchTabHelper::SearchTabHelper(content::WebContents* web_contents) |
145 : WebContentsObserver(web_contents), | 145 : WebContentsObserver(web_contents), |
146 is_search_enabled_(chrome::IsInstantExtendedAPIEnabled()), | 146 is_search_enabled_(search::IsInstantExtendedAPIEnabled()), |
147 web_contents_(web_contents), | 147 web_contents_(web_contents), |
148 ipc_router_(web_contents, | 148 ipc_router_(web_contents, |
149 this, | 149 this, |
150 make_scoped_ptr(new SearchIPCRouterPolicyImpl(web_contents))), | 150 make_scoped_ptr(new SearchIPCRouterPolicyImpl(web_contents))), |
151 instant_service_(NULL), | 151 instant_service_(NULL), |
152 delegate_(NULL), | 152 delegate_(NULL), |
153 omnibox_has_focus_fn_(&OmniboxHasFocus) { | 153 omnibox_has_focus_fn_(&OmniboxHasFocus) { |
154 if (!is_search_enabled_) | 154 if (!is_search_enabled_) |
155 return; | 155 return; |
156 | 156 |
(...skipping 30 matching lines...) Expand all Loading... |
187 ipc_router_.OmniboxFocusChanged(state, reason); | 187 ipc_router_.OmniboxFocusChanged(state, reason); |
188 | 188 |
189 // Don't send oninputstart/oninputend updates in response to focus changes | 189 // Don't send oninputstart/oninputend updates in response to focus changes |
190 // if there's a navigation in progress. This prevents Chrome from sending | 190 // if there's a navigation in progress. This prevents Chrome from sending |
191 // a spurious oninputend when the user accepts a match in the omnibox. | 191 // a spurious oninputend when the user accepts a match in the omnibox. |
192 if (web_contents_->GetController().GetPendingEntry() == NULL) { | 192 if (web_contents_->GetController().GetPendingEntry() == NULL) { |
193 ipc_router_.SetInputInProgress(IsInputInProgress()); | 193 ipc_router_.SetInputInProgress(IsInputInProgress()); |
194 | 194 |
195 InstantSearchPrerenderer* prerenderer = | 195 InstantSearchPrerenderer* prerenderer = |
196 InstantSearchPrerenderer::GetForProfile(profile()); | 196 InstantSearchPrerenderer::GetForProfile(profile()); |
197 if (!prerenderer || !chrome::ShouldPrerenderInstantUrlOnOmniboxFocus()) | 197 if (!prerenderer || !search::ShouldPrerenderInstantUrlOnOmniboxFocus()) |
198 return; | 198 return; |
199 | 199 |
200 if (state == OMNIBOX_FOCUS_NONE) { | 200 if (state == OMNIBOX_FOCUS_NONE) { |
201 prerenderer->Cancel(); | 201 prerenderer->Cancel(); |
202 return; | 202 return; |
203 } | 203 } |
204 | 204 |
205 if (!IsSearchResultsPage()) { | 205 if (!IsSearchResultsPage()) { |
206 prerenderer->Init( | 206 prerenderer->Init( |
207 web_contents_->GetController().GetDefaultSessionStorageNamespace(), | 207 web_contents_->GetController().GetDefaultSessionStorageNamespace(), |
(...skipping 14 matching lines...) Expand all Loading... |
222 return; | 222 return; |
223 | 223 |
224 InstantSupportState new_state = instant_support ? INSTANT_SUPPORT_YES : | 224 InstantSupportState new_state = instant_support ? INSTANT_SUPPORT_YES : |
225 INSTANT_SUPPORT_NO; | 225 INSTANT_SUPPORT_NO; |
226 | 226 |
227 model_.SetInstantSupportState(new_state); | 227 model_.SetInstantSupportState(new_state); |
228 | 228 |
229 content::NavigationEntry* entry = | 229 content::NavigationEntry* entry = |
230 web_contents_->GetController().GetLastCommittedEntry(); | 230 web_contents_->GetController().GetLastCommittedEntry(); |
231 if (entry) { | 231 if (entry) { |
232 chrome::SetInstantSupportStateInNavigationEntry(new_state, entry); | 232 search::SetInstantSupportStateInNavigationEntry(new_state, entry); |
233 if (delegate_ && !instant_support) | 233 if (delegate_ && !instant_support) |
234 delegate_->OnWebContentsInstantSupportDisabled(web_contents_); | 234 delegate_->OnWebContentsInstantSupportDisabled(web_contents_); |
235 } | 235 } |
236 } | 236 } |
237 | 237 |
238 bool SearchTabHelper::SupportsInstant() const { | 238 bool SearchTabHelper::SupportsInstant() const { |
239 return model_.instant_support() == INSTANT_SUPPORT_YES; | 239 return model_.instant_support() == INSTANT_SUPPORT_YES; |
240 } | 240 } |
241 | 241 |
242 void SearchTabHelper::SetSuggestionToPrefetch( | 242 void SearchTabHelper::SetSuggestionToPrefetch( |
243 const InstantSuggestion& suggestion) { | 243 const InstantSuggestion& suggestion) { |
244 ipc_router_.SetSuggestionToPrefetch(suggestion); | 244 ipc_router_.SetSuggestionToPrefetch(suggestion); |
245 } | 245 } |
246 | 246 |
247 void SearchTabHelper::Submit(const base::string16& text, | 247 void SearchTabHelper::Submit(const base::string16& text, |
248 const EmbeddedSearchRequestParams& params) { | 248 const EmbeddedSearchRequestParams& params) { |
249 ipc_router_.Submit(text, params); | 249 ipc_router_.Submit(text, params); |
250 } | 250 } |
251 | 251 |
252 void SearchTabHelper::OnTabActivated() { | 252 void SearchTabHelper::OnTabActivated() { |
253 ipc_router_.OnTabActivated(); | 253 ipc_router_.OnTabActivated(); |
254 | 254 |
255 OmniboxView* omnibox_view = GetOmniboxView(); | 255 OmniboxView* omnibox_view = GetOmniboxView(); |
256 if (chrome::ShouldPrerenderInstantUrlOnOmniboxFocus() && | 256 if (search::ShouldPrerenderInstantUrlOnOmniboxFocus() && |
257 omnibox_has_focus_fn_(omnibox_view)) { | 257 omnibox_has_focus_fn_(omnibox_view)) { |
258 InstantSearchPrerenderer* prerenderer = | 258 InstantSearchPrerenderer* prerenderer = |
259 InstantSearchPrerenderer::GetForProfile(profile()); | 259 InstantSearchPrerenderer::GetForProfile(profile()); |
260 if (prerenderer && !IsSearchResultsPage()) { | 260 if (prerenderer && !IsSearchResultsPage()) { |
261 prerenderer->Init( | 261 prerenderer->Init( |
262 web_contents_->GetController().GetDefaultSessionStorageNamespace(), | 262 web_contents_->GetController().GetDefaultSessionStorageNamespace(), |
263 web_contents_->GetContainerBounds().size()); | 263 web_contents_->GetContainerBounds().size()); |
264 } | 264 } |
265 } | 265 } |
266 } | 266 } |
(...skipping 11 matching lines...) Expand all Loading... |
278 } | 278 } |
279 | 279 |
280 void SearchTabHelper::RenderViewCreated( | 280 void SearchTabHelper::RenderViewCreated( |
281 content::RenderViewHost* render_view_host) { | 281 content::RenderViewHost* render_view_host) { |
282 ipc_router_.SetPromoInformation(IsAppLauncherEnabled()); | 282 ipc_router_.SetPromoInformation(IsAppLauncherEnabled()); |
283 } | 283 } |
284 | 284 |
285 void SearchTabHelper::DidStartNavigationToPendingEntry( | 285 void SearchTabHelper::DidStartNavigationToPendingEntry( |
286 const GURL& url, | 286 const GURL& url, |
287 content::NavigationController::ReloadType /* reload_type */) { | 287 content::NavigationController::ReloadType /* reload_type */) { |
288 if (chrome::IsNTPURL(url, profile())) { | 288 if (search::IsNTPURL(url, profile())) { |
289 // Set the title on any pending entry corresponding to the NTP. This | 289 // Set the title on any pending entry corresponding to the NTP. This |
290 // prevents any flickering of the tab title. | 290 // prevents any flickering of the tab title. |
291 content::NavigationEntry* entry = | 291 content::NavigationEntry* entry = |
292 web_contents_->GetController().GetPendingEntry(); | 292 web_contents_->GetController().GetPendingEntry(); |
293 if (entry) | 293 if (entry) |
294 entry->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE)); | 294 entry->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE)); |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 void SearchTabHelper::DidNavigateMainFrame( | 298 void SearchTabHelper::DidNavigateMainFrame( |
299 const content::LoadCommittedDetails& details, | 299 const content::LoadCommittedDetails& details, |
300 const content::FrameNavigateParams& params) { | 300 const content::FrameNavigateParams& params) { |
301 if (IsCacheableNTP(web_contents_)) { | 301 if (IsCacheableNTP(web_contents_)) { |
302 UMA_HISTOGRAM_ENUMERATION("InstantExtended.CacheableNTPLoad", | 302 UMA_HISTOGRAM_ENUMERATION("InstantExtended.CacheableNTPLoad", |
303 chrome::CACHEABLE_NTP_LOAD_SUCCEEDED, | 303 search::CACHEABLE_NTP_LOAD_SUCCEEDED, |
304 chrome::CACHEABLE_NTP_LOAD_MAX); | 304 search::CACHEABLE_NTP_LOAD_MAX); |
305 } | 305 } |
306 | 306 |
307 // Always set the title on the new tab page to be the one from our UI | 307 // Always set the title on the new tab page to be the one from our UI |
308 // resources. Normally, we set the title when we begin a NTP load, but it can | 308 // resources. Normally, we set the title when we begin a NTP load, but it can |
309 // get reset in several places (like when you press Reload). This check | 309 // get reset in several places (like when you press Reload). This check |
310 // ensures that the title is properly set to the string defined by the Chrome | 310 // ensures that the title is properly set to the string defined by the Chrome |
311 // UI language (rather than the server language) in all cases. | 311 // UI language (rather than the server language) in all cases. |
312 // | 312 // |
313 // We only override the title when it's nonempty to allow the page to set the | 313 // We only override the title when it's nonempty to allow the page to set the |
314 // title if it really wants. An empty title means to use the default. There's | 314 // title if it really wants. An empty title means to use the default. There's |
315 // also a race condition between this code and the page's SetTitle call which | 315 // also a race condition between this code and the page's SetTitle call which |
316 // this rule avoids. | 316 // this rule avoids. |
317 content::NavigationEntry* entry = | 317 content::NavigationEntry* entry = |
318 web_contents_->GetController().GetLastCommittedEntry(); | 318 web_contents_->GetController().GetLastCommittedEntry(); |
319 if (entry && entry->GetTitle().empty() && | 319 if (entry && entry->GetTitle().empty() && |
320 (entry->GetVirtualURL() == GURL(chrome::kChromeUINewTabURL) || | 320 (entry->GetVirtualURL() == GURL(chrome::kChromeUINewTabURL) || |
321 chrome::NavEntryIsInstantNTP(web_contents_, entry))) { | 321 search::NavEntryIsInstantNTP(web_contents_, entry))) { |
322 entry->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE)); | 322 entry->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE)); |
323 } | 323 } |
324 } | 324 } |
325 | 325 |
326 void SearchTabHelper::DidFinishLoad(content::RenderFrameHost* render_frame_host, | 326 void SearchTabHelper::DidFinishLoad(content::RenderFrameHost* render_frame_host, |
327 const GURL& /* validated_url */) { | 327 const GURL& /* validated_url */) { |
328 if (!render_frame_host->GetParent()) { | 328 if (!render_frame_host->GetParent()) { |
329 if (chrome::IsInstantNTP(web_contents_)) | 329 if (search::IsInstantNTP(web_contents_)) |
330 RecordNewTabLoadTime(web_contents_); | 330 RecordNewTabLoadTime(web_contents_); |
331 | 331 |
332 DetermineIfPageSupportsInstant(); | 332 DetermineIfPageSupportsInstant(); |
333 } | 333 } |
334 } | 334 } |
335 | 335 |
336 void SearchTabHelper::NavigationEntryCommitted( | 336 void SearchTabHelper::NavigationEntryCommitted( |
337 const content::LoadCommittedDetails& load_details) { | 337 const content::LoadCommittedDetails& load_details) { |
338 if (!is_search_enabled_) | 338 if (!is_search_enabled_) |
339 return; | 339 return; |
340 | 340 |
341 if (!load_details.is_main_frame) | 341 if (!load_details.is_main_frame) |
342 return; | 342 return; |
343 | 343 |
344 if (chrome::ShouldAssignURLToInstantRenderer(web_contents_->GetURL(), | 344 if (search::ShouldAssignURLToInstantRenderer(web_contents_->GetURL(), |
345 profile())) { | 345 profile())) { |
346 InstantService* instant_service = | 346 InstantService* instant_service = |
347 InstantServiceFactory::GetForProfile(profile()); | 347 InstantServiceFactory::GetForProfile(profile()); |
348 ipc_router_.SetOmniboxStartMargin(instant_service->omnibox_start_margin()); | 348 ipc_router_.SetOmniboxStartMargin(instant_service->omnibox_start_margin()); |
349 ipc_router_.SetDisplayInstantResults(); | 349 ipc_router_.SetDisplayInstantResults(); |
350 } | 350 } |
351 | 351 |
352 UpdateMode(true, false); | 352 UpdateMode(true, false); |
353 | 353 |
354 content::NavigationEntry* entry = | 354 content::NavigationEntry* entry = |
355 web_contents_->GetController().GetVisibleEntry(); | 355 web_contents_->GetController().GetVisibleEntry(); |
356 DCHECK(entry); | 356 DCHECK(entry); |
357 | 357 |
358 // Already determined the instant support state for this page, do not reset | 358 // Already determined the instant support state for this page, do not reset |
359 // the instant support state. | 359 // the instant support state. |
360 if (load_details.is_in_page) { | 360 if (load_details.is_in_page) { |
361 // When an "in-page" navigation happens, we will not receive a | 361 // When an "in-page" navigation happens, we will not receive a |
362 // DidFinishLoad() event. Therefore, we will not determine the Instant | 362 // DidFinishLoad() event. Therefore, we will not determine the Instant |
363 // support for the navigated page. So, copy over the Instant support from | 363 // support for the navigated page. So, copy over the Instant support from |
364 // the previous entry. If the page does not support Instant, update the | 364 // the previous entry. If the page does not support Instant, update the |
365 // location bar from here to turn off search terms replacement. | 365 // location bar from here to turn off search terms replacement. |
366 chrome::SetInstantSupportStateInNavigationEntry(model_.instant_support(), | 366 search::SetInstantSupportStateInNavigationEntry(model_.instant_support(), |
367 entry); | 367 entry); |
368 if (delegate_ && model_.instant_support() == INSTANT_SUPPORT_NO) | 368 if (delegate_ && model_.instant_support() == INSTANT_SUPPORT_NO) |
369 delegate_->OnWebContentsInstantSupportDisabled(web_contents_); | 369 delegate_->OnWebContentsInstantSupportDisabled(web_contents_); |
370 return; | 370 return; |
371 } | 371 } |
372 | 372 |
373 model_.SetInstantSupportState(INSTANT_SUPPORT_UNKNOWN); | 373 model_.SetInstantSupportState(INSTANT_SUPPORT_UNKNOWN); |
374 model_.SetVoiceSearchSupported(false); | 374 model_.SetVoiceSearchSupported(false); |
375 chrome::SetInstantSupportStateInNavigationEntry(model_.instant_support(), | 375 search::SetInstantSupportStateInNavigationEntry(model_.instant_support(), |
376 entry); | 376 entry); |
377 | 377 |
378 if (InInstantProcess(profile(), web_contents_)) | 378 if (InInstantProcess(profile(), web_contents_)) |
379 ipc_router_.OnNavigationEntryCommitted(); | 379 ipc_router_.OnNavigationEntryCommitted(); |
380 } | 380 } |
381 | 381 |
382 void SearchTabHelper::OnInstantSupportDetermined(bool supports_instant) { | 382 void SearchTabHelper::OnInstantSupportDetermined(bool supports_instant) { |
383 InstantSupportChanged(supports_instant); | 383 InstantSupportChanged(supports_instant); |
384 } | 384 } |
385 | 385 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 | 586 |
587 bool SearchTabHelper::IsInputInProgress() const { | 587 bool SearchTabHelper::IsInputInProgress() const { |
588 OmniboxView* omnibox = GetOmniboxView(); | 588 OmniboxView* omnibox = GetOmniboxView(); |
589 return !model_.mode().is_ntp() && omnibox && | 589 return !model_.mode().is_ntp() && omnibox && |
590 omnibox->model()->focus_state() == OMNIBOX_FOCUS_VISIBLE; | 590 omnibox->model()->focus_state() == OMNIBOX_FOCUS_VISIBLE; |
591 } | 591 } |
592 | 592 |
593 OmniboxView* SearchTabHelper::GetOmniboxView() const { | 593 OmniboxView* SearchTabHelper::GetOmniboxView() const { |
594 return delegate_ ? delegate_->GetOmniboxView() : NULL; | 594 return delegate_ ? delegate_->GetOmniboxView() : NULL; |
595 } | 595 } |
OLD | NEW |