15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_RLZ_RLZ_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_RLZ_RLZ_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_RLZ)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/rlz_lib.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequestContextGetter;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RLZ is a library which is used to measure distribution scenarios.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Its job is to record certain lifetime events in the registry and to send
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them encoded as a compact string at most twice. The sent data does
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not contain information that can be used to identify a user or to infer
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browsing habits. The API in this file is a wrapper around the open source
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RLZ library which can be found at http://code.google.com/p/rlz.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For partner or bundled installs, the RLZ might send more information
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to the terms disclosed in the EULA.
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class RLZTracker : public content::NotificationObserver {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initializes the RLZ library services for use in chrome. Schedules a delayed
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // task that performs the ping and registers some events when 'first-run' is
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // true.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When |send_ping_immediately| is true, a financial ping should be sent
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately after a first search is recorded, without waiting for |delay|.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // However, we only want this behaviour on first run.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the chrome brand is organic (no partners) then the pings don't occur.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool InitRlzFromProfileDelayed(Profile* profile,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool first_run,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool send_ping_immediately,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        base::TimeDelta delay);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records an RLZ event. Some events can be access point independent.
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Returns false it the event could not be recorded. Requires write access
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // to the HKCU registry hive on windows.
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static bool RecordProductEvent(rlz_lib::Product product,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 rlz_lib::AccessPoint point,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 rlz_lib::Event event_id);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For the point parameter of RecordProductEvent.
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static rlz_lib::AccessPoint ChromeOmnibox();
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(OS_IOS)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static rlz_lib::AccessPoint ChromeHomePage();
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static rlz_lib::AccessPoint ChromeAppList();
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the HTTP header value that can be added to requests from the
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specific access point.  The string returned is of the form:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    "X-Rlz-String: <access-point-rlz>\r\n"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string GetAccessPointHttpHeader(rlz_lib::AccessPoint point);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the RLZ value of the access point.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the rlz string could not be obtained. In some cases
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an empty string can be returned which is not an error.
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static bool GetAccessPointRlz(rlz_lib::AccessPoint point,
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                base::string16* rlz);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked during shutdown to clean up any state created by RLZTracker.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CleanupRlz();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears all product state. Should be called when turning RLZ off. On other
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platforms, this is done by product uninstaller.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void ClearRlzState();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method is public for use by the Singleton class.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static RLZTracker* GetInstance();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enables zero delay for InitRlzFromProfileDelayed. For testing only.
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void EnableZeroDelayForTesting();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(OS_IOS)
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Records that the app list search has been used.
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static void RecordAppListSearch();
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The following methods are made protected so that they can be used for
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // testing purposes. Production code should never need to call these.
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected:
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RLZTracker();
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~RLZTracker();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by InitRlzFromProfileDelayed with values taken from |profile|.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool InitRlzDelayed(bool first_run,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             bool send_ping_immediately,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::TimeDelta delay,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             bool is_google_default_search,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             bool is_google_homepage,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             bool is_google_in_startpages);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Performs initialization of RLZ tracker that is purposefully delayed so
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // that it does not interfere with chrome startup time.
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void DelayedInit();
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // content::NotificationObserver implementation:
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void Observe(int type,
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       const content::NotificationSource& source,
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Used by test code to override the default RLZTracker instance returned
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // by GetInstance().
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void set_tracker(RLZTracker* tracker) {
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    tracker_ = tracker;
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends the financial ping to the RLZ servers and invalidates the RLZ string
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache since the response from the RLZ server may have changed then.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protected so that its accessible from tests.
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void PingNowImpl();
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  friend struct DefaultSingletonTraits<RLZTracker>;
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  friend class base::RefCountedThreadSafe<RLZTracker>;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation called from InitRlzDelayed() static method.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(bool first_run,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            bool send_ping_immediately,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::TimeDelta delay,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bool google_default_search,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bool google_default_homepage,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bool is_google_in_startpages);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Implementation called from RecordProductEvent() static method.
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool RecordProductEventImpl(rlz_lib::Product product,
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              rlz_lib::AccessPoint point,
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              rlz_lib::Event event_id);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Records FIRST_SEARCH event. Called from Observe() on blocking task runner.
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void RecordFirstSearch(rlz_lib::AccessPoint point);
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Implementation called from GetAccessPointRlz() static method.
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool GetAccessPointRlzImpl(rlz_lib::AccessPoint point, base::string16* rlz);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules the delayed initialization. This method is virtual to allow
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tests to override how the scheduling is done.
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ScheduleDelayedInit(base::TimeDelta delay);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Schedules a call to rlz_lib::RecordProductEvent(). This method is virtual
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to allow tests to override how the scheduling is done.
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool ScheduleRecordProductEvent(rlz_lib::Product product,
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                          rlz_lib::AccessPoint point,
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                          rlz_lib::Event event_id);
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Schedules a call to rlz_lib::RecordFirstSearch(). This method is virtual
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to allow tests to override how the scheduling is done.
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool ScheduleRecordFirstSearch(rlz_lib::AccessPoint point);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules a call to rlz_lib::SendFinancialPing(). This method is virtual
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow tests to override how the scheduling is done.
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ScheduleFinancialPing();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules a call to GetAccessPointRlz() on the I/O thread if the current
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread is not already the I/O thread, otherwise does nothing. Returns
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true if the call was scheduled, and false otherwise. This method is
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // virtual to allow tests to override how the scheduling is done.
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool ScheduleGetAccessPointRlz(rlz_lib::AccessPoint point);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Sends the financial ping to the RLZ servers. This method is virtual to
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // allow tests to override.
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool SendFinancialPing(const std::string& brand,
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 const base::string16& lang,
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 const base::string16& referral);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Implementation called from ClearRlzState static method.
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ClearRlzStateImpl();
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Schedules a call to ClearRlzStateImpl(). This method is virtual
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // to allow tests to override how the scheduling is done.
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool ScheduleClearRlzState();
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns a pointer to the bool corresponding to whether |point| has been
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // used but not reported.
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool* GetAccessPointRecord(rlz_lib::AccessPoint point);
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Tracker used for testing purposes only. If this value is non-NULL, it
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // will be returned from GetInstance() instead of the regular singleton.
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static RLZTracker* tracker_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configuation data for RLZ tracker. Set by call to Init().
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool first_run_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool send_ping_immediately_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_google_default_search_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_google_homepage_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_google_in_startpages_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unique sequence token so that tasks posted by RLZTracker are executed
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sequentially in the blocking pool.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SequencedWorkerPool::SequenceToken worker_pool_token_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track if the RLZ tracker has already performed its delayed
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialization.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool already_ran_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Keeps a cache of RLZ access point strings, since they rarely change.
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The cache must be protected by a lock since it may be accessed from
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // the UI thread for reading and the IO thread for reading and/or writing.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock cache_lock_;
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::map<rlz_lib::AccessPoint, base::string16> rlz_cache_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Keeps track of whether the omnibox, home page or app list have been used.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool omnibox_used_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool homepage_used_;
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool app_list_used_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Main and (optionally) reactivation brand codes, assigned on UI thread.
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string brand_;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string reactivation_brand_;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Minimum delay before sending financial ping after initialization.
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta min_init_delay_;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RLZTracker);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(ENABLE_RLZ)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_RLZ_RLZ_H_
247