172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/search_terms_data.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_process.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/google/google_url_tracker.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/rlz/rlz.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/installer/util/google_update_settings.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSearchTermsData::SearchTermsData() {
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSearchTermsData::~SearchTermsData() {
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::string SearchTermsData::GoogleBaseSuggestURLValue() const {
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The suggest base URL we want at the end is something like
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // "http://clients1.google.TLD/complete/".  The key bit we want from the
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // original Google base URL is the TLD.
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Start with the Google base URL.
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const GURL base_url(GoogleBaseURLValue());
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(base_url.is_valid());
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Change "www." to "clients1." in the hostname.  If no "www." was found, just
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // prepend "clients1.".
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string base_host(base_url.host());
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL::Replacements repl;
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string suggest_host("clients1." +
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      (base_host.compare(0, 4, "www.") ? base_host : base_host.substr(4)));
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  repl.SetHostStr(suggest_host);
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Replace any existing path with "/complete/".
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static const std::string suggest_path("/complete/");
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  repl.SetPathStr(suggest_path);
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Clear the query and ref.
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  repl.ClearQuery();
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  repl.ClearRef();
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return base_url.ReplaceComponents(repl).spec();
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::string* UIThreadSearchTermsData::google_base_url_ = NULL;
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenUIThreadSearchTermsData::UIThreadSearchTermsData() {
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // GoogleURLTracker::GoogleURL() DCHECKs this also, but adding it here helps
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // us catch bad behavior at a more common place in this code.
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!BrowserThread::IsWellKnownThread(BrowserThread::UI) ||
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         BrowserThread::CurrentlyOn(BrowserThread::UI));
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::string UIThreadSearchTermsData::GoogleBaseURLValue() const {
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!BrowserThread::IsWellKnownThread(BrowserThread::UI) ||
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         BrowserThread::CurrentlyOn(BrowserThread::UI));
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return google_base_url_ ?
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    (*google_base_url_) : GoogleURLTracker::GoogleURL().spec();
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::string UIThreadSearchTermsData::GetApplicationLocale() const {
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!BrowserThread::IsWellKnownThread(BrowserThread::UI) ||
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         BrowserThread::CurrentlyOn(BrowserThread::UI));
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return g_browser_process->GetApplicationLocale();
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 UIThreadSearchTermsData::GetRlzParameterValue() const {
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!BrowserThread::IsWellKnownThread(BrowserThread::UI) ||
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         BrowserThread::CurrentlyOn(BrowserThread::UI));
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 rlz_string;
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // For organic brandcodes do not use rlz at all. Empty brandcode usually
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // means a chromium install. This is ok.
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 brand;
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (GoogleUpdateSettings::GetBrand(&brand) && !brand.empty() &&
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      !GoogleUpdateSettings::IsOrganic(brand)) {
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // This call will return false the first time(s) it is called until the
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // value has been cached. This normally would mean that at most one omnibox
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // search might not send the RLZ data but this is not really a problem.
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    RLZTracker::GetAccessPointRlz(rlz_lib::CHROME_OMNIBOX, &rlz_string);
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return rlz_string;
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid UIThreadSearchTermsData::SetGoogleBaseURL(std::string* google_base_url) {
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete google_base_url_;
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  google_base_url_ = google_base_url;
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
98