diff options
Diffstat (limited to 'chrome/browser/download/save_file_manager.cc')
-rw-r--r-- | chrome/browser/download/save_file_manager.cc | 207 |
1 files changed, 77 insertions, 130 deletions
diff --git a/chrome/browser/download/save_file_manager.cc b/chrome/browser/download/save_file_manager.cc index 3289799..a985071 100644 --- a/chrome/browser/download/save_file_manager.cc +++ b/chrome/browser/download/save_file_manager.cc @@ -12,7 +12,7 @@ #include "base/string_util.h" #include "base/task.h" #include "base/thread.h" -#include "chrome/browser/browser_process.h" +#include "chrome/browser/chrome_thread.h" #include "chrome/browser/download/save_file.h" #include "chrome/browser/download/save_package.h" #include "chrome/browser/net/url_request_context_getter.h" @@ -27,25 +27,9 @@ #include "net/url_request/url_request_context.h" -SaveFileManager::SaveFileManager(MessageLoop* ui_loop, - MessageLoop* io_loop, - ResourceDispatcherHost* rdh) +SaveFileManager::SaveFileManager(ResourceDispatcherHost* rdh) : next_id_(0), - ui_loop_(ui_loop), - io_loop_(io_loop), resource_dispatcher_host_(rdh) { - DCHECK(ui_loop_); - // Need to make sure that we are in UI thread because using g_browser_process - // on a non-UI thread can cause crashes during shutdown. - DCHECK_EQ(ui_loop_, MessageLoop::current()); - // Cache the message loop of file thread. - base::Thread* thread = g_browser_process->file_thread(); - if (thread) - file_loop_ = thread->message_loop(); - else - // It could be NULL when it is created in unit test of - // ResourceDispatcherHost. - file_loop_ = NULL; DCHECK(resource_dispatcher_host_); } @@ -57,16 +41,14 @@ SaveFileManager::~SaveFileManager() { // Called during the browser shutdown process to clean up any state (open files, // timers) that live on the saving thread (file thread). void SaveFileManager::Shutdown() { - MessageLoop* loop = file_loop(); - if (loop) { - loop->PostTask(FROM_HERE, - NewRunnableMethod(this, &SaveFileManager::OnShutdown)); - } + ChromeThread::PostTask( + ChromeThread::FILE, FROM_HERE, + NewRunnableMethod(this, &SaveFileManager::OnShutdown)); } // Stop file thread operations. void SaveFileManager::OnShutdown() { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); STLDeleteValues(&save_file_map_); } @@ -82,14 +64,14 @@ SaveFile* SaveFileManager::LookupSaveFile(int save_id) { // file a request from the file thread to the IO thread to generate a // unique save ID. int SaveFileManager::GetNextId() { - DCHECK_EQ(MessageLoop::current(), io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); return next_id_++; } void SaveFileManager::RegisterStartingRequest(const GURL& save_url, SavePackage* save_package) { // Make sure it runs in the UI thread. - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); int tab_id = save_package->tab_id(); // Register this starting request. @@ -102,7 +84,7 @@ void SaveFileManager::RegisterStartingRequest(const GURL& save_url, SavePackage* SaveFileManager::UnregisterStartingRequest( const GURL& save_url, int tab_id) { // Make sure it runs in UI thread. - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); TabToStartingRequestsMap::iterator it = tab_starting_requests_.find(tab_id); if (it != tab_starting_requests_.end()) { @@ -123,24 +105,9 @@ SavePackage* SaveFileManager::UnregisterStartingRequest( return NULL; } -void SaveFileManager::RequireSaveJobFromOtherSource(SaveFileCreateInfo* info) { - // This function must be called on the UI thread, because the io_loop_ - // pointer may be junk when we use it on file thread. We can only rely on the - // io_loop_ pointer being valid when we run code on the UI thread (or on - // the IO thread. - DCHECK_EQ(MessageLoop::current(), ui_loop_); - DCHECK_EQ(info->save_id, -1); - // Since the data will come from render process, so we need to start - // this kind of save job by ourself. - io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnRequireSaveJobFromOtherSource, - info)); -} - // Look up a SavePackage according to a save id. SavePackage* SaveFileManager::LookupPackage(int save_id) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); SavePackageMap::iterator it = packages_.find(save_id); if (it != packages_.end()) return it->second; @@ -156,18 +123,15 @@ void SaveFileManager::SaveURL(const GURL& url, const FilePath& file_full_path, URLRequestContextGetter* request_context_getter, SavePackage* save_package) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); - if (!io_loop_) { - NOTREACHED(); // Net IO thread must exist. - return; - } + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); // Register a saving job. RegisterStartingRequest(url, save_package); if (save_source == SaveFileCreateInfo::SAVE_FILE_FROM_NET) { DCHECK(url.is_valid()); - io_loop_->PostTask(FROM_HERE, + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, NewRunnableMethod(this, &SaveFileManager::OnSaveURL, url, @@ -183,7 +147,13 @@ void SaveFileManager::SaveURL(const GURL& url, -1); info->render_process_id = render_process_host_id; info->render_view_id = render_view_id; - RequireSaveJobFromOtherSource(info); + + // Since the data will come from render process, so we need to start + // this kind of save job by ourself. + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::OnRequireSaveJobFromOtherSource, info)); } } @@ -196,7 +166,7 @@ void SaveFileManager::SaveURL(const GURL& url, void SaveFileManager::RemoveSaveFile(int save_id, const GURL& save_url, SavePackage* package) { DCHECK(package); - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); // A save page job(SavePackage) can only have one manager, // so remove it if it exists. if (save_id == -1) { @@ -226,25 +196,19 @@ SavePackage* SaveFileManager::GetSavePackageFromRenderIds( // Utility function for deleting specified file. void SaveFileManager::DeleteDirectoryOrFile(const FilePath& full_path, bool is_dir) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); - MessageLoop* loop = file_loop(); - DCHECK(loop); - loop->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnDeleteDirectoryOrFile, - full_path, - is_dir)); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); + ChromeThread::PostTask( + ChromeThread::FILE, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::OnDeleteDirectoryOrFile, full_path, is_dir)); } void SaveFileManager::SendCancelRequest(int save_id) { // Cancel the request which has specific save id. DCHECK_GT(save_id, -1); - MessageLoop* loop = file_loop(); - DCHECK(loop); - loop->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::CancelSave, - save_id)); + ChromeThread::PostTask( + ChromeThread::FILE, FROM_HERE, + NewRunnableMethod(this, &SaveFileManager::CancelSave, save_id)); } // Notifications sent from the IO thread and run on the file thread: @@ -253,17 +217,16 @@ void SaveFileManager::SendCancelRequest(int save_id) { // to create a SaveFile which will hold and finally destroy |info|. It will // then passes |info| to the UI thread for reporting saving status. void SaveFileManager::StartSave(SaveFileCreateInfo* info) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); DCHECK(info); SaveFile* save_file = new SaveFile(info); DCHECK(!LookupSaveFile(info->save_id)); save_file_map_[info->save_id] = save_file; info->path = save_file->full_path(); - ui_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnStartSave, - info)); + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod(this, &SaveFileManager::OnStartSave, info)); } // We do forward an update to the UI thread here, since we do not use timer to @@ -273,16 +236,15 @@ void SaveFileManager::StartSave(SaveFileCreateInfo* info) { void SaveFileManager::UpdateSaveProgress(int save_id, net::IOBuffer* data, int data_len) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); SaveFile* save_file = LookupSaveFile(save_id); if (save_file) { bool write_success = save_file->AppendDataToFile(data->data(), data_len); - ui_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnUpdateSaveProgress, - save_file->save_id(), - save_file->bytes_so_far(), - write_success)); + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::OnUpdateSaveProgress, save_file->save_id(), + save_file->bytes_so_far(), write_success)); } data->Release(); } @@ -297,33 +259,32 @@ void SaveFileManager::SaveFinished(int save_id, GURL save_url, int render_process_id, bool is_success) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); SaveFileMap::iterator it = save_file_map_.find(save_id); if (it != save_file_map_.end()) { SaveFile* save_file = it->second; - ui_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnSaveFinished, - save_id, - save_file->bytes_so_far(), - is_success)); + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::OnSaveFinished, save_id, + save_file->bytes_so_far(), is_success)); save_file->Finish(); } else if (save_id == -1) { // Before saving started, we got error. We still call finish process. DCHECK(!save_url.is_empty()); - ui_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnErrorFinished, - save_url, - render_process_id)); + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::OnErrorFinished, save_url, + render_process_id)); } } // Notifications sent from the file thread and run on the UI thread. void SaveFileManager::OnStartSave(const SaveFileCreateInfo* info) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); SavePackage* save_package = GetSavePackageFromRenderIds(info->render_process_id, info->render_view_id); @@ -357,7 +318,7 @@ void SaveFileManager::OnStartSave(const SaveFileCreateInfo* info) { void SaveFileManager::OnUpdateSaveProgress(int save_id, int64 bytes_so_far, bool write_success) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); SavePackage* package = LookupPackage(save_id); if (package) package->UpdateSaveProgress(save_id, bytes_so_far, write_success); @@ -368,30 +329,19 @@ void SaveFileManager::OnUpdateSaveProgress(int save_id, int64 bytes_so_far, void SaveFileManager::OnSaveFinished(int save_id, int64 bytes_so_far, bool is_success) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); SavePackage* package = LookupPackage(save_id); if (package) package->SaveFinished(save_id, bytes_so_far, is_success); } void SaveFileManager::OnErrorFinished(GURL save_url, int tab_id) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); SavePackage* save_package = UnregisterStartingRequest(save_url, tab_id); if (save_package) save_package->SaveFailed(save_url); } -void SaveFileManager::OnCancelSaveRequest(int render_process_id, - int request_id) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); - DCHECK(io_loop_); - io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::ExecuteCancelSaveRequest, - render_process_id, - request_id)); -} - // Notifications sent from the UI thread and run on the IO thread. void SaveFileManager::OnSaveURL( @@ -400,7 +350,7 @@ void SaveFileManager::OnSaveURL( int render_process_host_id, int render_view_id, URLRequestContextGetter* request_context_getter) { - DCHECK_EQ(MessageLoop::current(), io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); URLRequestContext* context = request_context_getter->GetURLRequestContext(); resource_dispatcher_host_->BeginSaveFile(url, referrer, @@ -411,22 +361,19 @@ void SaveFileManager::OnSaveURL( void SaveFileManager::OnRequireSaveJobFromOtherSource( SaveFileCreateInfo* info) { - DCHECK_EQ(MessageLoop::current(), io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); DCHECK_EQ(info->save_id, -1); // Generate a unique save id. info->save_id = GetNextId(); // Start real saving action. - MessageLoop* loop = file_loop(); - DCHECK(loop); - loop->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::StartSave, - info)); + ChromeThread::PostTask( + ChromeThread::FILE, FROM_HERE, + NewRunnableMethod(this, &SaveFileManager::StartSave, info)); } void SaveFileManager::ExecuteCancelSaveRequest(int render_process_id, int request_id) { - DCHECK_EQ(MessageLoop::current(), io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); resource_dispatcher_host_->CancelRequest(render_process_id, request_id, false); @@ -440,7 +387,7 @@ void SaveFileManager::ExecuteCancelSaveRequest(int render_process_id, // sent from the UI thread, the saving job may have already completed and // won't exist in our map. void SaveFileManager::CancelSave(int save_id) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); SaveFileMap::iterator it = save_file_map_.find(save_id); if (it != save_file_map_.end()) { SaveFile* save_file = it->second; @@ -449,11 +396,11 @@ void SaveFileManager::CancelSave(int save_id) { // message to IO thread. If the data comes from other sources, just // ignore the cancel message. if (save_file->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_NET) { - ui_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnCancelSaveRequest, - save_file->render_process_id(), - save_file->request_id())); + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::ExecuteCancelSaveRequest, + save_file->render_process_id(), save_file->request_id())); // UI thread will notify the render process to stop sending data, // so in here, we need not to do anything, just close the save file. @@ -477,7 +424,7 @@ void SaveFileManager::CancelSave(int save_id) { void SaveFileManager::SaveLocalFile(const GURL& original_file_url, int save_id, int render_process_id) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); SaveFile* save_file = LookupSaveFile(save_id); if (!save_file) return; @@ -507,7 +454,7 @@ void SaveFileManager::SaveLocalFile(const GURL& original_file_url, void SaveFileManager::OnDeleteDirectoryOrFile(const FilePath& full_path, bool is_dir) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); DCHECK(!full_path.empty()); file_util::Delete(full_path, is_dir); @@ -517,7 +464,7 @@ void SaveFileManager::OnDeleteDirectoryOrFile(const FilePath& full_path, // We run on this thread to avoid blocking the UI with slow Shell operations. #if !defined(OS_MACOSX) void SaveFileManager::OnShowSavedFileInShell(const FilePath full_path) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); platform_util::ShowItemInFolder(full_path); } #endif @@ -527,7 +474,7 @@ void SaveFileManager::RenameAllFiles( const FilePath& resource_dir, int render_process_id, int render_view_id) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); if (!resource_dir.empty() && !file_util::PathExists(resource_dir)) file_util::CreateDirectory(resource_dir); @@ -544,16 +491,16 @@ void SaveFileManager::RenameAllFiles( } } - ui_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, - &SaveFileManager::OnFinishSavePageJob, - render_process_id, - render_view_id)); + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &SaveFileManager::OnFinishSavePageJob, render_process_id, + render_view_id)); } void SaveFileManager::OnFinishSavePageJob(int render_process_id, int render_view_id) { - DCHECK_EQ(MessageLoop::current(), ui_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); SavePackage* save_package = GetSavePackageFromRenderIds(render_process_id, render_view_id); @@ -566,7 +513,7 @@ void SaveFileManager::OnFinishSavePageJob(int render_process_id, void SaveFileManager::RemoveSavedFileFromFileMap( const SaveIDList& save_ids) { - DCHECK_EQ(MessageLoop::current(), file_loop()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); for (SaveIDList::const_iterator i = save_ids.begin(); i != save_ids.end(); ++i) { |