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