| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #include "content/browser/download/save_file_manager.h" | 7 #include "content/browser/download/save_file_manager.h" |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 // unique save ID. | 62 // unique save ID. |
| 63 int SaveFileManager::GetNextId() { | 63 int SaveFileManager::GetNextId() { |
| 64 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 64 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 65 return next_id_++; | 65 return next_id_++; |
| 66 } | 66 } |
| 67 | 67 |
| 68 void SaveFileManager::RegisterStartingRequest(const GURL& save_url, | 68 void SaveFileManager::RegisterStartingRequest(const GURL& save_url, |
| 69 SavePackage* save_package) { | 69 SavePackage* save_package) { |
| 70 // Make sure it runs in the UI thread. | 70 // Make sure it runs in the UI thread. |
| 71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 72 int tab_id = save_package->tab_id(); | 72 int contents_id = save_package->contents_id(); |
| 73 | 73 |
| 74 // Register this starting request. | 74 // Register this starting request. |
| 75 StartingRequestsMap& starting_requests = tab_starting_requests_[tab_id]; | 75 StartingRequestsMap& starting_requests = |
| 76 contents_starting_requests_[contents_id]; |
| 76 bool never_present = starting_requests.insert( | 77 bool never_present = starting_requests.insert( |
| 77 StartingRequestsMap::value_type(save_url.spec(), save_package)).second; | 78 StartingRequestsMap::value_type(save_url.spec(), save_package)).second; |
| 78 DCHECK(never_present); | 79 DCHECK(never_present); |
| 79 } | 80 } |
| 80 | 81 |
| 81 SavePackage* SaveFileManager::UnregisterStartingRequest( | 82 SavePackage* SaveFileManager::UnregisterStartingRequest( |
| 82 const GURL& save_url, int tab_id) { | 83 const GURL& save_url, int contents_id) { |
| 83 // Make sure it runs in UI thread. | 84 // Make sure it runs in UI thread. |
| 84 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 85 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 85 | 86 |
| 86 TabToStartingRequestsMap::iterator it = tab_starting_requests_.find(tab_id); | 87 ContentsToStartingRequestsMap::iterator it = |
| 87 if (it != tab_starting_requests_.end()) { | 88 contents_starting_requests_.find(contents_id); |
| 89 if (it != contents_starting_requests_.end()) { |
| 88 StartingRequestsMap& requests = it->second; | 90 StartingRequestsMap& requests = it->second; |
| 89 StartingRequestsMap::iterator sit = requests.find(save_url.spec()); | 91 StartingRequestsMap::iterator sit = requests.find(save_url.spec()); |
| 90 if (sit == requests.end()) | 92 if (sit == requests.end()) |
| 91 return NULL; | 93 return NULL; |
| 92 | 94 |
| 93 // Found, erase it from starting list and return SavePackage. | 95 // Found, erase it from starting list and return SavePackage. |
| 94 SavePackage* save_package = sit->second; | 96 SavePackage* save_package = sit->second; |
| 95 requests.erase(sit); | 97 requests.erase(sit); |
| 96 // If there is no element in requests, remove it | 98 // If there is no element in requests, remove it |
| 97 if (requests.empty()) | 99 if (requests.empty()) |
| 98 tab_starting_requests_.erase(it); | 100 contents_starting_requests_.erase(it); |
| 99 return save_package; | 101 return save_package; |
| 100 } | 102 } |
| 101 | 103 |
| 102 return NULL; | 104 return NULL; |
| 103 } | 105 } |
| 104 | 106 |
| 105 // Look up a SavePackage according to a save id. | 107 // Look up a SavePackage according to a save id. |
| 106 SavePackage* SaveFileManager::LookupPackage(int save_id) { | 108 SavePackage* SaveFileManager::LookupPackage(int save_id) { |
| 107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 108 SavePackageMap::iterator it = packages_.find(save_id); | 110 SavePackageMap::iterator it = packages_.find(save_id); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 // If the save id is -1, it means we just send a request to save, but the | 158 // If the save id is -1, it means we just send a request to save, but the |
| 157 // saving action has still not happened, need to call UnregisterStartingRequest | 159 // saving action has still not happened, need to call UnregisterStartingRequest |
| 158 // to remove it from the tracking map. | 160 // to remove it from the tracking map. |
| 159 void SaveFileManager::RemoveSaveFile(int save_id, const GURL& save_url, | 161 void SaveFileManager::RemoveSaveFile(int save_id, const GURL& save_url, |
| 160 SavePackage* package) { | 162 SavePackage* package) { |
| 161 DCHECK(package); | 163 DCHECK(package); |
| 162 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 164 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 163 // A save page job (SavePackage) can only have one manager, | 165 // A save page job (SavePackage) can only have one manager, |
| 164 // so remove it if it exists. | 166 // so remove it if it exists. |
| 165 if (save_id == -1) { | 167 if (save_id == -1) { |
| 166 SavePackage* old_package = UnregisterStartingRequest(save_url, | 168 SavePackage* old_package = |
| 167 package->tab_id()); | 169 UnregisterStartingRequest(save_url, package->contents_id()); |
| 168 DCHECK_EQ(old_package, package); | 170 DCHECK_EQ(old_package, package); |
| 169 } else { | 171 } else { |
| 170 SavePackageMap::iterator it = packages_.find(save_id); | 172 SavePackageMap::iterator it = packages_.find(save_id); |
| 171 if (it != packages_.end()) | 173 if (it != packages_.end()) |
| 172 packages_.erase(it); | 174 packages_.erase(it); |
| 173 } | 175 } |
| 174 } | 176 } |
| 175 | 177 |
| 176 // Static | 178 // Static |
| 177 SavePackage* SaveFileManager::GetSavePackageFromRenderIds( | 179 SavePackage* SaveFileManager::GetSavePackageFromRenderIds( |
| 178 int render_process_id, int render_view_id) { | 180 int render_process_id, int render_view_id) { |
| 179 RenderViewHostImpl* render_view_host = | 181 RenderViewHostImpl* render_view_host = |
| 180 RenderViewHostImpl::FromID(render_process_id, render_view_id); | 182 RenderViewHostImpl::FromID(render_process_id, render_view_id); |
| 181 if (!render_view_host) | 183 if (!render_view_host) |
| 182 return NULL; | 184 return NULL; |
| 183 | 185 |
| 184 TabContents* tab = static_cast<TabContents*>( | 186 WebContentsImpl* contents = static_cast<WebContentsImpl*>( |
| 185 render_view_host->GetDelegate()->GetAsWebContents()); | 187 render_view_host->GetDelegate()->GetAsWebContents()); |
| 186 if (!tab) | 188 if (!contents) |
| 187 return NULL; | 189 return NULL; |
| 188 | 190 |
| 189 return tab->save_package(); | 191 return contents->save_package(); |
| 190 } | 192 } |
| 191 | 193 |
| 192 void SaveFileManager::DeleteDirectoryOrFile(const FilePath& full_path, | 194 void SaveFileManager::DeleteDirectoryOrFile(const FilePath& full_path, |
| 193 bool is_dir) { | 195 bool is_dir) { |
| 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 195 BrowserThread::PostTask( | 197 BrowserThread::PostTask( |
| 196 BrowserThread::FILE, FROM_HERE, | 198 BrowserThread::FILE, FROM_HERE, |
| 197 base::Bind(&SaveFileManager::OnDeleteDirectoryOrFile, | 199 base::Bind(&SaveFileManager::OnDeleteDirectoryOrFile, |
| 198 this, full_path, is_dir)); | 200 this, full_path, is_dir)); |
| 199 } | 201 } |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 337 |
| 336 void SaveFileManager::OnSaveFinished(int save_id, | 338 void SaveFileManager::OnSaveFinished(int save_id, |
| 337 int64 bytes_so_far, | 339 int64 bytes_so_far, |
| 338 bool is_success) { | 340 bool is_success) { |
| 339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 341 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 340 SavePackage* package = LookupPackage(save_id); | 342 SavePackage* package = LookupPackage(save_id); |
| 341 if (package) | 343 if (package) |
| 342 package->SaveFinished(save_id, bytes_so_far, is_success); | 344 package->SaveFinished(save_id, bytes_so_far, is_success); |
| 343 } | 345 } |
| 344 | 346 |
| 345 void SaveFileManager::OnErrorFinished(const GURL& save_url, int tab_id) { | 347 void SaveFileManager::OnErrorFinished(const GURL& save_url, int contents_id) { |
| 346 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 348 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 347 SavePackage* save_package = UnregisterStartingRequest(save_url, tab_id); | 349 SavePackage* save_package = UnregisterStartingRequest(save_url, contents_id); |
| 348 if (save_package) | 350 if (save_package) |
| 349 save_package->SaveFailed(save_url); | 351 save_package->SaveFailed(save_url); |
| 350 } | 352 } |
| 351 | 353 |
| 352 // Notifications sent from the UI thread and run on the IO thread. | 354 // Notifications sent from the UI thread and run on the IO thread. |
| 353 | 355 |
| 354 void SaveFileManager::OnSaveURL( | 356 void SaveFileManager::OnSaveURL( |
| 355 const GURL& url, | 357 const GURL& url, |
| 356 const GURL& referrer, | 358 const GURL& referrer, |
| 357 int render_process_host_id, | 359 int render_process_host_id, |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 SaveFileMap::iterator it = save_file_map_.find(*i); | 517 SaveFileMap::iterator it = save_file_map_.find(*i); |
| 516 if (it != save_file_map_.end()) { | 518 if (it != save_file_map_.end()) { |
| 517 SaveFile* save_file = it->second; | 519 SaveFile* save_file = it->second; |
| 518 DCHECK(!save_file->InProgress()); | 520 DCHECK(!save_file->InProgress()); |
| 519 file_util::Delete(save_file->FullPath(), false); | 521 file_util::Delete(save_file->FullPath(), false); |
| 520 delete save_file; | 522 delete save_file; |
| 521 save_file_map_.erase(it); | 523 save_file_map_.erase(it); |
| 522 } | 524 } |
| 523 } | 525 } |
| 524 } | 526 } |
| OLD | NEW |