Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: chrome/browser/ui/webui/downloads_dom_handler.cc

Issue 10854127: Rewrite DownloadsDOMHandler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/ui/webui/downloads_dom_handler.h" 5 #include "chrome/browser/ui/webui/downloads_dom_handler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 NOTREACHED(); 113 NOTREACHED();
114 return ""; 114 return "";
115 } 115 }
116 } 116 }
117 117
118 // Return a JSON dictionary containing some of the attributes of |download|. 118 // Return a JSON dictionary containing some of the attributes of |download|.
119 // The JSON dictionary will also have a field "id" set to |id|, and a field 119 // The JSON dictionary will also have a field "id" set to |id|, and a field
120 // "otr" set to |incognito|. 120 // "otr" set to |incognito|.
121 DictionaryValue* CreateDownloadItemValue( 121 DictionaryValue* CreateDownloadItemValue(
122 content::DownloadItem* download, 122 content::DownloadItem* download,
123 int id,
124 bool incognito) { 123 bool incognito) {
125 DictionaryValue* file_value = new DictionaryValue(); 124 DictionaryValue* file_value = new DictionaryValue();
126 125
127 file_value->SetInteger( 126 file_value->SetInteger(
128 "started", static_cast<int>(download->GetStartTime().ToTimeT())); 127 "started", static_cast<int>(download->GetStartTime().ToTimeT()));
129 file_value->SetString( 128 file_value->SetString(
130 "since_string", TimeFormat::RelativeDate(download->GetStartTime(), NULL)); 129 "since_string", TimeFormat::RelativeDate(download->GetStartTime(), NULL));
131 file_value->SetString( 130 file_value->SetString(
132 "date_string", base::TimeFormatShortDate(download->GetStartTime())); 131 "date_string", base::TimeFormatShortDate(download->GetStartTime()));
133 file_value->SetInteger("id", id); 132 file_value->SetInteger("id", download->GetId());
134 133
135 FilePath download_path(download->GetTargetFilePath()); 134 FilePath download_path(download->GetTargetFilePath());
136 file_value->Set("file_path", base::CreateFilePathValue(download_path)); 135 file_value->Set("file_path", base::CreateFilePathValue(download_path));
137 file_value->SetString("file_url", 136 file_value->SetString("file_url",
138 net::FilePathToFileURL(download_path).spec()); 137 net::FilePathToFileURL(download_path).spec());
139 138
140 // Keep file names as LTR. 139 // Keep file names as LTR.
141 string16 file_name = download->GetFileNameToReportUser().LossyDisplayName(); 140 string16 file_name = download->GetFileNameToReportUser().LossyDisplayName();
142 file_name = base::i18n::GetDisplayStringInLTRDirectionality(file_name); 141 file_name = base::i18n::GetDisplayStringInLTRDirectionality(file_name);
143 file_value->SetString("file_name", file_name); 142 file_value->SetString("file_name", file_name);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 return (original_manager && 212 return (original_manager &&
214 (manager->GetDownload(download_id) != NULL)); 213 (manager->GetDownload(download_id) != NULL));
215 } 214 }
216 215
217 } // namespace 216 } // namespace
218 217
219 DownloadsDOMHandler::DownloadsDOMHandler(content::DownloadManager* dlm) 218 DownloadsDOMHandler::DownloadsDOMHandler(content::DownloadManager* dlm)
220 : search_text_(), 219 : search_text_(),
221 download_manager_(dlm), 220 download_manager_(dlm),
222 original_profile_download_manager_(NULL), 221 original_profile_download_manager_(NULL),
223 initialized_(false), 222 update_scheduled_(false),
224 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 223 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
225 // Create our fileicon data source. 224 // Create our fileicon data source.
226 Profile* profile = Profile::FromBrowserContext(dlm->GetBrowserContext()); 225 Profile* profile = Profile::FromBrowserContext(dlm->GetBrowserContext());
227 ChromeURLDataManager::AddDataSource(profile, new FileIconSource()); 226 ChromeURLDataManager::AddDataSource(profile, new FileIconSource());
228 227
229 // Figure out our parent DownloadManager, if any. 228 // Observe the DownloadManagers.
230 Profile* original_profile = profile->GetOriginalProfile(); 229 download_manager_->AddObserver(this);
231 if (original_profile != profile) { 230 if (profile->IsOffTheRecord()) {
232 original_profile_download_manager_ = 231 original_profile_download_manager_ =
233 BrowserContext::GetDownloadManager(original_profile); 232 BrowserContext::GetDownloadManager(profile->GetOriginalProfile());
233 original_profile_download_manager_->AddObserver(this);
234 }
235
236 // Observe all the DownloadItems.
237 content::DownloadManager::DownloadVector downloads;
238 SearchDownloads(&downloads);
239 for (content::DownloadManager::DownloadVector::const_iterator
240 iter = downloads.begin();
241 iter != downloads.end(); ++iter) {
242 (*iter)->AddObserver(this);
234 } 243 }
235 } 244 }
236 245
237 DownloadsDOMHandler::~DownloadsDOMHandler() { 246 DownloadsDOMHandler::~DownloadsDOMHandler() {
238 ClearDownloadItems(); 247 // Make SearchDownloads() return all the items.
248 search_text_ = std::wstring();
249 content::DownloadManager::DownloadVector downloads;
250 SearchDownloads(&downloads);
251 for (content::DownloadManager::DownloadVector::const_iterator
252 iter = downloads.begin();
253 iter != downloads.end(); ++iter) {
254 (*iter)->RemoveObserver(this);
255 }
Randy Smith (Not in Mondays) 2012/08/15 19:04:16 This is quite scary to me--you're relying on the s
benjhayden 2012/08/16 18:52:09 Done, but I made a note to write AddObserver(WeakP
239 download_manager_->RemoveObserver(this); 256 download_manager_->RemoveObserver(this);
240 if (original_profile_download_manager_) 257 if (original_profile_download_manager_) {
241 original_profile_download_manager_->RemoveObserver(this); 258 original_profile_download_manager_->RemoveObserver(this);
259 }
242 } 260 }
243 261
244 // DownloadsDOMHandler, public: ----------------------------------------------- 262 // DownloadsDOMHandler, public: -----------------------------------------------
245 263
246 void DownloadsDOMHandler::OnPageLoaded(const base::ListValue* args) { 264 void DownloadsDOMHandler::OnPageLoaded(const base::ListValue* args) {
247 if (initialized_) 265 SendCurrentDownloads();
248 return;
249 initialized_ = true;
250
251 download_manager_->AddObserver(this);
252 if (original_profile_download_manager_)
253 original_profile_download_manager_->AddObserver(this);
254 } 266 }
255 267
256 void DownloadsDOMHandler::RegisterMessages() { 268 void DownloadsDOMHandler::RegisterMessages() {
257 web_ui()->RegisterMessageCallback("onPageLoaded", 269 web_ui()->RegisterMessageCallback("onPageLoaded",
258 base::Bind(&DownloadsDOMHandler::OnPageLoaded, 270 base::Bind(&DownloadsDOMHandler::OnPageLoaded,
259 base::Unretained(this))); 271 weak_ptr_factory_.GetWeakPtr()));
260 web_ui()->RegisterMessageCallback("getDownloads", 272 web_ui()->RegisterMessageCallback("getDownloads",
261 base::Bind(&DownloadsDOMHandler::HandleGetDownloads, 273 base::Bind(&DownloadsDOMHandler::HandleGetDownloads,
262 base::Unretained(this))); 274 weak_ptr_factory_.GetWeakPtr()));
263 web_ui()->RegisterMessageCallback("openFile", 275 web_ui()->RegisterMessageCallback("openFile",
264 base::Bind(&DownloadsDOMHandler::HandleOpenFile, 276 base::Bind(&DownloadsDOMHandler::HandleOpenFile,
265 base::Unretained(this))); 277 weak_ptr_factory_.GetWeakPtr()));
266 web_ui()->RegisterMessageCallback("drag", 278 web_ui()->RegisterMessageCallback("drag",
267 base::Bind(&DownloadsDOMHandler::HandleDrag, 279 base::Bind(&DownloadsDOMHandler::HandleDrag,
268 base::Unretained(this))); 280 weak_ptr_factory_.GetWeakPtr()));
269 web_ui()->RegisterMessageCallback("saveDangerous", 281 web_ui()->RegisterMessageCallback("saveDangerous",
270 base::Bind(&DownloadsDOMHandler::HandleSaveDangerous, 282 base::Bind(&DownloadsDOMHandler::HandleSaveDangerous,
271 base::Unretained(this))); 283 weak_ptr_factory_.GetWeakPtr()));
272 web_ui()->RegisterMessageCallback("discardDangerous", 284 web_ui()->RegisterMessageCallback("discardDangerous",
273 base::Bind(&DownloadsDOMHandler::HandleDiscardDangerous, 285 base::Bind(&DownloadsDOMHandler::HandleDiscardDangerous,
274 base::Unretained(this))); 286 weak_ptr_factory_.GetWeakPtr()));
275 web_ui()->RegisterMessageCallback("show", 287 web_ui()->RegisterMessageCallback("show",
276 base::Bind(&DownloadsDOMHandler::HandleShow, 288 base::Bind(&DownloadsDOMHandler::HandleShow,
277 base::Unretained(this))); 289 weak_ptr_factory_.GetWeakPtr()));
278 web_ui()->RegisterMessageCallback("togglepause", 290 web_ui()->RegisterMessageCallback("togglepause",
279 base::Bind(&DownloadsDOMHandler::HandlePause, 291 base::Bind(&DownloadsDOMHandler::HandlePause,
280 base::Unretained(this))); 292 weak_ptr_factory_.GetWeakPtr()));
281 web_ui()->RegisterMessageCallback("resume", 293 web_ui()->RegisterMessageCallback("resume",
282 base::Bind(&DownloadsDOMHandler::HandlePause, 294 base::Bind(&DownloadsDOMHandler::HandlePause,
283 base::Unretained(this))); 295 weak_ptr_factory_.GetWeakPtr()));
284 web_ui()->RegisterMessageCallback("remove", 296 web_ui()->RegisterMessageCallback("remove",
285 base::Bind(&DownloadsDOMHandler::HandleRemove, 297 base::Bind(&DownloadsDOMHandler::HandleRemove,
286 base::Unretained(this))); 298 weak_ptr_factory_.GetWeakPtr()));
287 web_ui()->RegisterMessageCallback("cancel", 299 web_ui()->RegisterMessageCallback("cancel",
288 base::Bind(&DownloadsDOMHandler::HandleCancel, 300 base::Bind(&DownloadsDOMHandler::HandleCancel,
289 base::Unretained(this))); 301 weak_ptr_factory_.GetWeakPtr()));
290 web_ui()->RegisterMessageCallback("clearAll", 302 web_ui()->RegisterMessageCallback("clearAll",
291 base::Bind(&DownloadsDOMHandler::HandleClearAll, 303 base::Bind(&DownloadsDOMHandler::HandleClearAll,
292 base::Unretained(this))); 304 weak_ptr_factory_.GetWeakPtr()));
293 web_ui()->RegisterMessageCallback("openDownloadsFolder", 305 web_ui()->RegisterMessageCallback("openDownloadsFolder",
294 base::Bind(&DownloadsDOMHandler::HandleOpenDownloadsFolder, 306 base::Bind(&DownloadsDOMHandler::HandleOpenDownloadsFolder,
295 base::Unretained(this))); 307 weak_ptr_factory_.GetWeakPtr()));
308 }
309
310 void DownloadsDOMHandler::OnDownloadCreated(
311 content::DownloadManager* manager, content::DownloadItem* download_item) {
312 download_item->AddObserver(this);
313 if (!update_scheduled_) {
Randy Smith (Not in Mondays) 2012/08/15 19:04:16 Comment as to motivation.
benjhayden 2012/08/16 18:52:09 Done.
314 update_scheduled_ = true;
315 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
316 base::Bind(&DownloadsDOMHandler::SendCurrentDownloads,
317 weak_ptr_factory_.GetWeakPtr()));
318 }
296 } 319 }
297 320
298 void DownloadsDOMHandler::OnDownloadUpdated(content::DownloadItem* download) { 321 void DownloadsDOMHandler::OnDownloadUpdated(content::DownloadItem* download) {
299 // Get the id for the download. Our downloads are sorted latest to first, 322 base::ListValue results_value;
300 // and the id is the index into that list. We should be careful of sync 323 results_value.Append(CreateDownloadItemValue(download, IsItemIncognito(
301 // errors between the UI and the download_items_ list (we may wish to use
302 // something other than 'id').
303 OrderedDownloads::iterator it = std::find(download_items_.begin(),
304 download_items_.end(),
305 download);
306 if (it == download_items_.end())
307 return;
308
309 const int id = static_cast<int>(it - download_items_.begin());
310
311 ListValue results_value;
312 results_value.Append(CreateDownloadItemValue(download, id, IsItemIncognito(
313 download->GetId(), 324 download->GetId(),
314 download_manager_, 325 download_manager_,
315 original_profile_download_manager_))); 326 original_profile_download_manager_)));
316 web_ui()->CallJavascriptFunction("downloadUpdated", results_value); 327 CallDownloadUpdated(results_value);
317 } 328 }
318 329
319 void DownloadsDOMHandler::OnDownloadDestroyed( 330 void DownloadsDOMHandler::OnDownloadDestroyed(
320 content::DownloadItem* download) { 331 content::DownloadItem* download) {
321 download->RemoveObserver(this); 332 download->RemoveObserver(this);
322 OrderedDownloads::iterator it = std::find(download_items_.begin(), 333 if (!update_scheduled_) {
323 download_items_.end(), 334 update_scheduled_ = true;
324 download); 335 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
325 if (it != download_items_.end()) 336 base::Bind(&DownloadsDOMHandler::SendCurrentDownloads,
326 *it = NULL; 337 weak_ptr_factory_.GetWeakPtr()));
327 // A later ModelChanged() notification will change the WebUI's
328 // view of the downloads list.
329 }
330
331 // A download has started or been deleted. Query our DownloadManager for the
332 // current set of downloads.
333 void DownloadsDOMHandler::ModelChanged(content::DownloadManager* manager) {
334 DCHECK(manager == download_manager_ ||
335 manager == original_profile_download_manager_);
336
337 ClearDownloadItems();
338 download_manager_->SearchDownloads(WideToUTF16(search_text_),
339 &download_items_);
340 // If we have a parent DownloadManager, let it add its downloads to the
341 // results.
342 if (original_profile_download_manager_) {
343 original_profile_download_manager_->SearchDownloads(
344 WideToUTF16(search_text_), &download_items_);
345 } 338 }
346
347 sort(download_items_.begin(), download_items_.end(), DownloadItemSorter());
348
349 // Remove any extension downloads.
350 for (size_t i = 0; i < download_items_.size();) {
351 if (download_crx_util::IsExtensionDownload(*download_items_[i]))
352 download_items_.erase(download_items_.begin() + i);
353 else
354 i++;
355 }
356
357 // Add ourself to all download items as an observer.
358 for (OrderedDownloads::iterator it = download_items_.begin();
359 it != download_items_.end(); ++it) {
360 if (static_cast<int>(it - download_items_.begin()) > kMaxDownloads)
361 break;
362
363 // We should never see anything that isn't already in the history.
364 DCHECK(*it);
365 DCHECK((*it)->IsPersisted());
366
367 (*it)->AddObserver(this);
368 }
369
370 SendCurrentDownloads();
371 } 339 }
372 340
373 void DownloadsDOMHandler::ManagerGoingDown(content::DownloadManager* manager) { 341 void DownloadsDOMHandler::ManagerGoingDown(content::DownloadManager* manager) {
374 // This should never happen. The lifetime of the DownloadsDOMHandler 342 // This should never happen. The lifetime of the DownloadsDOMHandler
375 // is tied to the tab in which downloads.html is displayed, which cannot 343 // is tied to the tab in which downloads.html is displayed, which cannot
376 // outlive the Browser that contains it, which cannot outlive the Profile 344 // outlive the Browser that contains it, which cannot outlive the Profile
377 // it is associated with. If that profile is an incognito profile, 345 // it is associated with. If that profile is an incognito profile,
378 // it cannot outlive its original profile. Thus this class should be 346 // it cannot outlive its original profile. Thus this class should be
379 // destroyed before a ManagerGoingDown() notification occurs. 347 // destroyed before a ManagerGoingDown() notification occurs.
380 NOTREACHED(); 348 NOTREACHED();
381 } 349 }
382 350
383 void DownloadsDOMHandler::HandleGetDownloads(const ListValue* args) { 351 void DownloadsDOMHandler::HandleGetDownloads(const base::ListValue* args) {
384 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_GET_DOWNLOADS); 352 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_GET_DOWNLOADS);
385 std::wstring new_search = UTF16ToWideHack(ExtractStringValue(args)); 353 search_text_ = UTF16ToWideHack(ExtractStringValue(args));
386 if (search_text_.compare(new_search) != 0) { 354 SendCurrentDownloads();
387 search_text_ = new_search;
388 ModelChanged(download_manager_);
389 } else {
390 SendCurrentDownloads();
391 }
392
393 download_manager_->CheckForHistoryFilesRemoval(); 355 download_manager_->CheckForHistoryFilesRemoval();
394 } 356 }
395 357
396 void DownloadsDOMHandler::HandleOpenFile(const ListValue* args) { 358 void DownloadsDOMHandler::HandleOpenFile(const base::ListValue* args) {
397 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_OPEN_FILE); 359 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_OPEN_FILE);
398 content::DownloadItem* file = GetDownloadByValue(args); 360 content::DownloadItem* file = GetDownloadByValue(args);
399 if (file) 361 if (file)
400 file->OpenDownload(); 362 file->OpenDownload();
401 } 363 }
402 364
403 void DownloadsDOMHandler::HandleDrag(const ListValue* args) { 365 void DownloadsDOMHandler::HandleDrag(const base::ListValue* args) {
404 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_DRAG); 366 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_DRAG);
405 content::DownloadItem* file = GetDownloadByValue(args); 367 content::DownloadItem* file = GetDownloadByValue(args);
406 if (file) { 368 if (!file)
407 IconManager* im = g_browser_process->icon_manager(); 369 return;
408 gfx::Image* icon = im->LookupIcon(file->GetUserVerifiedFilePath(), 370 IconManager* im = g_browser_process->icon_manager();
409 IconLoader::NORMAL); 371 gfx::Image* icon = im->LookupIcon(file->GetUserVerifiedFilePath(),
410 gfx::NativeView view = web_ui()->GetWebContents()->GetNativeView(); 372 IconLoader::NORMAL);
411 { 373 gfx::NativeView view = web_ui()->GetWebContents()->GetNativeView();
412 // Enable nested tasks during DnD, while |DragDownload()| blocks. 374 {
413 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); 375 // Enable nested tasks during DnD, while |DragDownload()| blocks.
414 download_util::DragDownload(file, icon, view); 376 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
415 } 377 download_util::DragDownload(file, icon, view);
416 } 378 }
417 } 379 }
418 380
419 void DownloadsDOMHandler::HandleSaveDangerous(const ListValue* args) { 381 void DownloadsDOMHandler::HandleSaveDangerous(const base::ListValue* args) {
420 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_SAVE_DANGEROUS); 382 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_SAVE_DANGEROUS);
421 content::DownloadItem* file = GetDownloadByValue(args); 383 content::DownloadItem* file = GetDownloadByValue(args);
422 if (file) 384 if (file)
423 ShowDangerPrompt(file); 385 ShowDangerPrompt(file);
424 // TODO(benjhayden): else ModelChanged()? Downloads might be able to disappear
425 // out from under us, so update our idea of the downloads as soon as possible.
Randy Smith (Not in Mondays) 2012/08/15 19:04:16 How does this end up working? Do we tear down the
benjhayden 2012/08/16 18:52:09 The danger prompt owns itself, so we hand it a wea
426 } 386 }
427 387
428 void DownloadsDOMHandler::HandleDiscardDangerous(const ListValue* args) { 388 void DownloadsDOMHandler::HandleDiscardDangerous(const base::ListValue* args) {
429 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_DISCARD_DANGEROUS); 389 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_DISCARD_DANGEROUS);
430 content::DownloadItem* file = GetDownloadByValue(args); 390 content::DownloadItem* file = GetDownloadByValue(args);
431 if (file) 391 if (file)
432 file->Delete(content::DownloadItem::DELETE_DUE_TO_USER_DISCARD); 392 file->Delete(content::DownloadItem::DELETE_DUE_TO_USER_DISCARD);
433 } 393 }
434 394
435 void DownloadsDOMHandler::HandleShow(const ListValue* args) { 395 void DownloadsDOMHandler::HandleShow(const base::ListValue* args) {
436 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_SHOW); 396 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_SHOW);
437 content::DownloadItem* file = GetDownloadByValue(args); 397 content::DownloadItem* file = GetDownloadByValue(args);
438 if (file) 398 if (file)
439 file->ShowDownloadInShell(); 399 file->ShowDownloadInShell();
440 } 400 }
441 401
442 void DownloadsDOMHandler::HandlePause(const ListValue* args) { 402 void DownloadsDOMHandler::HandlePause(const base::ListValue* args) {
443 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_PAUSE); 403 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_PAUSE);
444 content::DownloadItem* file = GetDownloadByValue(args); 404 content::DownloadItem* file = GetDownloadByValue(args);
445 if (file) 405 if (file)
446 file->TogglePause(); 406 file->TogglePause();
447 } 407 }
448 408
449 void DownloadsDOMHandler::HandleRemove(const ListValue* args) { 409 void DownloadsDOMHandler::HandleRemove(const base::ListValue* args) {
450 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_REMOVE); 410 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_REMOVE);
451 content::DownloadItem* file = GetDownloadByValue(args); 411 content::DownloadItem* file = GetDownloadByValue(args);
452 if (file) { 412 if (file) {
453 DCHECK(file->IsPersisted()); 413 DCHECK(file->IsPersisted());
454 file->Remove(); 414 file->Remove();
455 } 415 }
456 } 416 }
457 417
458 void DownloadsDOMHandler::HandleCancel(const ListValue* args) { 418 void DownloadsDOMHandler::HandleCancel(const base::ListValue* args) {
459 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_CANCEL); 419 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_CANCEL);
460 content::DownloadItem* file = GetDownloadByValue(args); 420 content::DownloadItem* file = GetDownloadByValue(args);
461 if (file) 421 if (file)
462 file->Cancel(true); 422 file->Cancel(true);
463 } 423 }
464 424
465 void DownloadsDOMHandler::HandleClearAll(const ListValue* args) { 425 void DownloadsDOMHandler::HandleClearAll(const base::ListValue* args) {
426 // TODO(benjhayden): Should this only clear items that match search_text_?
Randy Smith (Not in Mondays) 2012/08/15 19:04:16 I vote yes, but obviously not in this CL.
benjhayden 2012/08/16 18:52:09 Done.
466 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_CLEAR_ALL); 427 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_CLEAR_ALL);
467 download_manager_->RemoveAllDownloads(); 428 download_manager_->RemoveAllDownloads();
468 429
469 // If this is an incognito downloader, clear All should clear main download 430 // If this is an incognito downloader, clear All should clear main download
470 // manager as well. 431 // manager as well.
471 if (original_profile_download_manager_) 432 if (original_profile_download_manager_)
472 original_profile_download_manager_->RemoveAllDownloads(); 433 original_profile_download_manager_->RemoveAllDownloads();
473 } 434 }
474 435
475 void DownloadsDOMHandler::HandleOpenDownloadsFolder(const ListValue* args) { 436 void DownloadsDOMHandler::HandleOpenDownloadsFolder(
437 const base::ListValue* args) {
476 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_OPEN_FOLDER); 438 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_OPEN_FOLDER);
477 platform_util::OpenItem( 439 platform_util::OpenItem(
478 DownloadPrefs::FromDownloadManager(download_manager_)->DownloadPath()); 440 DownloadPrefs::FromDownloadManager(download_manager_)->DownloadPath());
479 } 441 }
480 442
481 // DownloadsDOMHandler, private: ---------------------------------------------- 443 // DownloadsDOMHandler, private: ----------------------------------------------
482 444
483 void DownloadsDOMHandler::SendCurrentDownloads() { 445 void DownloadsDOMHandler::SendCurrentDownloads() {
484 ListValue results_value; 446 update_scheduled_ = false;
485 for (OrderedDownloads::iterator it = download_items_.begin(); 447 content::DownloadManager::DownloadVector downloads;
486 it != download_items_.end(); ++it) { 448 SearchDownloads(&downloads);
487 if (!*it) 449 sort(downloads.begin(), downloads.end(), DownloadItemSorter());
488 continue; 450 base::ListValue results_value;
489 int index = static_cast<int>(it - download_items_.begin()); 451 for (content::DownloadManager::DownloadVector::const_iterator
490 if (index <= kMaxDownloads) 452 iter = downloads.begin();
491 results_value.Append(CreateDownloadItemValue(*it, index, IsItemIncognito( 453 iter != downloads.end(); ++iter) {
492 (*it)->GetId(), 454 // Filter out extension downloads.
455 if (!download_crx_util::IsExtensionDownload(**iter)) {
456 results_value.Append(CreateDownloadItemValue(*iter, IsItemIncognito(
457 (*iter)->GetId(),
493 download_manager_, 458 download_manager_,
494 original_profile_download_manager_))); 459 original_profile_download_manager_)));
460 }
461 if (results_value.GetSize() == kMaxDownloads)
462 break;
495 } 463 }
464 CallDownloadsList(results_value);
465 }
496 466
497 web_ui()->CallJavascriptFunction("downloadsList", results_value); 467 void DownloadsDOMHandler::SearchDownloads(
468 content::DownloadManager::DownloadVector* downloads) {
469 // TODO(benjhayden): Use DownloadQuery, simplify DownloadManager interface
470 download_manager_->SearchDownloads(WideToUTF16(search_text_), downloads);
471 if (original_profile_download_manager_) {
472 original_profile_download_manager_->SearchDownloads(
473 WideToUTF16(search_text_), downloads);
474 }
498 } 475 }
499 476
500 void DownloadsDOMHandler::ShowDangerPrompt( 477 void DownloadsDOMHandler::ShowDangerPrompt(
501 content::DownloadItem* dangerous_item) { 478 content::DownloadItem* dangerous_item) {
502 DownloadDangerPrompt* danger_prompt = DownloadDangerPrompt::Create( 479 DownloadDangerPrompt* danger_prompt = DownloadDangerPrompt::Create(
503 dangerous_item, 480 dangerous_item,
504 TabContents::FromWebContents(web_ui()->GetWebContents()), 481 TabContents::FromWebContents(GetWebUIWebContents()),
505 base::Bind(&DownloadsDOMHandler::DangerPromptAccepted, 482 base::Bind(&DownloadsDOMHandler::DangerPromptAccepted,
506 weak_ptr_factory_.GetWeakPtr(), dangerous_item->GetId()), 483 weak_ptr_factory_.GetWeakPtr(), dangerous_item->GetId()),
507 base::Closure()); 484 base::Closure());
508 // danger_prompt will delete itself. 485 // danger_prompt will delete itself.
509 DCHECK(danger_prompt); 486 DCHECK(danger_prompt);
510 } 487 }
511 488
512 void DownloadsDOMHandler::DangerPromptAccepted(int download_id) { 489 void DownloadsDOMHandler::DangerPromptAccepted(int download_id) {
513 content::DownloadItem* item = download_manager_->GetActiveDownloadItem( 490 content::DownloadItem* item = download_manager_->GetActiveDownloadItem(
514 download_id); 491 download_id);
515 if (!item) 492 if (!item)
516 return; 493 return;
517 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_SAVE_DANGEROUS); 494 CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_SAVE_DANGEROUS);
518 item->DangerousDownloadValidated(); 495 item->DangerousDownloadValidated();
519 } 496 }
520 497
521 void DownloadsDOMHandler::ClearDownloadItems() { 498 content::DownloadItem* DownloadsDOMHandler::GetDownloadByValue(
522 // Clear out old state and remove self as observer for each download. 499 const base::ListValue* args) {
523 for (OrderedDownloads::iterator it = download_items_.begin(); 500 int id = -1;
524 it != download_items_.end(); ++it) { 501 if (!ExtractIntegerValue(args, &id))
525 if (!*it) 502 return NULL;
526 continue; 503 content::DownloadItem* download = download_manager_->GetDownload(id);
527 (*it)->RemoveObserver(this); 504 if (download == NULL) {
505 download = original_profile_download_manager_->GetDownload(id);
528 } 506 }
529 download_items_.clear(); 507 return download;
530 } 508 }
531 509
532 content::DownloadItem* DownloadsDOMHandler::GetDownloadById(int id) { 510 content::WebContents* DownloadsDOMHandler::GetWebUIWebContents() {
533 for (OrderedDownloads::iterator it = download_items_.begin(); 511 return web_ui()->GetWebContents();
534 it != download_items_.end(); ++it) {
535 if (static_cast<int>(it - download_items_.begin() == id)) {
536 return (*it);
537 }
538 }
539
540 return NULL;
541 } 512 }
542 513
543 content::DownloadItem* DownloadsDOMHandler::GetDownloadByValue( 514 void DownloadsDOMHandler::CallDownloadsList(const base::ListValue& downloads) {
544 const ListValue* args) { 515 web_ui()->CallJavascriptFunction("downloadsList", downloads);
545 int id;
546 if (ExtractIntegerValue(args, &id)) {
547 return GetDownloadById(id);
548 }
549 return NULL;
550 } 516 }
517
518 void DownloadsDOMHandler::CallDownloadUpdated(const base::ListValue& download) {
519 web_ui()->CallJavascriptFunction("downloadUpdated", download);
520 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698