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

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

Issue 8203005: Implement chrome.experimental.downloads.onChanged (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: " Created 9 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/extensions/extension_downloads_api.cc
diff --git a/chrome/browser/extensions/extension_downloads_api.cc b/chrome/browser/extensions/extension_downloads_api.cc
index 2182b000fdcf62ef0ff1d153824ef259c545a0f2..a04138318917af4055b038adb10383d8e44f31a6 100644
--- a/chrome/browser/extensions/extension_downloads_api.cc
+++ b/chrome/browser/extensions/extension_downloads_api.cc
@@ -414,10 +414,9 @@ base::DictionaryValue* DownloadItemToJSON(DownloadItem* item) {
ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(
Profile* profile)
: profile_(profile),
- manager_(profile ? profile->GetDownloadManager() : NULL) {
+ manager_(profile ? profile->GetDownloadManager() : NULL),
+ delete_item_observers_(&item_observers_) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(profile_);
- DCHECK(manager_);
manager_->AddObserver(this);
}
@@ -426,6 +425,54 @@ ExtensionDownloadsEventRouter::~ExtensionDownloadsEventRouter() {
manager_->RemoveObserver(this);
}
+ExtensionDownloadsEventRouter::ItemObserver::ItemObserver(
+ const EventDispatcher& dispatcher, DownloadItem* item)
+ : dispatcher_(dispatcher),
+ item_(item),
+ json_(DownloadItemToJSON(item_)) {
+ item_->AddObserver(this);
+}
+
+ExtensionDownloadsEventRouter::ItemObserver::~ItemObserver() {
+ if (item_ != NULL)
+ item_->RemoveObserver(this);
+}
+
+void ExtensionDownloadsEventRouter::ItemObserver::OnDownloadUpdated(
Randy Smith (Not in Mondays) 2011/10/12 18:46:30 This amount of work on each DownloadItem updated s
benjhayden 2011/10/13 16:30:29 This isn't quite as much work as it looks like. Th
Randy Smith (Not in Mondays) 2011/10/13 23:42:59 Yep, that's what I meant.
benjhayden 2011/10/17 19:14:00 I just added a uma stat to count the number of OnD
Randy Smith (Not in Mondays) 2011/10/18 21:15:32 Sounds good; thanks.
+ DownloadItem* item) {
+ CHECK_EQ(item, item_);
+ if (item_->state() == DownloadItem::REMOVING)
+ return;
+ scoped_ptr<base::DictionaryValue> new_json(DownloadItemToJSON(item_));
+ base::DictionaryValue* delta = new base::DictionaryValue();
+ delta->SetInteger(constants::kIdKey, item_->id());
+ bool changed = false;
+ for (base::DictionaryValue::key_iterator key = new_json->begin_keys();
+ key != new_json->end_keys(); ++key) {
+ if (*key != constants::kBytesReceivedKey) {
+ base::Value* new_value = NULL;
+ base::Value* old_value = NULL;
+ if (new_json->Get(*key, &new_value) &&
+ (!json_->HasKey(*key) ||
+ (json_->Get(*key, &old_value) &&
+ !new_value->Equals(old_value)))) {
+ delta->Set(*key + ".old", (old_value ? old_value->DeepCopy()
+ : base::Value::CreateNullValue()));
+ delta->Set(*key + ".new", new_value->DeepCopy());
+ changed = true;
+ }
+ }
+ }
+ if (changed)
+ dispatcher_.Run(delta);
+ json_.swap(new_json);
+}
+
+void ExtensionDownloadsEventRouter::ItemObserver::OnDownloadOpened(
+ DownloadItem* item) {
+ CHECK_EQ(item, item_);
+}
+
void ExtensionDownloadsEventRouter::ModelChanged() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (manager_ == NULL)
@@ -461,11 +508,17 @@ void ExtensionDownloadsEventRouter::ModelChanged() {
iter != new_set.end(); ++iter) {
DispatchEvent(extension_event_names::kOnDownloadCreated,
DownloadItemToJSON(current_map[*iter]));
+ DCHECK(item_observers_.find(*iter) == item_observers_.end());
+ item_observers_[*iter] = new ItemObserver(base::Bind(
+ &ExtensionDownloadsEventRouter::DispatchEvent, base::Unretained(this),
+ extension_event_names::kOnDownloadChanged), current_map[*iter]);
}
for (DownloadIdSet::const_iterator iter = erased_set.begin();
iter != erased_set.end(); ++iter) {
DispatchEvent(extension_event_names::kOnDownloadErased,
base::Value::CreateIntegerValue(*iter));
+ delete item_observers_[*iter];
+ item_observers_.erase(*iter);
}
downloads_.swap(current_set);
}

Powered by Google App Engine
This is Rietveld 408576698