12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/field_trial.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h" 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/browser_process.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile_manager.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service_factory.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/search_engines/ui_thread_search_terms_data.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/search/instant_search_prerenderer.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/search_urls.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/search/search.h" 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/sessions/serialized_navigation_entry.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h" 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h" 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_url_filter.h" 428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kPrefetchSearchResultsOnSRP[] = "prefetch_results_srp"; 496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kAllowPrefetchNonDefaultMatch[] = "allow_prefetch_non_default_match"; 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kPrerenderInstantUrlOnOmniboxFocus[] = 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "prerender_instant_url_on_omnibox_focus"; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kPrefetchSearchResultsFlagName[] = "prefetch_results"; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Controls whether to reuse prerendered Instant Search base page to commit any 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// search query. 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kReuseInstantSearchBasePage[] = "reuse_instant_search_base_page"; 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Controls whether to use the alternate Instant search base URL. This allows 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// experimentation of Instant search. 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kUseAltInstantURL[] = "use_alternate_instant_url"; 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kUseSearchPathForInstant[] = "use_search_path_for_instant"; 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kAltInstantURLPath[] = "search"; 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kAltInstantURLQueryParams[] = "&qbp=1"; 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kDisplaySearchButtonFlagName[] = "display_search_button"; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kOriginChipFlagName[] = "origin_chip"; 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_IOS) && !defined(OS_ANDROID) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kEnableQueryExtractionFlagName[] = "query_extraction"; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kShouldShowGoogleLocalNTPFlagName[] = "google_local_ntp"; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Status of the New Tab URL for the default Search provider. NOTE: Used in a 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// UMA histogram so values should only be added at the end and not reordered. 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum NewTabURLState { 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Valid URL that should be used. 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_VALID = 0, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Corrupt state (e.g. no profile or template url). 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_BAD = 1, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // URL should not be used because in incognito window. 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_INCOGNITO = 2, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // No New Tab URL set for provider. 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_NOT_SET = 3, 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // URL is not secure. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_INSECURE = 4, 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // URL should not be used because Suggest is disabled. 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Not used anymore, see crbug.com/340424. 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // NEW_TAB_URL_SUGGEST_OFF = 5, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // URL should not be used because it is blocked for a supervised user. 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_BLOCKED = 6, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_TAB_URL_MAX 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Used to set the Instant support state of the Navigation entry. 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kInstantSupportStateKey[] = "instant_support_state"; 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kInstantSupportEnabled[] = "Instant support enabled"; 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kInstantSupportDisabled[] = "Instant support disabled"; 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kInstantSupportUnknown[] = "Instant support unknown"; 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)InstantSupportState StringToInstantSupportState(const base::string16& value) { 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (value == base::ASCIIToUTF16(kInstantSupportEnabled)) 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return INSTANT_SUPPORT_YES; 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (value == base::ASCIIToUTF16(kInstantSupportDisabled)) 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return INSTANT_SUPPORT_NO; 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return INSTANT_SUPPORT_UNKNOWN; 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 InstantSupportStateToString(InstantSupportState state) { 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch switch (state) { 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case INSTANT_SUPPORT_NO: 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::ASCIIToUTF16(kInstantSupportDisabled); 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case INSTANT_SUPPORT_YES: 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::ASCIIToUTF16(kInstantSupportEnabled); 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case INSTANT_SUPPORT_UNKNOWN: 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::ASCIIToUTF16(kInstantSupportUnknown); 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::ASCIIToUTF16(kInstantSupportUnknown); 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TemplateURL* GetDefaultSearchProviderTemplateURL(Profile* profile) { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (profile) { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURLService* template_url_service = 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(profile); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (template_url_service) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return template_url_service->GetDefaultSearchProvider(); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL TemplateURLRefToGURL(const TemplateURLRef& ref, 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SearchTermsData& search_terms_data, 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool append_extra_query_params, 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool force_instant_results) { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLRef::SearchTermsArgs search_terms_args = 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TemplateURLRef::SearchTermsArgs(base::string16()); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch search_terms_args.append_extra_query_params = append_extra_query_params; 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_terms_args.force_instant_results = force_instant_results; 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GURL(ref.ReplaceSearchTerms(search_terms_args, search_terms_data)); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool MatchesAnySearchURL(const GURL& url, 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* template_url, 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SearchTermsData& search_terms_data) { 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL search_url = TemplateURLRefToGURL(template_url->url_ref(), 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) search_terms_data, false, false); 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (search_url.is_valid() && 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) search::MatchesOriginAndPath(url, search_url)) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "URLCount() - 1" because we already tested url_ref above. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < template_url->URLCount() - 1; ++i) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLRef ref(template_url, i); 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) search_url = TemplateURLRefToGURL(ref, search_terms_data, false, false); 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (search_url.is_valid() && 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) search::MatchesOriginAndPath(url, search_url)) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |url| should either have a secure scheme or have a non-HTTPS base URL that 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the user specified using --google-base-url. (This allows testers to use 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// --google-base-url to point at non-HTTPS servers, which eases testing.) 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsSuitableURLForInstant(const GURL& url, const TemplateURL* template_url) { 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return template_url->HasSearchTermsReplacementKey(url) && 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (url.SchemeIsSecure() || 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch google_util::StartsWithCommandLineGoogleBaseURL(url)); 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |url| can be used as an Instant URL for |profile|. 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsInstantURL(const GURL& url, Profile* profile) { 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsInstantExtendedAPIEnabled()) 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!url.is_valid()) 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GURL new_tab_url(GetNewTabPageURL(profile)); 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (new_tab_url.is_valid() && 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) search::MatchesOriginAndPath(url, new_tab_url)) 19558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return true; 19658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!template_url) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsSuitableURLForInstant(url, template_url)) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const TemplateURLRef& instant_url_ref = template_url->instant_url_ref(); 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UIThreadSearchTermsData search_terms_data(profile); 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const GURL instant_url = TemplateURLRefToGURL( 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) instant_url_ref, search_terms_data, false, false); 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!instant_url.is_valid()) 20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (search::MatchesOriginAndPath(url, instant_url)) 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return IsQueryExtractionEnabled() && 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MatchesAnySearchURL(url, template_url, search_terms_data); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 GetSearchTermsImpl(const content::WebContents* contents, 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const content::NavigationEntry* entry) { 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!contents || !IsQueryExtractionEnabled()) 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For security reasons, don't extract search terms if the page is not being 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // rendered in the privileged Instant renderer process. This is to protect 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // against a malicious page somehow scripting the search results page and 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // faking search terms in the URL. Random pages can't get into the Instant 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer and scripting doesn't work cross-process, so if the page is in 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the Instant process, we know it isn't being exploited. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (IsInstantExtendedAPIEnabled() && 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu !IsRenderedInInstantProcess(contents, profile) && 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ((entry == contents->GetController().GetLastCommittedEntry()) || 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ShouldAssignURLToInstantRenderer(entry->GetURL(), profile))) 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check to see if search terms have already been extracted. 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 search_terms = GetSearchTermsFromNavigationEntry(entry); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!search_terms.empty()) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return search_terms; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IsQueryExtractionAllowedForURL(profile, entry->GetVirtualURL())) 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Otherwise, extract from the URL. 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExtractSearchTermsFromURL(profile, entry->GetVirtualURL()); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool IsURLAllowedForSupervisedUser(const GURL& url, Profile* profile) { 2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService* supervised_user_service = 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(profile); 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserURLFilter* url_filter = 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service->GetURLFilterForUIThread(); 2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (url_filter->GetFilteringBehaviorForURL(url) == 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserURLFilter::BLOCK) { 2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns whether |new_tab_url| can be used as a URL for the New Tab page. 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// NEW_TAB_URL_VALID means a valid URL; other enum values imply an invalid URL. 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NewTabURLState IsValidNewTabURL(Profile* profile, const GURL& new_tab_url) { 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (profile->IsOffTheRecord()) 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NEW_TAB_URL_INCOGNITO; 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!new_tab_url.is_valid()) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NEW_TAB_URL_NOT_SET; 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!new_tab_url.SchemeIsSecure()) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NEW_TAB_URL_INSECURE; 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IsURLAllowedForSupervisedUser(new_tab_url, profile)) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NEW_TAB_URL_BLOCKED; 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NEW_TAB_URL_VALID; 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Used to look up the URL to use for the New Tab page. Also tracks how we 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// arrived at that URL so it can be logged with UMA. 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct NewTabURLDetails { 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabURLDetails(const GURL& url, NewTabURLState state) 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : url(url), state(state) {} 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static NewTabURLDetails ForProfile(Profile* profile) { 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL local_url(chrome::kChromeSearchLocalNtpUrl); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!profile || !template_url) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NewTabURLDetails(local_url, NEW_TAB_URL_BAD); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL search_provider_url = TemplateURLRefToGURL( 289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) template_url->new_tab_url_ref(), UIThreadSearchTermsData(profile), 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false, false); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabURLState state = IsValidNewTabURL(profile, search_provider_url); 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (state) { 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NEW_TAB_URL_VALID: 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We can use the search provider's page. 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NewTabURLDetails(search_provider_url, state); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NEW_TAB_URL_INCOGNITO: 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Incognito has its own New Tab. 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NewTabURLDetails(GURL(), state); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use the local New Tab otherwise. 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NewTabURLDetails(local_url, state); 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url; 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabURLState state; 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Negative start-margin values prevent the "es_sm" parameter from being used. 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kDisableStartMargin = -1; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string InstantExtendedEnabledParam(bool for_search) { 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (for_search && !chrome::IsQueryExtractionEnabled()) 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return std::string(); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return std::string(google_util::kInstantExtendedAPIParam) + "=" + 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Uint64ToString(EmbeddedSearchPageVersion()) + "&"; 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string ForceInstantResultsParam(bool for_prerender) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (for_prerender || !IsInstantExtendedAPIEnabled()) ? 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "ion=1&" : std::string(); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsQueryExtractionEnabled() { 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_IOS) || defined(OS_ANDROID) 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!IsInstantExtendedAPIEnabled()) 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const CommandLine* command_line = CommandLine::ForCurrentProcess(); 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (command_line->HasSwitch(switches::kEnableQueryExtraction)) 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldTrialFlags flags; 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kEnableQueryExtractionFlagName, false, flags); 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // defined(OS_IOS) || defined(OS_ANDROID) 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtractSearchTermsFromURL(Profile* profile, const GURL& url) { 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (url.is_valid() && url == GetSearchResultPrefetchBaseURL(profile)) { 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // InstantSearchPrerenderer has the search query for the Instant search base 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // page. 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InstantSearchPrerenderer* prerenderer = 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstantSearchPrerenderer::GetForProfile(profile); 349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(kmadhusu): Remove this CHECK after the investigation of 350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // crbug.com/367204. 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(prerenderer); 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prerenderer->get_last_query(); 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 search_terms; 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (template_url) 358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) template_url->ExtractSearchTermsFromURL( 359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url, UIThreadSearchTermsData(profile), &search_terms); 360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return search_terms; 361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsQueryExtractionAllowedForURL(Profile* profile, const GURL& url) { 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return template_url && IsSuitableURLForInstant(url, template_url); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 GetSearchTermsFromNavigationEntry( 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NavigationEntry* entry) { 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 search_terms; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->GetExtraData(sessions::kSearchTermsKey, &search_terms); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return search_terms; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 GetSearchTerms(const content::WebContents* contents) { 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!contents) 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NavigationEntry* entry = 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetController().GetVisibleEntry(); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry) 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (IsInstantExtendedAPIEnabled()) { 3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InstantSupportState state = 3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetInstantSupportStateFromNavigationEntry(*entry); 3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (state == INSTANT_SUPPORT_NO) 3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return base::string16(); 3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetSearchTermsImpl(contents, entry); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShouldAssignURLToInstantRenderer(const GURL& url, Profile* profile) { 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return url.is_valid() && 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile && 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IsInstantExtendedAPIEnabled() && 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (url.SchemeIs(chrome::kChromeSearchScheme) || 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsInstantURL(url, profile)); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IsRenderedInInstantProcess(const content::WebContents* contents, 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile* profile) { 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::RenderProcessHost* process_host = 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch contents->GetRenderProcessHost(); 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!process_host) 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const InstantService* instant_service = 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InstantServiceFactory::GetForProfile(profile); 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!instant_service) 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return instant_service->IsInstantProcess(process_host->GetID()); 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 418a3f7b4e666c476898878fa745f637129375cd889Ben Murdochbool ShouldUseProcessPerSiteForInstantURL(const GURL& url, Profile* profile) { 419a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return ShouldAssignURLToInstantRenderer(url, profile) && 420a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch (url.host() == chrome::kChromeSearchLocalNtpHost || 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.host() == chrome::kChromeSearchRemoteNtpHost); 422a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 423a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool IsNTPURL(const GURL& url, Profile* profile) { 425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!url.is_valid()) 426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 427a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!IsInstantExtendedAPIEnabled()) 429a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return url == GURL(chrome::kChromeUINewTabURL); 430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16 search_terms = ExtractSearchTermsFromURL(profile, url); 432a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return profile && 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ((IsInstantURL(url, profile) && search_terms.empty()) || 434a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) url == GURL(chrome::kChromeSearchLocalNtpUrl)); 435a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 436a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsInstantNTP(const content::WebContents* contents) { 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!contents) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NavEntryIsInstantNTP(contents, 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetController().GetVisibleEntry()); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NavEntryIsInstantNTP(const content::WebContents* contents, 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NavigationEntry* entry) { 44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!contents || !entry || !IsInstantExtendedAPIEnabled()) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!IsRenderedInInstantProcess(contents, profile)) 45258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 45358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (entry->GetURL() == GetLocalInstantURL(profile)) 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL new_tab_url(GetNewTabPageURL(profile)); 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new_tab_url.is_valid() && 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search::MatchesOriginAndPath(entry->GetURL(), new_tab_url); 460b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool IsSuggestPrefEnabled(Profile* profile) { 463b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return profile && !profile->IsOffTheRecord() && profile->GetPrefs() && 464b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) profile->GetPrefs()->GetBoolean(prefs::kSearchSuggestEnabled); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GURL GetInstantURL(Profile* profile, bool force_instant_results) { 4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsInstantExtendedAPIEnabled() || !IsSuggestPrefEnabled(profile)) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GURL(); 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); 4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!template_url) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL instant_url = TemplateURLRefToGURL( 476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) template_url->instant_url_ref(), UIThreadSearchTermsData(profile), 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true, force_instant_results); 4787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!instant_url.is_valid() || 4797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !template_url->HasSearchTermsReplacementKey(instant_url)) 4807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GURL(); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Extended mode requires HTTPS. Force it unless the base URL was overridden 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // on the command line, in which case we allow HTTP (see comments on 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // IsSuitableURLForInstant()). 4858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!instant_url.SchemeIsSecure() && 4868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) !google_util::StartsWithCommandLineGoogleBaseURL(instant_url)) { 4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL::Replacements replacements; 488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string secure_scheme(url::kHttpsScheme); 4898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) replacements.SetSchemeStr(secure_scheme); 4908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) instant_url = instant_url.ReplaceComponents(replacements); 4918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 4928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!IsURLAllowedForSupervisedUser(instant_url, profile)) 4948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return GURL(); 4958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (ShouldUseAltInstantURL()) { 4976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL::Replacements replacements; 4986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string path( 4996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ShouldUseSearchPathForInstant() ? kAltInstantURLPath : std::string()); 5006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!path.empty()) 5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) replacements.SetPathStr(path); 5026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string query( 5036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) instant_url.query() + std::string(kAltInstantURLQueryParams)); 5046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) replacements.SetQueryStr(query); 5056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) instant_url = instant_url.ReplaceComponents(replacements); 5066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return instant_url; 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Returns URLs associated with the default search engine for |profile|. 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::vector<GURL> GetSearchURLs(Profile* profile) { 5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<GURL> result; 5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); 5144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!template_url) 5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < template_url->URLCount(); ++i) { 5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TemplateURLRef ref(template_url, i); 518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result.push_back(TemplateURLRefToGURL(ref, UIThreadSearchTermsData(profile), 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false, false)); 5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL GetNewTabPageURL(Profile* profile) { 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NewTabURLDetails::ForProfile(profile).url; 5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GURL GetSearchResultPrefetchBaseURL(Profile* profile) { 5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return ShouldPrefetchSearchResults() ? GetInstantURL(profile, true) : GURL(); 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ShouldPrefetchSearchResults() { 533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!IsInstantExtendedAPIEnabled()) 534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kPrefetchSearchResults)) { 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FieldTrialFlags flags; 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kPrefetchSearchResultsFlagName, false, flags); 545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool ShouldAllowPrefetchNonDefaultMatch() { 5516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!ShouldPrefetchSearchResults()) 5526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 5536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FieldTrialFlags flags; 5556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 5566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAllowPrefetchNonDefaultMatch, false, flags); 5576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 5586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ShouldPrerenderInstantUrlOnOmniboxFocus() { 560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!ShouldPrefetchSearchResults()) 561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FieldTrialFlags flags; 564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kPrerenderInstantUrlOnOmniboxFocus, false, flags); 566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ShouldReuseInstantSearchBasePage() { 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ShouldPrefetchSearchResults()) 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 5732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch FieldTrialFlags flags; 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kReuseInstantSearchBasePage, false, flags); 576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 5792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 5802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GURL GetLocalInstantURL(Profile* profile) { 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GURL(chrome::kChromeSearchLocalNtpUrl); 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)DisplaySearchButtonConditions GetDisplaySearchButtonConditions() { 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CommandLine* cl = CommandLine::ForCurrentProcess(); 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cl->HasSwitch(switches::kDisableSearchButtonInOmnibox)) 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DISPLAY_SEARCH_BUTTON_NEVER; 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cl->HasSwitch(switches::kEnableSearchButtonInOmniboxForStr)) 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DISPLAY_SEARCH_BUTTON_FOR_STR; 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cl->HasSwitch(switches::kEnableSearchButtonInOmniboxForStrOrIip)) 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DISPLAY_SEARCH_BUTTON_FOR_STR_OR_IIP; 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cl->HasSwitch(switches::kEnableSearchButtonInOmniboxAlways)) 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DISPLAY_SEARCH_BUTTON_ALWAYS; 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FieldTrialFlags flags; 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!GetFieldTrialInfo(&flags)) 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return DISPLAY_SEARCH_BUTTON_NEVER; 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint64 value = 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetUInt64ValueForFlagWithDefault(kDisplaySearchButtonFlagName, 0, flags); 601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return (value < DISPLAY_SEARCH_BUTTON_NUM_VALUES) ? 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<DisplaySearchButtonConditions>(value) : 603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISPLAY_SEARCH_BUTTON_NEVER; 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ShouldDisplayOriginChip() { 607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetOriginChipCondition() != ORIGIN_CHIP_DISABLED; 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OriginChipCondition GetOriginChipCondition() { 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CommandLine* cl = CommandLine::ForCurrentProcess(); 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cl->HasSwitch(switches::kDisableOriginChip)) 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ORIGIN_CHIP_DISABLED; 614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (cl->HasSwitch(switches::kEnableOriginChipAlways)) 615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ORIGIN_CHIP_ALWAYS; 616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (cl->HasSwitch(switches::kEnableOriginChipOnSrp)) 617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ORIGIN_CHIP_ON_SRP; 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FieldTrialFlags flags; 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GetFieldTrialInfo(&flags)) 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ORIGIN_CHIP_DISABLED; 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 value = 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetUInt64ValueForFlagWithDefault(kOriginChipFlagName, 0, flags); 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (value < ORIGIN_CHIP_NUM_VALUES) ? 625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<OriginChipCondition>(value) : ORIGIN_CHIP_DISABLED; 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShouldShowGoogleLocalNTP() { 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrialFlags flags; 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !GetFieldTrialInfo(&flags) || GetBoolValueForFlagWithDefault( 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kShouldShowGoogleLocalNTPFlagName, true, flags); 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetEffectiveURLForInstant(const GURL& url, Profile* profile) { 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(ShouldAssignURLToInstantRenderer(url, profile)) 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << "Error granting Instant access."; 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 638a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (url.SchemeIs(chrome::kChromeSearchScheme)) 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return url; 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL effective_url(url); 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Replace the scheme with "chrome-search:". 6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Replacements<char> replacements; 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string search_scheme(chrome::kChromeSearchScheme); 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) replacements.SetScheme(search_scheme.data(), 6475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, search_scheme.length())); 648ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If this is the URL for a server-provided NTP, replace the host with 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // "remote-ntp". 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string remote_ntp_host(chrome::kChromeSearchRemoteNtpHost); 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabURLDetails details = NewTabURLDetails::ForProfile(profile); 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.state == NEW_TAB_URL_VALID && 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search::MatchesOriginAndPath(url, details.url)) { 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) replacements.SetHost(remote_ntp_host.c_str(), 6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, remote_ntp_host.length())); 657ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 658ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) effective_url = effective_url.ReplaceComponents(replacements); 660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return effective_url; 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool HandleNewTabURLRewrite(GURL* url, 66458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch content::BrowserContext* browser_context) { 66558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!IsInstantExtendedAPIEnabled()) 66658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 66758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!url->SchemeIs(content::kChromeUIScheme) || 66958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch url->host() != chrome::kChromeUINewTabHost) 67058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 67158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabURLDetails details(NewTabURLDetails::ForProfile(profile)); 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("NewTabPage.URLState", 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details.state, NEW_TAB_URL_MAX); 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.url.is_valid()) { 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *url = details.url; 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 68158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 68258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 68358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool HandleNewTabURLReverseRewrite(GURL* url, 68458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch content::BrowserContext* browser_context) { 68558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!IsInstantExtendedAPIEnabled()) 68658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 68758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Do nothing in incognito. 6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (profile && profile->IsOffTheRecord()) 69158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 69258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (search::MatchesOriginAndPath( 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(chrome::kChromeSearchLocalNtpUrl), *url)) { 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL new_tab_url(GetNewTabPageURL(profile)); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_tab_url.is_valid() && 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search::MatchesOriginAndPath(new_tab_url, *url)) { 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 70758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 70858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 709ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SetInstantSupportStateInNavigationEntry(InstantSupportState state, 710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::NavigationEntry* entry) { 711ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!entry) 712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 714ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch entry->SetExtraData(kInstantSupportStateKey, 715ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InstantSupportStateToString(state)); 716ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 717ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 718ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochInstantSupportState GetInstantSupportStateFromNavigationEntry( 719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const content::NavigationEntry& entry) { 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value; 721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!entry.GetExtraData(kInstantSupportStateKey, &value)) 722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return INSTANT_SUPPORT_UNKNOWN; 723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return StringToInstantSupportState(value); 725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 72658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 727424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool ShouldPrefetchSearchResultsOnSRP() { 728424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FieldTrialFlags flags; 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kPrefetchSearchResultsOnSRP, false, flags); 731424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 732424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void EnableQueryExtractionForTesting() { 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine* cl = CommandLine::ForCurrentProcess(); 735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cl->AppendSwitch(switches::kEnableQueryExtraction); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool ShouldUseAltInstantURL() { 7396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FieldTrialFlags flags; 7406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 7416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kUseAltInstantURL, false, flags); 7426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 7436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ShouldUseSearchPathForInstant() { 7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FieldTrialFlags flags; 7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetFieldTrialInfo(&flags) && GetBoolValueForFlagWithDefault( 7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kUseSearchPathForInstant, false, flags); 7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome 751