| Index: trunk/src/chrome/browser/download/download_target_determiner.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/download/download_target_determiner.cc (revision 233496)
|
| +++ trunk/src/chrome/browser/download/download_target_determiner.cc (working copy)
|
| @@ -23,16 +23,9 @@
|
| #include "content/public/browser/download_interrupt_reasons.h"
|
| #include "extensions/common/constants.h"
|
| #include "grit/generated_resources.h"
|
| -#include "net/base/mime_util.h"
|
| #include "net/base/net_util.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| -#if defined(ENABLE_PLUGINS)
|
| -#include "chrome/browser/plugins/plugin_prefs.h"
|
| -#include "content/public/browser/plugin_service.h"
|
| -#include "content/public/common/webplugininfo.h"
|
| -#endif
|
| -
|
| using content::BrowserThread;
|
| using content::DownloadItem;
|
|
|
| @@ -58,11 +51,6 @@
|
|
|
| } // namespace
|
|
|
| -DownloadTargetInfo::DownloadTargetInfo()
|
| - : is_filetype_handled_securely(false) {}
|
| -
|
| -DownloadTargetInfo::~DownloadTargetInfo() {}
|
| -
|
| DownloadTargetDeterminerDelegate::~DownloadTargetDeterminerDelegate() {
|
| }
|
|
|
| @@ -71,7 +59,7 @@
|
| const base::FilePath& initial_virtual_path,
|
| DownloadPrefs* download_prefs,
|
| DownloadTargetDeterminerDelegate* delegate,
|
| - const CompletionCallback& callback)
|
| + const content::DownloadTargetCallback& callback)
|
| : next_state_(STATE_GENERATE_TARGET_PATH),
|
| should_prompt_(false),
|
| should_notify_extensions_(false),
|
| @@ -79,7 +67,6 @@
|
| conflict_action_(DownloadPathReservationTracker::OVERWRITE),
|
| danger_type_(download->GetDangerType()),
|
| virtual_path_(initial_virtual_path),
|
| - is_filetype_handled_securely_(false),
|
| download_(download),
|
| is_resumption_(download_->GetLastReason() !=
|
| content::DOWNLOAD_INTERRUPT_REASON_NONE &&
|
| @@ -125,12 +112,6 @@
|
| case STATE_DETERMINE_LOCAL_PATH:
|
| result = DoDetermineLocalPath();
|
| break;
|
| - case STATE_DETERMINE_MIME_TYPE:
|
| - result = DoDetermineMimeType();
|
| - break;
|
| - case STATE_DETERMINE_IF_HANDLED_BY_BROWSER:
|
| - result = DoDetermineIfHandledByBrowser();
|
| - break;
|
| case STATE_CHECK_DOWNLOAD_URL:
|
| result = DoCheckDownloadUrl();
|
| break;
|
| @@ -324,7 +305,7 @@
|
| DCHECK(!virtual_path_.empty());
|
| DCHECK(local_path_.empty());
|
|
|
| - next_state_ = STATE_DETERMINE_MIME_TYPE;
|
| + next_state_ = STATE_CHECK_DOWNLOAD_URL;
|
|
|
| delegate_->DetermineLocalPath(
|
| download_,
|
| @@ -348,126 +329,6 @@
|
| }
|
|
|
| DownloadTargetDeterminer::Result
|
| - DownloadTargetDeterminer::DoDetermineMimeType() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!virtual_path_.empty());
|
| - DCHECK(!local_path_.empty());
|
| - DCHECK(mime_type_.empty());
|
| -
|
| - next_state_ = STATE_DETERMINE_IF_HANDLED_BY_BROWSER;
|
| -
|
| - if (virtual_path_ == local_path_) {
|
| - delegate_->GetFileMimeType(
|
| - local_path_,
|
| - base::Bind(&DownloadTargetDeterminer::DetermineMimeTypeDone,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return QUIT_DOLOOP;
|
| - }
|
| - return CONTINUE;
|
| -}
|
| -
|
| -void DownloadTargetDeterminer::DetermineMimeTypeDone(
|
| - const std::string& mime_type) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DVLOG(20) << "MIME type: " << mime_type;
|
| - mime_type_ = mime_type;
|
| - DoLoop();
|
| -}
|
| -
|
| -#if defined(ENABLE_PLUGINS)
|
| -// The code below is used by DoDetermineIfHandledByBrowser to determine if the
|
| -// file type is handled by a sandboxed plugin.
|
| -namespace {
|
| -
|
| -typedef std::vector<content::WebPluginInfo> PluginVector;
|
| -
|
| -// Returns true if there is a plugin in |plugins| that is sandboxed and enabled
|
| -// for |profile|.
|
| -bool IsSafePluginAvailableForProfile(scoped_ptr<PluginVector> plugins,
|
| - Profile* profile) {
|
| - using content::WebPluginInfo;
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (plugins->size() == 0)
|
| - return false;
|
| -
|
| - scoped_refptr<PluginPrefs> plugin_prefs = PluginPrefs::GetForProfile(profile);
|
| - if (!plugin_prefs)
|
| - return false;
|
| -
|
| - for (PluginVector::iterator plugin = plugins->begin();
|
| - plugin != plugins->end(); ++plugin) {
|
| - if (plugin_prefs->IsPluginEnabled(*plugin) &&
|
| - (plugin->type == WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS ||
|
| - plugin->type == WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS))
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// Returns a callback that determines if a sandboxed plugin is available to
|
| -// handle |mime_type| for a specific profile. The returned callback must be
|
| -// invoked on the UI thread, while this function should be called on the IO
|
| -// thread.
|
| -base::Callback<bool(Profile*)> GetSafePluginChecker(
|
| - const GURL& url,
|
| - const std::string& mime_type) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - DCHECK(!mime_type.empty());
|
| -
|
| - scoped_ptr<PluginVector> plugins(new PluginVector);
|
| - content::PluginService* plugin_service =
|
| - content::PluginService::GetInstance();
|
| - if (plugin_service)
|
| - plugin_service->GetPluginInfoArray(
|
| - url, mime_type, false, plugins.get(), NULL);
|
| - return base::Bind(&IsSafePluginAvailableForProfile, base::Passed(&plugins));
|
| -}
|
| -
|
| -} // namespace
|
| -#endif // ENABLE_PLUGINS
|
| -
|
| -DownloadTargetDeterminer::Result
|
| - DownloadTargetDeterminer::DoDetermineIfHandledByBrowser() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!virtual_path_.empty());
|
| - DCHECK(!local_path_.empty());
|
| - DCHECK(!is_filetype_handled_securely_);
|
| -
|
| - next_state_ = STATE_CHECK_DOWNLOAD_URL;
|
| -
|
| - if (mime_type_.empty())
|
| - return CONTINUE;
|
| -
|
| - if (net::IsSupportedMimeType(mime_type_)) {
|
| - is_filetype_handled_securely_ = true;
|
| - return CONTINUE;
|
| - }
|
| -
|
| -#if defined(ENABLE_PLUGINS)
|
| - BrowserThread::PostTaskAndReplyWithResult(
|
| - BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&GetSafePluginChecker,
|
| - net::FilePathToFileURL(local_path_), mime_type_),
|
| - base::Bind(&DownloadTargetDeterminer::DetermineIfHandledByBrowserDone,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return QUIT_DOLOOP;
|
| -#else
|
| - return CONTINUE;
|
| -#endif
|
| -}
|
| -
|
| -void DownloadTargetDeterminer::DetermineIfHandledByBrowserDone(
|
| - const base::Callback<bool(Profile*)>& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - is_filetype_handled_securely_ = callback.Run(GetProfile());
|
| - DVLOG(20) << "Is file type handled securely: "
|
| - << is_filetype_handled_securely_;
|
| - DoLoop();
|
| -}
|
| -
|
| -DownloadTargetDeterminer::Result
|
| DownloadTargetDeterminer::DoCheckDownloadUrl() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!virtual_path_.empty());
|
| @@ -623,20 +484,15 @@
|
| << " Intermediate:" << intermediate_path_.AsUTF8Unsafe()
|
| << " Should prompt:" << should_prompt_
|
| << " Danger type:" << danger_type_;
|
| - scoped_ptr<DownloadTargetInfo> target_info(new DownloadTargetInfo);
|
| -
|
| - target_info->target_path = local_path_;
|
| - target_info->target_disposition =
|
| - (HasPromptedForPath() || should_prompt_
|
| - ? DownloadItem::TARGET_DISPOSITION_PROMPT
|
| - : DownloadItem::TARGET_DISPOSITION_OVERWRITE);
|
| - target_info->danger_type = danger_type_;
|
| - target_info->intermediate_path = intermediate_path_;
|
| - target_info->mime_type = mime_type_;
|
| - target_info->is_filetype_handled_securely = is_filetype_handled_securely_;
|
| -
|
| base::MessageLoop::current()->PostTask(
|
| - FROM_HERE, base::Bind(completion_callback_, base::Passed(&target_info)));
|
| + FROM_HERE,
|
| + base::Bind(completion_callback_,
|
| + local_path_,
|
| + (HasPromptedForPath() || should_prompt_
|
| + ? DownloadItem::TARGET_DISPOSITION_PROMPT
|
| + : DownloadItem::TARGET_DISPOSITION_OVERWRITE),
|
| + danger_type_,
|
| + intermediate_path_));
|
| completion_callback_.Reset();
|
| delete this;
|
| }
|
| @@ -775,11 +631,12 @@
|
| }
|
|
|
| // static
|
| -void DownloadTargetDeterminer::Start(content::DownloadItem* download,
|
| - const base::FilePath& initial_virtual_path,
|
| - DownloadPrefs* download_prefs,
|
| - DownloadTargetDeterminerDelegate* delegate,
|
| - const CompletionCallback& callback) {
|
| +void DownloadTargetDeterminer::Start(
|
| + content::DownloadItem* download,
|
| + const base::FilePath& initial_virtual_path,
|
| + DownloadPrefs* download_prefs,
|
| + DownloadTargetDeterminerDelegate* delegate,
|
| + const content::DownloadTargetCallback& callback) {
|
| // DownloadTargetDeterminer owns itself and will self destruct when the job is
|
| // complete or the download item is destroyed. The callback is always invoked
|
| // asynchronously.
|
|
|