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) { |