| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/browser/download/download_request_manager.h" | 5 #include "chrome/browser/download/download_request_manager.h" |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "chrome/browser/chrome_thread.h" |
| 8 #include "base/thread.h" | |
| 9 #include "chrome/browser/download/download_request_infobar_delegate.h" | 8 #include "chrome/browser/download/download_request_infobar_delegate.h" |
| 10 #include "chrome/browser/tab_contents/navigation_controller.h" | 9 #include "chrome/browser/tab_contents/navigation_controller.h" |
| 11 #include "chrome/browser/tab_contents/navigation_entry.h" | 10 #include "chrome/browser/tab_contents/navigation_entry.h" |
| 12 #include "chrome/browser/tab_contents/tab_contents_delegate.h" | 11 #include "chrome/browser/tab_contents/tab_contents_delegate.h" |
| 13 #include "chrome/browser/tab_contents/tab_util.h" | 12 #include "chrome/browser/tab_contents/tab_util.h" |
| 14 #include "chrome/browser/tab_contents/tab_contents.h" | 13 #include "chrome/browser/tab_contents/tab_contents.h" |
| 15 #include "chrome/common/notification_service.h" | 14 #include "chrome/common/notification_service.h" |
| 16 | 15 |
| 17 // TabDownloadState ------------------------------------------------------------ | 16 // TabDownloadState ------------------------------------------------------------ |
| 18 | 17 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 DownloadRequestManager::ALLOW_ALL_DOWNLOADS : | 144 DownloadRequestManager::ALLOW_ALL_DOWNLOADS : |
| 146 DownloadRequestManager::DOWNLOADS_NOT_ALLOWED; | 145 DownloadRequestManager::DOWNLOADS_NOT_ALLOWED; |
| 147 std::vector<DownloadRequestManager::Callback*> callbacks; | 146 std::vector<DownloadRequestManager::Callback*> callbacks; |
| 148 callbacks.swap(callbacks_); | 147 callbacks.swap(callbacks_); |
| 149 for (size_t i = 0; i < callbacks.size(); ++i) | 148 for (size_t i = 0; i < callbacks.size(); ++i) |
| 150 host_->ScheduleNotification(callbacks[i], allow); | 149 host_->ScheduleNotification(callbacks[i], allow); |
| 151 } | 150 } |
| 152 | 151 |
| 153 // DownloadRequestManager ------------------------------------------------------ | 152 // DownloadRequestManager ------------------------------------------------------ |
| 154 | 153 |
| 155 DownloadRequestManager::DownloadRequestManager(MessageLoop* io_loop, | 154 DownloadRequestManager::DownloadRequestManager() { |
| 156 MessageLoop* ui_loop) | |
| 157 : io_loop_(io_loop), | |
| 158 ui_loop_(ui_loop) { | |
| 159 } | 155 } |
| 160 | 156 |
| 161 DownloadRequestManager::~DownloadRequestManager() { | 157 DownloadRequestManager::~DownloadRequestManager() { |
| 162 // All the tabs should have closed before us, which sends notification and | 158 // All the tabs should have closed before us, which sends notification and |
| 163 // removes from state_map_. As such, there should be no pending callbacks. | 159 // removes from state_map_. As such, there should be no pending callbacks. |
| 164 DCHECK(state_map_.empty()); | 160 DCHECK(state_map_.empty()); |
| 165 } | 161 } |
| 166 | 162 |
| 167 DownloadRequestManager::DownloadStatus | 163 DownloadRequestManager::DownloadStatus |
| 168 DownloadRequestManager::GetDownloadStatus(TabContents* tab) { | 164 DownloadRequestManager::GetDownloadStatus(TabContents* tab) { |
| 169 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); | 165 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); |
| 170 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD; | 166 return state ? state->download_status() : ALLOW_ONE_DOWNLOAD; |
| 171 } | 167 } |
| 172 | 168 |
| 173 void DownloadRequestManager::CanDownloadOnIOThread(int render_process_host_id, | 169 void DownloadRequestManager::CanDownloadOnIOThread(int render_process_host_id, |
| 174 int render_view_id, | 170 int render_view_id, |
| 175 Callback* callback) { | 171 Callback* callback) { |
| 176 // This is invoked on the IO thread. Schedule the task to run on the UI | 172 // This is invoked on the IO thread. Schedule the task to run on the UI |
| 177 // thread so that we can query UI state. | 173 // thread so that we can query UI state. |
| 178 DCHECK(!io_loop_ || io_loop_ == MessageLoop::current()); | 174 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 179 ui_loop_->PostTask(FROM_HERE, | 175 ChromeThread::PostTask( |
| 176 ChromeThread::UI, FROM_HERE, |
| 180 NewRunnableMethod(this, &DownloadRequestManager::CanDownload, | 177 NewRunnableMethod(this, &DownloadRequestManager::CanDownload, |
| 181 render_process_host_id, render_view_id, callback)); | 178 render_process_host_id, render_view_id, callback)); |
| 182 } | 179 } |
| 183 | 180 |
| 184 void DownloadRequestManager::OnUserGesture(TabContents* tab) { | 181 void DownloadRequestManager::OnUserGesture(TabContents* tab) { |
| 185 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); | 182 TabDownloadState* state = GetDownloadState(&tab->controller(), NULL, false); |
| 186 if (!state) | 183 if (!state) |
| 187 return; | 184 return; |
| 188 | 185 |
| 189 state->OnUserGesture(); | 186 state->OnUserGesture(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 208 | 205 |
| 209 TabDownloadState* state = | 206 TabDownloadState* state = |
| 210 new TabDownloadState(this, controller, originating_controller); | 207 new TabDownloadState(this, controller, originating_controller); |
| 211 state_map_[controller] = state; | 208 state_map_[controller] = state; |
| 212 return state; | 209 return state; |
| 213 } | 210 } |
| 214 | 211 |
| 215 void DownloadRequestManager::CanDownload(int render_process_host_id, | 212 void DownloadRequestManager::CanDownload(int render_process_host_id, |
| 216 int render_view_id, | 213 int render_view_id, |
| 217 Callback* callback) { | 214 Callback* callback) { |
| 218 DCHECK(!ui_loop_ || MessageLoop::current() == ui_loop_); | 215 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 219 | 216 |
| 220 TabContents* originating_tab = | 217 TabContents* originating_tab = |
| 221 tab_util::GetTabContentsByID(render_process_host_id, render_view_id); | 218 tab_util::GetTabContentsByID(render_process_host_id, render_view_id); |
| 222 if (!originating_tab) { | 219 if (!originating_tab) { |
| 223 // The tab was closed, don't allow the download. | 220 // The tab was closed, don't allow the download. |
| 224 ScheduleNotification(callback, false); | 221 ScheduleNotification(callback, false); |
| 225 return; | 222 return; |
| 226 } | 223 } |
| 227 CanDownloadImpl(originating_tab, callback); | 224 CanDownloadImpl(originating_tab, callback); |
| 228 } | 225 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 258 state->PromptUserForDownload(effective_tab, callback); | 255 state->PromptUserForDownload(effective_tab, callback); |
| 259 break; | 256 break; |
| 260 | 257 |
| 261 default: | 258 default: |
| 262 NOTREACHED(); | 259 NOTREACHED(); |
| 263 } | 260 } |
| 264 } | 261 } |
| 265 | 262 |
| 266 void DownloadRequestManager::ScheduleNotification(Callback* callback, | 263 void DownloadRequestManager::ScheduleNotification(Callback* callback, |
| 267 bool allow) { | 264 bool allow) { |
| 268 if (io_loop_) { | 265 ChromeThread::PostTask( |
| 269 io_loop_->PostTask(FROM_HERE, | 266 ChromeThread::IO, FROM_HERE, |
| 270 NewRunnableMethod(this, &DownloadRequestManager::NotifyCallback, | 267 NewRunnableMethod( |
| 271 callback, allow)); | 268 this, &DownloadRequestManager::NotifyCallback, callback, allow)); |
| 272 } else { | |
| 273 NotifyCallback(callback, allow); | |
| 274 } | |
| 275 } | 269 } |
| 276 | 270 |
| 277 void DownloadRequestManager::NotifyCallback(Callback* callback, bool allow) { | 271 void DownloadRequestManager::NotifyCallback(Callback* callback, bool allow) { |
| 278 // We better be on the IO thread now. | 272 // We better be on the IO thread now. |
| 279 DCHECK(!io_loop_ || MessageLoop::current() == io_loop_); | 273 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 280 if (allow) | 274 if (allow) |
| 281 callback->ContinueDownload(); | 275 callback->ContinueDownload(); |
| 282 else | 276 else |
| 283 callback->CancelDownload(); | 277 callback->CancelDownload(); |
| 284 } | 278 } |
| 285 | 279 |
| 286 void DownloadRequestManager::Remove(TabDownloadState* state) { | 280 void DownloadRequestManager::Remove(TabDownloadState* state) { |
| 287 DCHECK(state_map_.find(state->controller()) != state_map_.end()); | 281 DCHECK(state_map_.find(state->controller()) != state_map_.end()); |
| 288 state_map_.erase(state->controller()); | 282 state_map_.erase(state->controller()); |
| 289 delete state; | 283 delete state; |
| 290 } | 284 } |
| 291 | 285 |
| 292 // static | 286 // static |
| 293 DownloadRequestManager::TestingDelegate* DownloadRequestManager::delegate_ = | 287 DownloadRequestManager::TestingDelegate* DownloadRequestManager::delegate_ = |
| 294 NULL; | 288 NULL; |
| OLD | NEW |