1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_brand.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_profile_helper.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/omnibox/omnibox_field_trial.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/glue/device_info.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h"
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h"
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_RLZ)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/rlz/rlz.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string* UIThreadSearchTermsData::google_base_url_ = NULL;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UIThreadSearchTermsData::UIThreadSearchTermsData(Profile* profile)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile) {
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::CurrentlyOn(BrowserThread::UI));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string UIThreadSearchTermsData::GoogleBaseURLValue() const {
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::CurrentlyOn(BrowserThread::UI));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (google_base_url_)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *google_base_url_;
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GURL base_url(google_util::CommandLineGoogleBaseURL());
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (base_url.is_valid())
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return base_url.spec();
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return profile_ ?
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      google_profile_helper::GetGoogleHomePageURL(profile_).spec() :
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchTermsData::GoogleBaseURLValue();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string UIThreadSearchTermsData::GetApplicationLocale() const {
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::CurrentlyOn(BrowserThread::UI));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_browser_process->GetApplicationLocale();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Android implementations are in ui_thread_search_terms_data_android.cc.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID)
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::string16 UIThreadSearchTermsData::GetRlzParameterValue(
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool from_app_list) const {
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::CurrentlyOn(BrowserThread::UI));
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 rlz_string;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For organic brandcodes do not use rlz at all. Empty brandcode usually
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // means a chromium install. This is ok.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string brand;
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (google_brand::GetBrand(&brand) && !brand.empty() &&
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      !google_brand::IsOrganic(brand)) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This call will return false the first time(s) it is called until the
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // value has been cached. This normally would mean that at most one omnibox
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // search might not send the RLZ data but this is not really a problem.
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    rlz_lib::AccessPoint access_point = RLZTracker::ChromeOmnibox();
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(OS_IOS)
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (from_app_list)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      access_point = RLZTracker::ChromeAppList();
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RLZTracker::GetAccessPointRlz(access_point, &rlz_string);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rlz_string;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We can enable this on non-Android if other platforms ever want a non-empty
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// search client string.  There is already a unit test in place for Android
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// called TemplateURLTest::SearchClient.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string UIThreadSearchTermsData::GetSearchClient() const {
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::CurrentlyOn(BrowserThread::UI));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::string();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string UIThreadSearchTermsData::GetSuggestClient() const {
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BrowserThread::CurrentlyOn(BrowserThread::UI));
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_pb::SyncEnums::DeviceType device_type =
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_sync::DeviceInfo::GetLocalDeviceType();
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return device_type == sync_pb::SyncEnums_DeviceType_TYPE_PHONE ?
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "chrome" : "chrome-omni";
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return chrome::IsInstantExtendedAPIEnabled() ? "chrome-omni" : "chrome";
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string UIThreadSearchTermsData::GetSuggestRequestIdentifier() const {
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserThread::CurrentlyOn(BrowserThread::UI));
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_pb::SyncEnums::DeviceType device_type =
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_sync::DeviceInfo::GetLocalDeviceType();
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (device_type == sync_pb::SyncEnums_DeviceType_TYPE_PHONE) {
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return OmniboxFieldTrial::EnableAnswersInSuggest() ?
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "chrome-mobile-ext-ansg" : "chrome-mobile-ext";
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return "chrome-ext";
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return "chrome-ext";
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string UIThreadSearchTermsData::NTPIsThemedParam() const {
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         BrowserThread::CurrentlyOn(BrowserThread::UI));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_THEMES)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!chrome::IsInstantExtendedAPIEnabled())
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return std::string();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(dhollowa): Determine fraction of custom themes that don't affect the
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NTP background and/or color.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile_);
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // NTP is considered themed if the theme is not default and not native (GTK+).
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (theme_service && !theme_service->UsingDefaultTheme() &&
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      !theme_service->UsingSystemTheme())
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "es_th=1&";
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(ENABLE_THEMES)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::string();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// It's acutally OK to call this method on any thread, but it's currently placed
1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// in UIThreadSearchTermsData since SearchTermsData cannot depend on
1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// VersionInfo.
1506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string UIThreadSearchTermsData::GoogleImageSearchSource() const {
1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  chrome::VersionInfo version_info;
1526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (version_info.is_valid()) {
1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    std::string version(version_info.Name() + " " + version_info.Version());
1546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (version_info.IsOfficialBuild())
1556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      version += " (Official)";
1566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    version += " " + version_info.OSType();
1576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    std::string modifier(version_info.GetVersionStringModifier());
1586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (!modifier.empty())
1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      version += " " + modifier;
1606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return version;
1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return "unknown";
1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UIThreadSearchTermsData::SetGoogleBaseURL(const std::string& base_url) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete google_base_url_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  google_base_url_ = base_url.empty() ? NULL : new std::string(base_url);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
170