Index: chrome/browser/rlz/rlz.h |
=================================================================== |
--- chrome/browser/rlz/rlz.h (revision 98701) |
+++ chrome/browser/rlz/rlz.h (working copy) |
@@ -10,9 +10,15 @@ |
#if defined(OS_WIN) |
+#include <map> |
#include <string> |
#include "base/basictypes.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/singleton.h" |
+#include "base/task.h" |
+#include "content/common/notification_observer.h" |
+#include "content/common/notification_registrar.h" |
#include "rlz/win/lib/rlz_lib.h" |
// RLZ is a library which is used to measure distribution scenarios. |
@@ -25,18 +31,16 @@ |
// For partner or bundled installs, the RLZ might send more information |
// according to the terms disclosed in the EULA. |
-class RLZTracker { |
- |
+class RLZTracker : public NotificationObserver { |
public: |
- // Like InitRlz() this function initializes the RLZ library services for use |
- // in chrome. Besides binding the dll, it schedules a delayed task (delayed |
- // by |delay| seconds) that performs the ping and registers some events |
- // when 'first-run' is true. |
+ // Initializes the RLZ library services for use in chrome. Schedules a |
+ // delayed task (delayed by |delay| seconds) that performs the ping and |
+ // registers some events when 'first-run' is true. |
// |
- // If the chrome brand is organic (no partners) then the RLZ library is not |
- // loaded or initialized and the pings don't ocurr. |
+ // If the chrome brand is organic (no partners) then the pings don't occur. |
static bool InitRlzDelayed(bool first_run, int delay, |
- bool google_default_search); |
+ bool google_default_search, |
+ bool google_default_homepage); |
// Records an RLZ event. Some events can be access point independent. |
// Returns false it the event could not be recorded. Requires write access |
@@ -53,10 +57,108 @@ |
// Invoked during shutdown to clean up any state created by RLZTracker. |
static void CleanupRlz(); |
+ // This method is public for use by the Singleton class. |
+ static RLZTracker* GetInstance(); |
+ |
+ // The following methods are made protected so that they can be used for |
+ // testing purposes. Production code should never need to call these. |
+ protected: |
+ RLZTracker(); |
+ ~RLZTracker(); |
+ |
+ // This is a temporary constant used here until the home page change is |
+ // committed, which will happen before 2011-09-01. This constant will be |
+ // replaced with PageTransition::HOME_PAGE. |
+ static const int RLZ_PAGETRANSITION_HOME_PAGE = 0x02000000; |
+ |
+ // Thread function entry point, see ScheduleFinancialPing(). Assumes argument |
+ // is a pointer to an RLZTracker. |
+ static void _cdecl PingNow(void* tracker); |
+ |
+ // Performs initialization of RLZ tracker that is purposefully delayed so |
+ // that it does not interfere with chrome startup time. |
+ virtual void DelayedInit(); |
+ |
+ // NotificationObserver implementation: |
+ virtual void Observe(int type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) OVERRIDE; |
+ |
+ // Used by test code to override the default RLZTracker instance returned |
+ // by GetInstance(). |
+ void set_tracker(RLZTracker* tracker) { |
+ tracker_ = tracker; |
+ } |
+ |
private: |
- DISALLOW_IMPLICIT_CONSTRUCTORS(RLZTracker); |
+ friend struct DefaultSingletonTraits<RLZTracker>; |
+ friend class base::RefCountedThreadSafe<RLZTracker>; |
+ |
+ // Implementation called from InitRlzDelayed() static method. |
+ bool Init(bool first_run, int delay, bool google_default_search, |
+ bool google_default_homepage); |
+ |
+ // Implementation called from RecordProductEvent() static method. |
+ bool GetAccessPointRlzImpl(rlz_lib::AccessPoint point, std::wstring* rlz); |
+ |
+ // Schedules the delayed initialization. This method is virtual to allow |
+ // tests to override how the scheduling is done. |
+ virtual void ScheduleDelayedInit(int delay); |
+ |
+ // Schedules a call to rlz_lib::SendFinancialPing(). This method is virtual |
+ // to allow tests to override how the scheduling is done. |
+ virtual void ScheduleFinancialPing(); |
+ |
+ // Schedules a call to GetAccessPointRlz() on the I/O thread if the current |
+ // thread is not already the I/O thread, otherwise does nothing. Returns |
+ // true if the call was scheduled, and false otherwise. This method is |
+ // virtual to allow tests to override how the scheduling is done. |
+ virtual bool ScheduleGetAccessPointRlz(rlz_lib::AccessPoint point); |
+ |
+ // Sends the financial ping to the RLZ servers and invalidates the RLZ string |
+ // cache since the response from the RLZ server may have changed then. |
+ void PingNowImpl(); |
+ |
+ // Sends the financial ping to the RLZ servers. This method is virtual to |
+ // allow tests to override. |
+ virtual bool SendFinancialPing(const std::wstring& brand, |
+ const std::wstring& lang, |
+ const std::wstring& referral, |
+ bool exclude_id); |
+ |
+ // Tracker used for testing purposes only. If this value is non-NULL, it |
+ // will be returned from GetInstance() instead of the regular singleton. |
+ static RLZTracker* tracker_; |
+ |
+ // Configuation data for RLZ tracker. Set by call to Init(). |
+ bool first_run_; |
+ bool send_ping_immediately_; |
+ bool google_default_search_; |
+ bool google_default_homepage_; |
+ |
+ // Keeps track if the RLZ tracker has already performed its delayed |
+ // initialization. |
+ bool already_ran_; |
+ |
+ // Keeps a cache of RLZ access point strings, since they rarely change. |
+ // The cache must be protected by a lock since it may be accessed from |
+ // the UI thread for reading and the IO thread for reading and/or writing. |
+ base::Lock cache_lock_; |
+ std::map<rlz_lib::AccessPoint, std::wstring> rlz_cache_; |
+ |
+ // Keeps track of whether the omnibox or host page have been used. |
+ bool omnibox_used_; |
+ bool homepage_used_; |
+ |
+ NotificationRegistrar registrar_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RLZTracker); |
}; |
+// The RLZTracker is a singleton object that outlives any runnable tasks |
+// that will be queued up. |
+DISABLE_RUNNABLE_METHOD_REFCOUNT(RLZTracker); |
+ |
#endif // defined(OS_WIN) |
#endif // CHROME_BROWSER_RLZ_RLZ_H_ |