| Index: chrome/browser/download/download_manager.cc | 
| diff --git a/chrome/browser/download/download_manager.cc b/chrome/browser/download/download_manager.cc | 
| index 268c417f62f51ab2bfbf168f04368c2ea785e2e7..7200ba8062f3c760cb7121b85749ec43dd216075 100644 | 
| --- a/chrome/browser/download/download_manager.cc | 
| +++ b/chrome/browser/download/download_manager.cc | 
| @@ -116,6 +116,7 @@ void DownloadManager::Shutdown() { | 
|  | 
| // And clear all non-owning containers. | 
| in_progress_.clear(); | 
| +  active_downloads_.clear(); | 
| #if !defined(NDEBUG) | 
| save_page_as_downloads_.clear(); | 
| #endif | 
| @@ -423,7 +424,9 @@ void DownloadManager::CreateDownloadItem(DownloadCreateInfo* info) { | 
| DownloadItem* download = new DownloadItem(this, *info, | 
| profile_->IsOffTheRecord()); | 
| DCHECK(!ContainsKey(in_progress_, info->download_id)); | 
| +  DCHECK(!ContainsKey(active_downloads_, info->download_id)); | 
| downloads_.insert(download); | 
| +  active_downloads_[info->download_id] = download; | 
| } | 
|  | 
| void DownloadManager::AttachDownloadItem(DownloadCreateInfo* info, | 
| @@ -433,22 +436,14 @@ void DownloadManager::AttachDownloadItem(DownloadCreateInfo* info, | 
| scoped_ptr<DownloadCreateInfo> infop(info); | 
| info->path = target_path; | 
|  | 
| -  // NOTE(ahendrickson) We will be adding a new map |active_downloads_|, into | 
| -  // which we will be adding the download as soon as it's created.  This will | 
| -  // make this loop unnecessary. | 
| -  // Eventually |active_downloads_| will replace |in_progress_|, but we don't | 
| -  // want to change the semantics yet. | 
| +  // NOTE(ahendrickson) Eventually |active_downloads_| will replace | 
| +  // |in_progress_|, but we don't want to change the semantics yet. | 
| DCHECK(!ContainsKey(in_progress_, info->download_id)); | 
| -  DownloadItem* download = NULL; | 
| -  for (std::set<DownloadItem*>::iterator i = downloads_.begin(); | 
| -       i != downloads_.end(); ++i) { | 
| -    DownloadItem* item = (*i); | 
| -    if (item && (item->id() == info->download_id)) { | 
| -      download = item; | 
| -      break; | 
| -    } | 
| -  } | 
| +  DCHECK(ContainsKey(active_downloads_, info->download_id)); | 
| +  DownloadItem* download = active_downloads_[info->download_id]; | 
| DCHECK(download != NULL); | 
| +  DCHECK(ContainsKey(downloads_, download)); | 
| + | 
| download->SetFileCheckResults(info->path, | 
| info->is_dangerous, | 
| info->path_uniquifier, | 
| @@ -502,11 +497,14 @@ void DownloadManager::AttachDownloadItem(DownloadCreateInfo* info, | 
| } | 
|  | 
| void DownloadManager::UpdateDownload(int32 download_id, int64 size) { | 
| -  DownloadMap::iterator it = in_progress_.find(download_id); | 
| -  if (it != in_progress_.end()) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  DownloadMap::iterator it = active_downloads_.find(download_id); | 
| +  if (it != active_downloads_.end()) { | 
| DownloadItem* download = it->second; | 
| -    download->Update(size); | 
| -    download_history_->UpdateEntry(download); | 
| +    if (download->state() == DownloadItem::IN_PROGRESS) { | 
| +      download->Update(size); | 
| +      download_history_->UpdateEntry(download); | 
| +    } | 
| } | 
| UpdateAppIcon(); | 
| } | 
| @@ -520,9 +518,7 @@ void DownloadManager::OnAllDataSaved(int32 download_id, int64 size) { | 
| // it yet (the Save As dialog box is probably still showing), so just keep | 
| // track of the fact that this download id is complete, when the | 
| // DownloadItem is constructed later we'll notify its completion then. | 
| -    PendingFinishedMap::iterator erase_it = | 
| -        pending_finished_downloads_.find(download_id); | 
| -    DCHECK(erase_it == pending_finished_downloads_.end()); | 
| +    DCHECK(!ContainsKey(pending_finished_downloads_, download_id)); | 
| pending_finished_downloads_[download_id] = size; | 
| VLOG(20) << __FUNCTION__ << "()" << " Added download_id = " << download_id | 
| << " to pending_finished_downloads_"; | 
| @@ -576,6 +572,11 @@ void DownloadManager::OnAllDataSaved(int32 download_id, int64 size) { | 
| download->OnSafeDownloadFinished(file_manager_); | 
| } | 
|  | 
| +void DownloadManager::RemoveFromActiveList(int32 download_id) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  active_downloads_.erase(download_id); | 
| +} | 
| + | 
| void DownloadManager::DownloadRenamedToFinalName(int download_id, | 
| const FilePath& full_path) { | 
| VLOG(20) << __FUNCTION__ << "()" << " download_id = " << download_id | 
| @@ -645,6 +646,7 @@ void DownloadManager::DangerousDownloadRenamed(int64 download_handle, | 
| } | 
|  | 
| void DownloadManager::DownloadCancelled(int32 download_id) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| DownloadMap::iterator it = in_progress_.find(download_id); | 
| if (it == in_progress_.end()) | 
| return; | 
| @@ -657,6 +659,7 @@ void DownloadManager::DownloadCancelled(int32 download_id) { | 
| // don't have a valid db_handle yet. | 
| if (download->db_handle() != DownloadHistory::kUninitializedHandle) { | 
| in_progress_.erase(it); | 
| +    active_downloads_.erase(download_id); | 
| download_history_->UpdateEntry(download); | 
| } | 
|  | 
| @@ -953,6 +956,7 @@ void DownloadManager::OnQueryDownloadEntriesComplete( | 
| void DownloadManager::OnCreateDownloadEntryComplete( | 
| DownloadCreateInfo info, | 
| int64 db_handle) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| DownloadMap::iterator it = in_progress_.find(info.download_id); | 
| DCHECK(it != in_progress_.end()); | 
|  | 
| @@ -973,11 +977,10 @@ void DownloadManager::OnCreateDownloadEntryComplete( | 
| download->set_db_handle(db_handle); | 
|  | 
| // Insert into our full map. | 
| -  DCHECK(history_downloads_.find(download->db_handle()) == | 
| -         history_downloads_.end()); | 
| +  DCHECK(!ContainsKey(history_downloads_, download->db_handle())); | 
| history_downloads_[download->db_handle()] = download; | 
|  | 
| -  // Show in the appropropriate browser UI. | 
| +  // Show in the appropriate browser UI. | 
| ShowDownloadInBrowser(info, download); | 
|  | 
| // Inform interested objects about the new download. | 
| @@ -989,6 +992,12 @@ void DownloadManager::OnCreateDownloadEntryComplete( | 
| // observers so that they get more than just the start notification. | 
| if (download->state() != DownloadItem::IN_PROGRESS) { | 
| in_progress_.erase(it); | 
| +    // TODO(ahendrickson) -- We don't actually know whether or not we can | 
| +    // remove the download item from the |active_downloads_| map, as there | 
| +    // is no state in |DownloadItem::DownloadState| to indicate that the | 
| +    // downloads system is done with an item.  Fix this when we have a | 
| +    // proper final state to check for. | 
| +    active_downloads_.erase(info.download_id); | 
| download_history_->UpdateEntry(download); | 
| download->UpdateObservers(); | 
| } | 
| @@ -1042,7 +1051,7 @@ void DownloadManager::AssertContainersConsistent() const { | 
| #if !defined(NDEBUG) | 
| // Turn everything into sets. | 
| DownloadSet in_progress_set, history_set; | 
| -  const DownloadMap* input_maps[] = {&in_progress_, &history_downloads_}; | 
| +  const DownloadMap* input_maps[] = {&active_downloads_, &history_downloads_}; | 
| DownloadSet* local_sets[] = {&in_progress_set, &history_set}; | 
| DCHECK_EQ(ARRAYSIZE_UNSAFE(input_maps), ARRAYSIZE_UNSAFE(local_sets)); | 
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_maps); i++) { | 
|  |