// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/search_engines/desktop_search_win.h" #include #include "base/memory/scoped_ptr.h" #include "base/prefs/pref_service.h" #include "base/strings/string_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/search_engines/prepopulated_engines.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_prepopulate_data.h" #include "net/base/url_util.h" namespace prefs { const char kWindowsDesktopSearchRedirectionPref[] = "windows_desktop_search_redirection"; } // namespace prefs const base::Feature kWindowsDesktopSearchRedirectionFeature = { "WindowsDesktopSearchRedirection", base::FEATURE_DISABLED_BY_DEFAULT }; void RegisterWindowsDesktopSearchRedirectionPref( user_prefs::PrefRegistrySyncable* registry) { registry->RegisterBooleanPref(prefs::kWindowsDesktopSearchRedirectionPref, false); } bool ShouldRedirectWindowsDesktopSearchToDefaultSearchEngine( PrefService* pref_service) { DCHECK(pref_service); return base::FeatureList::IsEnabled( kWindowsDesktopSearchRedirectionFeature) && pref_service->GetBoolean(prefs::kWindowsDesktopSearchRedirectionPref); } bool DetectWindowsDesktopSearch(const GURL& url, const SearchTermsData& search_terms_data, base::string16* search_terms) { DCHECK(search_terms); scoped_ptr template_url_data = TemplateURLPrepopulateData::MakeTemplateURLDataFromPrepopulatedEngine( TemplateURLPrepopulateData::bing); TemplateURL template_url(*template_url_data); if (!template_url.ExtractSearchTermsFromURL(url, search_terms_data, search_terms)) return false; // Query parameter that tells the source of a Bing search URL, and values // associated with Windows desktop search. const char kBingSourceQueryKey[] = "form"; const char kBingSourceDesktopText[] = "WNSGPH"; const char kBingSourceDesktopVoice[] = "WNSBOX"; for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { // Use a case-insensitive comparison because the key is sometimes in capital // letters. if (base::EqualsCaseInsensitiveASCII(it.GetKey(), kBingSourceQueryKey)) { const std::string source = it.GetValue(); if (source == kBingSourceDesktopText || source == kBingSourceDesktopVoice) return true; } } search_terms->clear(); return false; }