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