| Index: chrome/browser/download/save_file_manager.cc
|
| ===================================================================
|
| --- chrome/browser/download/save_file_manager.cc (revision 30688)
|
| +++ chrome/browser/download/save_file_manager.cc (working copy)
|
| @@ -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 @@
|
| // 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 @@
|
| // 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 @@
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
| -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::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 @@
|
| // 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 @@
|
| // 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::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 @@
|
| 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::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::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 @@
|
| 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::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 @@
|
| // 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 @@
|
| // 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::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::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 @@
|
| // 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 @@
|
| 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 @@
|
| }
|
| }
|
|
|
| - 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::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) {
|
|
|