Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(827)

Unified Diff: chrome/browser/sync/util/extensions_activity_monitor.cc

Issue 325001: Introduce browser_sync::ExtensionsActivityMonitor to collect extensions API u... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync/util/extensions_activity_monitor.cc
===================================================================
--- chrome/browser/sync/util/extensions_activity_monitor.cc (revision 0)
+++ chrome/browser/sync/util/extensions_activity_monitor.cc (revision 0)
@@ -0,0 +1,93 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sync/util/extensions_activity_monitor.h"
+
+#include "base/task.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/extensions/extension_bookmarks_module.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/notification_service.h"
+
+namespace browser_sync {
+
+namespace {
+// A helper task to register an ExtensionsActivityMonitor as an observer of
+// events on the UI thread (even though the monitor may live on another thread).
+// This liberates ExtensionsActivityMonitor from having to be ref counted.
+class RegistrationTask : public Task {
+ public:
+ RegistrationTask(ExtensionsActivityMonitor* monitor,
+ MessageLoop* ui_loop,
+ NotificationRegistrar* registrar)
+ : monitor_(monitor), ui_loop_(ui_loop), registrar_(registrar) {}
+ virtual ~RegistrationTask() {}
+
+ virtual void Run() {
+ DCHECK_EQ(MessageLoop::current(),
+ ChromeThread::GetMessageLoop(ChromeThread::UI));
+
+ // It would be nice if we could specify a Source for each specific function
+ // we wanted to observe, but the actual function objects are allocated on
+ // the fly so there is no reliable object to point to (same problem if we
+ // wanted to use the string name). Thus, we use all sources and filter in
+ // Observe.
+ registrar_->Add(monitor_, NotificationType::EXTENSION_BOOKMARKS_API_INVOKED,
+ NotificationService::AllSources());
+ }
+
+ private:
+ ExtensionsActivityMonitor* monitor_;
+ MessageLoop* const ui_loop_;
+ NotificationRegistrar* registrar_;
+ DISALLOW_COPY_AND_ASSIGN(RegistrationTask);
+};
+} // namespace
+
+ExtensionsActivityMonitor::ExtensionsActivityMonitor(MessageLoop* ui_loop)
+ : ui_loop_(ui_loop) {
+ ui_loop_->PostTask(FROM_HERE, new RegistrationTask(this, ui_loop,
+ &registrar_));
+}
+
+ExtensionsActivityMonitor::~ExtensionsActivityMonitor() {
+ DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ // The registrar calls RemoveAll in its dtor (which would happen in a moment)
+ // but explicitly call this so it is clear why we need to be on the ui_loop_.
+ registrar_.RemoveAll();
+}
+
+void ExtensionsActivityMonitor::GetAndClearRecords(Records* buffer) {
+ AutoLock lock(records_lock_);
+ buffer->clear();
+ buffer->swap(records_);
+}
+
+void ExtensionsActivityMonitor::PutRecords(const Records& records) {
+ AutoLock lock(records_lock_);
+ for (Records::const_iterator i = records.begin(); i != records.end(); ++i) {
+ records_[i->first].extension_id = i->second.extension_id;
+ records_[i->first].bookmark_write_count += i->second.bookmark_write_count;
+ }
+}
+
+void ExtensionsActivityMonitor::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ AutoLock lock(records_lock_);
+ DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ const Extension* extension = Source<const Extension>(source).ptr();
+ const BookmarksFunction* f = Details<const BookmarksFunction>(details).ptr();
+ if (f->name() == "bookmarks.update" ||
+ f->name() == "bookmarks.move" ||
+ f->name() == "bookmarks.create" ||
+ f->name() == "bookmarks.removeTree" ||
+ f->name() == "bookmarks.remove") {
+ Record& record = records_[extension->id()];
+ record.extension_id = extension->id();
+ record.bookmark_write_count++;
+ }
+}
+
+} // namespace browser_sync
Property changes on: chrome\browser\sync\util\extensions_activity_monitor.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698