1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_SYNC_UTIL_EXTENSIONS_ACTIVITY_MONITOR_H_ 6#define CHROME_BROWSER_SYNC_UTIL_EXTENSIONS_ACTIVITY_MONITOR_H_ 7#pragma once 8 9#include <map> 10 11#include "base/message_loop.h" 12#include "base/synchronization/lock.h" 13#include "content/common/notification_observer.h" 14#include "content/common/notification_registrar.h" 15 16namespace browser_sync { 17 18// A class to monitor usage of extensions APIs to send to sync servers, with 19// the ability to purge data once sync servers have acknowledged it (successful 20// commit response). 21// 22// This can be used from any thread (it is a 'monitor' in the synchronization 23// sense as well), HOWEVER 24// 25// *** IT MUST BE DELETED FROM THE UI LOOP *** 26// 27// Consider using MessageLoop::DeleteSoon. (Yes, this means if you allocate 28// an ExtensionsActivityMonitor on a thread other than UI, you must 'new' it). 29class ExtensionsActivityMonitor : public NotificationObserver { 30 public: 31 // A data record of activity performed by extension |extension_id|. 32 struct Record { 33 Record() : bookmark_write_count(0U) {} 34 35 // The human-readable ID identifying the extension responsible 36 // for the activity reported in this Record. 37 std::string extension_id; 38 39 // How many times the extension successfully invoked a write 40 // operation through the bookmarks API since the last CommitMessage. 41 uint32 bookmark_write_count; 42 }; 43 44 typedef std::map<std::string, Record> Records; 45 46 // Creates an ExtensionsActivityMonitor to monitor extensions activities on 47 // BrowserThread::UI. 48 ExtensionsActivityMonitor(); 49 ~ExtensionsActivityMonitor(); 50 51 // Fills |buffer| with snapshot of current records in constant time by 52 // swapping. This is done mutually exclusively w.r.t methods of this class. 53 void GetAndClearRecords(Records* buffer); 54 55 // Add |records| piece-wise (by extension id) to the set of active records. 56 // This is done mutually exclusively w.r.t the methods of this class. 57 void PutRecords(const Records& records); 58 59 // NotificationObserver implementation. Called on |ui_loop_|. 60 virtual void Observe(NotificationType type, 61 const NotificationSource& source, 62 const NotificationDetails& details); 63 private: 64 Records records_; 65 mutable base::Lock records_lock_; 66 67 // Used only from UI loop. 68 NotificationRegistrar registrar_; 69}; 70 71} // namespace browser_sync 72 73#endif // CHROME_BROWSER_SYNC_UTIL_EXTENSIONS_ACTIVITY_MONITOR_H_ 74