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

Side by Side Diff: chrome/browser/download/download_target_determiner.cc

Issue 324593004: Windows: Add an "Open in Adobe Reader" menu item for PDF files in the download shelf. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix merge Created 6 years, 5 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_target_determiner.h" 5 #include "chrome/browser/download/download_target_determiner.h"
6 6
7 #include "base/prefs/pref_service.h" 7 #include "base/prefs/pref_service.h"
8 #include "base/rand_util.h" 8 #include "base/rand_util.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 18 matching lines...) Expand all
29 #include "chrome/browser/extensions/webstore_installer.h" 29 #include "chrome/browser/extensions/webstore_installer.h"
30 #include "extensions/common/feature_switch.h" 30 #include "extensions/common/feature_switch.h"
31 #endif 31 #endif
32 32
33 #if defined(ENABLE_PLUGINS) 33 #if defined(ENABLE_PLUGINS)
34 #include "chrome/browser/plugins/plugin_prefs.h" 34 #include "chrome/browser/plugins/plugin_prefs.h"
35 #include "content/public/browser/plugin_service.h" 35 #include "content/public/browser/plugin_service.h"
36 #include "content/public/common/webplugininfo.h" 36 #include "content/public/common/webplugininfo.h"
37 #endif 37 #endif
38 38
39 #if defined(OS_WIN)
40 #include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
41 #endif
42
39 using content::BrowserThread; 43 using content::BrowserThread;
40 using content::DownloadItem; 44 using content::DownloadItem;
41 45
42 namespace { 46 namespace {
43 47
44 const base::FilePath::CharType kCrdownloadSuffix[] = 48 const base::FilePath::CharType kCrdownloadSuffix[] =
45 FILE_PATH_LITERAL(".crdownload"); 49 FILE_PATH_LITERAL(".crdownload");
46 50
47 // Condenses the results from HistoryService::GetVisibleVisitCountToHost() to a 51 // Condenses the results from HistoryService::GetVisibleVisitCountToHost() to a
48 // single bool. A host is considered visited before if prior visible visits were 52 // single bool. A host is considered visited before if prior visible visits were
49 // found in history and the first such visit was earlier than the most recent 53 // found in history and the first such visit was earlier than the most recent
50 // midnight. 54 // midnight.
51 void VisitCountsToVisitedBefore( 55 void VisitCountsToVisitedBefore(
52 const base::Callback<void(bool)>& callback, 56 const base::Callback<void(bool)>& callback,
53 HistoryService::Handle unused_handle, 57 HistoryService::Handle unused_handle,
54 bool found_visits, 58 bool found_visits,
55 int count, 59 int count,
56 base::Time first_visit) { 60 base::Time first_visit) {
57 callback.Run( 61 callback.Run(
58 found_visits && count > 0 && 62 found_visits && count > 0 &&
59 (first_visit.LocalMidnight() < base::Time::Now().LocalMidnight())); 63 (first_visit.LocalMidnight() < base::Time::Now().LocalMidnight()));
60 } 64 }
61 65
62 } // namespace 66 #if defined(OS_WIN)
67 // Keeps track of whether Adobe Reader is up to date.
68 bool g_is_adobe_reader_up_to_date_ = false;
69 #endif
70
71 } // namespace
63 72
64 DownloadTargetInfo::DownloadTargetInfo() 73 DownloadTargetInfo::DownloadTargetInfo()
65 : is_filetype_handled_safely(false) {} 74 : is_filetype_handled_safely(false) {}
66 75
67 DownloadTargetInfo::~DownloadTargetInfo() {} 76 DownloadTargetInfo::~DownloadTargetInfo() {}
68 77
69 DownloadTargetDeterminerDelegate::~DownloadTargetDeterminerDelegate() { 78 DownloadTargetDeterminerDelegate::~DownloadTargetDeterminerDelegate() {
70 } 79 }
71 80
72 DownloadTargetDeterminer::DownloadTargetDeterminer( 81 DownloadTargetDeterminer::DownloadTargetDeterminer(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 break; 136 break;
128 case STATE_DETERMINE_LOCAL_PATH: 137 case STATE_DETERMINE_LOCAL_PATH:
129 result = DoDetermineLocalPath(); 138 result = DoDetermineLocalPath();
130 break; 139 break;
131 case STATE_DETERMINE_MIME_TYPE: 140 case STATE_DETERMINE_MIME_TYPE:
132 result = DoDetermineMimeType(); 141 result = DoDetermineMimeType();
133 break; 142 break;
134 case STATE_DETERMINE_IF_HANDLED_SAFELY_BY_BROWSER: 143 case STATE_DETERMINE_IF_HANDLED_SAFELY_BY_BROWSER:
135 result = DoDetermineIfHandledSafely(); 144 result = DoDetermineIfHandledSafely();
136 break; 145 break;
146 case STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE:
147 result = DoDetermineIfAdobeReaderUpToDate();
148 break;
137 case STATE_CHECK_DOWNLOAD_URL: 149 case STATE_CHECK_DOWNLOAD_URL:
138 result = DoCheckDownloadUrl(); 150 result = DoCheckDownloadUrl();
139 break; 151 break;
140 case STATE_DETERMINE_INTERMEDIATE_PATH: 152 case STATE_DETERMINE_INTERMEDIATE_PATH:
141 result = DoDetermineIntermediatePath(); 153 result = DoDetermineIntermediatePath();
142 break; 154 break;
143 case STATE_CHECK_VISITED_REFERRER_BEFORE: 155 case STATE_CHECK_VISITED_REFERRER_BEFORE:
144 result = DoCheckVisitedReferrerBefore(); 156 result = DoCheckVisitedReferrerBefore();
145 break; 157 break;
146 case STATE_NONE: 158 case STATE_NONE:
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 // In practice, we assume that retrying once is enough. 455 // In practice, we assume that retrying once is enough.
444 DCHECK(!is_stale); 456 DCHECK(!is_stale);
445 bool is_handled_safely = 457 bool is_handled_safely =
446 plugin_found && 458 plugin_found &&
447 (plugin_info.type == WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS || 459 (plugin_info.type == WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS ||
448 plugin_info.type == WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS); 460 plugin_info.type == WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS);
449 BrowserThread::PostTask( 461 BrowserThread::PostTask(
450 BrowserThread::UI, FROM_HERE, base::Bind(callback, is_handled_safely)); 462 BrowserThread::UI, FROM_HERE, base::Bind(callback, is_handled_safely));
451 } 463 }
452 464
453 } // namespace 465 } // namespace
454 #endif // ENABLE_PLUGINS 466 #endif // defined(ENABLE_PLUGINS)
455 467
456 DownloadTargetDeterminer::Result 468 DownloadTargetDeterminer::Result
457 DownloadTargetDeterminer::DoDetermineIfHandledSafely() { 469 DownloadTargetDeterminer::DoDetermineIfHandledSafely() {
458 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 470 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
459 DCHECK(!virtual_path_.empty()); 471 DCHECK(!virtual_path_.empty());
460 DCHECK(!local_path_.empty()); 472 DCHECK(!local_path_.empty());
461 DCHECK(!is_filetype_handled_safely_); 473 DCHECK(!is_filetype_handled_safely_);
462 474
463 next_state_ = STATE_CHECK_DOWNLOAD_URL; 475 next_state_ = STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE;
464 476
465 if (mime_type_.empty()) 477 if (mime_type_.empty())
466 return CONTINUE; 478 return CONTINUE;
467 479
468 if (net::IsSupportedMimeType(mime_type_)) { 480 if (net::IsSupportedMimeType(mime_type_)) {
469 is_filetype_handled_safely_ = true; 481 is_filetype_handled_safely_ = true;
470 return CONTINUE; 482 return CONTINUE;
471 } 483 }
472 484
473 #if defined(ENABLE_PLUGINS) 485 #if defined(ENABLE_PLUGINS)
474 BrowserThread::PostTask( 486 BrowserThread::PostTask(
475 BrowserThread::IO, 487 BrowserThread::IO,
476 FROM_HERE, 488 FROM_HERE,
477 base::Bind( 489 base::Bind(
478 &IsHandledBySafePlugin, 490 &IsHandledBySafePlugin,
479 GetProfile()->GetResourceContext(), 491 GetProfile()->GetResourceContext(),
480 net::FilePathToFileURL(local_path_), 492 net::FilePathToFileURL(local_path_),
481 mime_type_, 493 mime_type_,
482 RETRY_IF_STALE_PLUGIN_LIST, 494 RETRY_IF_STALE_PLUGIN_LIST,
483 base::Bind(&DownloadTargetDeterminer::DetermineIfHandledSafelyDone, 495 base::Bind(&DownloadTargetDeterminer::DetermineIfHandledSafelyDone,
484 weak_ptr_factory_.GetWeakPtr()))); 496 weak_ptr_factory_.GetWeakPtr())));
485 return QUIT_DOLOOP; 497 return QUIT_DOLOOP;
486 #else 498 #else
487 return CONTINUE; 499 return CONTINUE;
488 #endif 500 #endif
489 } 501 }
490 502
503 #if defined(ENABLE_PLUGINS)
491 void DownloadTargetDeterminer::DetermineIfHandledSafelyDone( 504 void DownloadTargetDeterminer::DetermineIfHandledSafelyDone(
492 bool is_handled_safely) { 505 bool is_handled_safely) {
493 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
494 DVLOG(20) << "Is file type handled safely: " << is_filetype_handled_safely_; 507 DVLOG(20) << "Is file type handled safely: " << is_filetype_handled_safely_;
495 DCHECK_EQ(STATE_CHECK_DOWNLOAD_URL, next_state_); 508 DCHECK_EQ(STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE, next_state_);
496 is_filetype_handled_safely_ = is_handled_safely; 509 is_filetype_handled_safely_ = is_handled_safely;
497 DoLoop(); 510 DoLoop();
498 } 511 }
512 #endif
513
514 DownloadTargetDeterminer::Result
515 DownloadTargetDeterminer::DoDetermineIfAdobeReaderUpToDate() {
516 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
517
518 next_state_ = STATE_CHECK_DOWNLOAD_URL;
519
520 #if defined(OS_WIN)
521 if (!local_path_.MatchesExtension(FILE_PATH_LITERAL(".pdf")))
522 return CONTINUE;
523 if (!IsAdobeReaderDefaultPDFViewer())
524 return CONTINUE;
525
526 base::PostTaskAndReplyWithResult(
527 BrowserThread::GetBlockingPool(),
528 FROM_HERE,
529 base::Bind(&::IsAdobeReaderUpToDate),
530 base::Bind(&DownloadTargetDeterminer::DetermineIfAdobeReaderUpToDateDone,
531 weak_ptr_factory_.GetWeakPtr()));
532 return QUIT_DOLOOP;
533 #else
534 return CONTINUE;
535 #endif
536 }
537
538 #if defined(OS_WIN)
539 void DownloadTargetDeterminer::DetermineIfAdobeReaderUpToDateDone(
540 bool adobe_reader_up_to_date) {
541 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
542 DVLOG(20) << "Is Adobe Reader Up To Date: " << adobe_reader_up_to_date;
543 DCHECK_EQ(STATE_CHECK_DOWNLOAD_URL, next_state_);
544 g_is_adobe_reader_up_to_date_ = adobe_reader_up_to_date;
545 DoLoop();
546 }
547 #endif
499 548
500 DownloadTargetDeterminer::Result 549 DownloadTargetDeterminer::Result
501 DownloadTargetDeterminer::DoCheckDownloadUrl() { 550 DownloadTargetDeterminer::DoCheckDownloadUrl() {
502 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 551 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
503 DCHECK(!virtual_path_.empty()); 552 DCHECK(!virtual_path_.empty());
504 next_state_ = STATE_CHECK_VISITED_REFERRER_BEFORE; 553 next_state_ = STATE_CHECK_VISITED_REFERRER_BEFORE;
505 delegate_->CheckDownloadUrl( 554 delegate_->CheckDownloadUrl(
506 download_, 555 download_,
507 virtual_path_, 556 virtual_path_,
508 base::Bind(&DownloadTargetDeterminer::CheckDownloadUrlDone, 557 base::Bind(&DownloadTargetDeterminer::CheckDownloadUrlDone,
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 // asynchronously. 868 // asynchronously.
820 new DownloadTargetDeterminer(download, initial_virtual_path, download_prefs, 869 new DownloadTargetDeterminer(download, initial_virtual_path, download_prefs,
821 delegate, callback); 870 delegate, callback);
822 } 871 }
823 872
824 // static 873 // static
825 base::FilePath DownloadTargetDeterminer::GetCrDownloadPath( 874 base::FilePath DownloadTargetDeterminer::GetCrDownloadPath(
826 const base::FilePath& suggested_path) { 875 const base::FilePath& suggested_path) {
827 return base::FilePath(suggested_path.value() + kCrdownloadSuffix); 876 return base::FilePath(suggested_path.value() + kCrdownloadSuffix);
828 } 877 }
878
879 #if defined(OS_WIN)
880 // static
881 bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() {
882 return g_is_adobe_reader_up_to_date_;
883 }
884 #endif
OLDNEW
« no previous file with comments | « chrome/browser/download/download_target_determiner.h ('k') | chrome/browser/ui/pdf/adobe_reader_info_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698