Index: chrome/browser/safe_browsing/incident_reporting_service.h |
diff --git a/chrome/browser/safe_browsing/incident_reporting_service.h b/chrome/browser/safe_browsing/incident_reporting_service.h |
index e8260070786c4265d40c1a4dfd9063477b80af2b..f3174ed4906ff502f3533a4f3c2baf5d590a646d 100644 |
--- a/chrome/browser/safe_browsing/incident_reporting_service.h |
+++ b/chrome/browser/safe_browsing/incident_reporting_service.h |
@@ -7,6 +7,8 @@ |
#include <stdint.h> |
+#include <map> |
+ |
#include "base/compiler_specific.h" |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
@@ -18,7 +20,10 @@ |
#include "base/timer/timer.h" |
#include "chrome/browser/safe_browsing/add_incident_callback.h" |
#include "chrome/browser/safe_browsing/incident_report_uploader.h" |
+#include "content/public/browser/notification_observer.h" |
+#include "content/public/browser/notification_registrar.h" |
+class Profile; |
class SafeBrowsingDatabaseManager; |
class SafeBrowsingService; |
class TrackedPreferenceValidationDelegate; |
@@ -27,6 +32,11 @@ namespace base { |
class TaskRunner; |
} |
+namespace content { |
+class NotificationDetails; |
+class NotificationSource; |
+} |
+ |
namespace net { |
class URLRequestContextGetter; |
} |
@@ -41,29 +51,36 @@ class ClientIncidentReport_IncidentData; |
// A class that manages the collection of incidents and submission of incident |
// reports to the safe browsing client-side detection service. The service |
// begins operation when an incident is reported via the AddIncident method. |
-// Following this, the service collects environmental data and waits a bit. |
+// Incidents reported from a profile that is loading are held until the profile |
+// is fully created. Incidents originating from profiles that do not participate |
+// in safe browsing are dropped. Following the addition of an incident that is |
+// not dropped, the service collects environmental data and waits a bit. |
// Additional incidents that arrive during this time are collated with the |
// initial incident. Finally, already-reported incidents are pruned and any |
// remaining are uploaded in an incident report. |
-class IncidentReportingService { |
+class IncidentReportingService : public content::NotificationObserver { |
public: |
IncidentReportingService(SafeBrowsingService* safe_browsing_service, |
const scoped_refptr<net::URLRequestContextGetter>& |
request_context_getter); |
- virtual ~IncidentReportingService(); |
- // Enables or disables the service. When disabling, incident or data |
- // collection in progress is dropped. |
- void SetEnabled(bool enabled); |
+ // All incident collection, data collection, and uploads in progress are |
+ // dropped at destruction. |
+ virtual ~IncidentReportingService(); |
// Returns a callback by which external components can add an incident to the |
- // service. |
- AddIncidentCallback GetAddIncidentCallback(); |
+ // service on behalf of |profile|. The callback may outlive the service, but |
+ // will no longer have any effect after the service is deleted. The callback |
+ // must not be run after |profile| has been destroyed. |
+ AddIncidentCallback GetAddIncidentCallback(Profile* profile); |
// Returns a preference validation delegate that adds incidents to the service |
- // for validation failures. |
+ // for validation failures in |profile|. The delegate may outlive the service, |
+ // but incidents reported by it will no longer have any effect after the |
+ // service is deleted. The lifetime of the delegate should not extend beyond |
+ // that of the profile it services. |
scoped_ptr<TrackedPreferenceValidationDelegate> |
- CreatePreferenceValidationDelegate(); |
+ CreatePreferenceValidationDelegate(Profile* profile); |
protected: |
// A pointer to a function that populates a protobuf with environment data. |
@@ -77,6 +94,12 @@ class IncidentReportingService { |
CollectEnvironmentDataFn collect_environment_data_hook, |
const scoped_refptr<base::TaskRunner>& task_runner); |
+ // Handles the creation of a new profile. Creates a new context for |profile| |
+ // if one does not exist, and drops any received incidents for the profile if |
+ // the profile is not participating in safe browsing. Overridden by unit tests |
+ // to inject incidents prior to creation. |
+ virtual void OnProfileCreated(Profile* profile); |
+ |
// Initiates an upload. Overridden by unit tests to provide a fake uploader. |
virtual scoped_ptr<IncidentReportUploader> StartReportUpload( |
const IncidentReportUploader::OnResultCallback& callback, |
@@ -84,11 +107,26 @@ class IncidentReportingService { |
const ClientIncidentReport& report); |
private: |
+ struct ProfileContext; |
class UploadContext; |
+ // A mapping of profiles to contexts holding state about received incidents. |
+ typedef std::map<Profile*, ProfileContext*> ProfileContextCollection; |
+ |
+ // Returns the context for |profile|, creating it if it does not exist. |
+ ProfileContext* GetOrCreateProfileContext(Profile* profile); |
+ |
+ // Returns the context for |profile|, or NULL if it is unknown. |
+ ProfileContext* GetProfileContext(Profile* profile); |
+ |
+ // Handles the destruction of a profile. Incidents reported for the profile |
+ // but not yet uploaded are dropped. |
+ void OnProfileDestroyed(Profile* profile); |
+ |
// Adds |incident_data| to the service. The incident_time_msec field is |
// populated with the current time if the caller has not already done so. |
- void AddIncident(scoped_ptr<ClientIncidentReport_IncidentData> incident_data); |
+ void AddIncident(Profile* profile, |
+ scoped_ptr<ClientIncidentReport_IncidentData> incident_data); |
// Starts a task to collect environment data in the blocking pool. |
void BeginEnvironmentCollection(); |
@@ -122,7 +160,9 @@ class IncidentReportingService { |
// Prunes incidents that have previously been reported. |
void PruneReportedIncidents(ClientIncidentReport* report); |
- // Uploads an incident report if all data collection is complete. |
+ // Uploads an incident report if all data collection is complete. Incidents |
+ // originating from profiles that do not participate in safe browsing are |
+ // dropped. |
void UploadIfCollectionComplete(); |
// Cancels all uploads, discarding all reports and responses in progress. |
@@ -140,6 +180,11 @@ class IncidentReportingService { |
IncidentReportUploader::Result result, |
scoped_ptr<ClientIncidentResponse> response); |
+ // content::NotificationObserver methods. |
+ virtual void Observe(int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) OVERRIDE; |
+ |
base::ThreadChecker thread_checker_; |
// The safe browsing database manager, through which the whitelist killswitch |
@@ -160,8 +205,8 @@ class IncidentReportingService { |
// collection task at shutdown if it has not yet started. |
scoped_refptr<base::TaskRunner> environment_collection_task_runner_; |
- // True when the service has been enabled. |
- bool enabled_; |
+ // Registrar for observing profile lifecycle notifications. |
+ content::NotificationRegistrar notification_registrar_; |
// True when the asynchronous environment collection task has been fired off |
// but has not yet completed. |
@@ -189,6 +234,9 @@ class IncidentReportingService { |
// The time at which environmental data collection was initiated. |
base::TimeTicks environment_collection_begin_; |
+ // Context data for all on-the-record profiles. |
+ ProfileContextCollection profiles_; |
+ |
// The collection of uploads in progress. |
ScopedVector<UploadContext> uploads_; |