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

Unified Diff: chrome/browser/extensions/system_info_event_router.cc

Issue 11419279: Implement systemInfo.storage.onChanged event (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: refine browser test and code comments Created 8 years 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/extensions/system_info_event_router.cc
diff --git a/chrome/browser/extensions/system_info_event_router.cc b/chrome/browser/extensions/system_info_event_router.cc
index f6dc20a1bcdbf7c01eb9c9a815c88cdb10aadfcc..a63a98e3c3b3676266f5651f9e3c56754cc8333b 100644
--- a/chrome/browser/extensions/system_info_event_router.cc
+++ b/chrome/browser/extensions/system_info_event_router.cc
@@ -6,6 +6,9 @@
#include "base/bind.h"
#include "base/memory/scoped_ptr.h"
+#include "base/stl_util.h"
+#include "base/string_number_conversions.h"
+#include "base/string_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/event_router_forwarder.h"
#include "chrome/browser/extensions/event_names.h"
@@ -23,9 +26,13 @@ using content::BrowserThread;
namespace {
-const char kSystemInfoEventPrefix[] = "experimental.systemInfo";
-const char kStorageEventPrefix[] = "experimental.systemInfo.storage";
+const char kEventDelimiter[] = "#";
+
const char kCpuEventPrefix[] = "experimental.systemInfo.cpu";
+const char kStorageEventPrefix[] = "experimental.systemInfo.storage";
+const char kSystemInfoEventPrefix[] = "experimental.systemInfo";
+
+const int kDefaultThresholdBytes = 4096;
static bool IsStorageEvent(const std::string& event_name) {
return event_name.compare(0, strlen(kStorageEventPrefix),
@@ -36,6 +43,37 @@ static bool IsCpuEvent(const std::string& event_name) {
return event_name.compare(0, strlen(kCpuEventPrefix), kCpuEventPrefix) == 0;
}
+// Marshal the storage event name with the extra parameters. Returns the
+// marshalled event name with the following format:
+// event_names::kOnStorageChanged#<id>#threshold
+std::string GetMarshalledStorageEventName(const std::string& id,
+ int threshold) {
+ std::string event_name(event_names::kOnStorageChanged);
+ event_name += kEventDelimiter + id;
+ event_name += kEventDelimiter + base::IntToString(threshold);
+ return event_name;
+}
+
+// Unmarshall the event name to extract the storage id and the change
+// threshold value. The |storage_id| and |threshold| parameters hold
+// the results respectively.
+void UnmarshallStorageEventName(const std::string& event_name,
+ std::string* id,
+ int* threshold) {
+ std::vector<std::string> parts;
+ size_t num = Tokenize(event_name, std::string(kEventDelimiter), &parts);
+ DCHECK(num == 3u);
+ DCHECK(parts[0] == event_names::kOnStorageChanged);
+
+ *id = parts[1];
+ *threshold = 0;
+ bool result = base::StringToInt(parts[2], threshold);
+ DCHECK(result);
+
+ if (!result)
+ *threshold = kDefaultThresholdBytes;
+}
+
} // namespace
// static
@@ -44,23 +82,27 @@ SystemInfoEventRouter* SystemInfoEventRouter::GetInstance() {
}
SystemInfoEventRouter::SystemInfoEventRouter() {
+ StorageInfoProvider::Get()->AddObserver(this);
}
SystemInfoEventRouter::~SystemInfoEventRouter() {
+ StorageInfoProvider::Get()->RemoveObserver(this);
}
void SystemInfoEventRouter::AddEventListener(const std::string& event_name) {
- watching_event_set_.insert(event_name);
- if (watching_event_set_.count(event_name) > 1)
- return;
- // Start watching the |event_name| event if the first event listener arrives.
- // For systemInfo.storage event.
if (IsStorageEvent(event_name)) {
- // TODO (hongbo): Start watching storage device information via calling
- // SystemMonitor::StartWatchingStorage.
+ std::string storage_id;
+ int threshold = 0;
+ UnmarshallStorageEventName(event_name, &storage_id, &threshold);
+ // StorageInfoProvider can handle the duplicated storage to be watched.
+ StorageInfoProvider::Get()->StartWatching(storage_id, threshold);
return;
}
+ watching_event_set_.insert(event_name);
+ if (watching_event_set_.count(event_name) > 1)
+ return;
+
// For systemInfo.cpu event.
if (IsCpuEvent(event_name)) {
CpuInfoProvider::Get()->StartSampling(
@@ -70,19 +112,21 @@ void SystemInfoEventRouter::AddEventListener(const std::string& event_name) {
}
}
-void SystemInfoEventRouter::RemoveEventListener(
- const std::string& event_name) {
+void SystemInfoEventRouter::RemoveEventListener(const std::string& event_name) {
+ if (IsStorageEvent(event_name)) {
+ std::string storage_id;
+ int threshold = 0;
+ UnmarshallStorageEventName(event_name, &storage_id, &threshold);
+ StorageInfoProvider::Get()->StopWatching(storage_id, threshold);
+ return;
+ }
+
watching_event_set_.erase(event_name);
if (watching_event_set_.count(event_name) > 0)
return;
// In case of the last event listener is removed, we need to stop watching
// it to avoid unnecessary overhead.
- if (IsStorageEvent(event_name)) {
- // TODO(hongbo): Stop watching storage device information via calling
- // SystemMonitor::StopWatchingStorage.
- return;
- }
if (IsCpuEvent(event_name)) {
CpuInfoProvider::Get()->StopSampling();
}
@@ -94,24 +138,29 @@ bool SystemInfoEventRouter::IsSystemInfoEvent(const std::string& event_name) {
return event_name.compare(0, prefix.size(), prefix) == 0;
}
-void SystemInfoEventRouter::OnStorageAvailableCapacityChanged(
- const std::string& id, int64 available_capacity) {
+void SystemInfoEventRouter::OnStorageFreeSpaceChanged(const std::string& id,
+ double old_value,
+ double new_value,
+ int threshold) {
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&SystemInfoEventRouter::OnStorageAvailableCapacityChanged,
- base::Unretained(this), id, available_capacity));
+ base::Bind(&SystemInfoEventRouter::OnStorageFreeSpaceChanged,
+ base::Unretained(this),
+ id, old_value, new_value, threshold));
return;
}
// We are on the UI thread now.
StorageChangeInfo info;
info.id = id;
- info.available_capacity = static_cast<double>(available_capacity);
-
+ info.available_capacity = new_value;
scoped_ptr<base::ListValue> args(new base::ListValue());
args->Append(info.ToValue().release());
- DispatchEvent(event_names::kOnStorageAvailableCapacityChanged, args.Pass());
+ std::string event_name =
+ GetMarshalledStorageEventName(id, threshold);
+
+ DispatchEvent(event_name, args.Pass());
}
void SystemInfoEventRouter::OnRemovableStorageAttached(const std::string& id,

Powered by Google App Engine
This is Rietveld 408576698