Chromium Code Reviews| 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); |
| } |