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