Commit b89dd522 authored by Anand K. Mistry's avatar Anand K. Mistry Committed by Commit Bot

[Extensions Functions] Migrate downloads API to ExtensionFunction

Bug: 634140
Change-Id: I01af9fec6cdce911b2111bdebcb6a8ac1269d272
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2066460Reviewed-by: default avatarXing Liu <xingliu@chromium.org>
Commit-Queue: Anand Mistry <amistry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743398}
parent 91e8d762
...@@ -1009,15 +1009,16 @@ DownloadsDownloadFunction::DownloadsDownloadFunction() {} ...@@ -1009,15 +1009,16 @@ DownloadsDownloadFunction::DownloadsDownloadFunction() {}
DownloadsDownloadFunction::~DownloadsDownloadFunction() {} DownloadsDownloadFunction::~DownloadsDownloadFunction() {}
bool DownloadsDownloadFunction::RunAsync() { ExtensionFunction::ResponseAction DownloadsDownloadFunction::Run() {
std::unique_ptr<downloads::Download::Params> params( std::unique_ptr<downloads::Download::Params> params(
downloads::Download::Params::Create(*args_)); downloads::Download::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
const downloads::DownloadOptions& options = params->options; const downloads::DownloadOptions& options = params->options;
GURL download_url(options.url); GURL download_url(options.url);
std::string error;
if (Fault(!download_url.is_valid(), download_extension_errors::kInvalidURL, if (Fault(!download_url.is_valid(), download_extension_errors::kInvalidURL,
&error_)) &error))
return false; return RespondNow(Error(error));
net::NetworkTrafficAnnotationTag traffic_annotation = net::NetworkTrafficAnnotationTag traffic_annotation =
net::DefineNetworkTrafficAnnotation("downloads_api_run_async", R"( net::DefineNetworkTrafficAnnotation("downloads_api_run_async", R"(
...@@ -1070,8 +1071,7 @@ bool DownloadsDownloadFunction::RunAsync() { ...@@ -1070,8 +1071,7 @@ bool DownloadsDownloadFunction::RunAsync() {
creator_suggested_filename = base::FilePath(*options.filename); creator_suggested_filename = base::FilePath(*options.filename);
#endif #endif
if (!net::IsSafePortableRelativePath(creator_suggested_filename)) { if (!net::IsSafePortableRelativePath(creator_suggested_filename)) {
error_ = download_extension_errors::kInvalidFilename; return RespondNow(Error(download_extension_errors::kInvalidFilename));
return false;
} }
} }
...@@ -1081,16 +1081,15 @@ bool DownloadsDownloadFunction::RunAsync() { ...@@ -1081,16 +1081,15 @@ bool DownloadsDownloadFunction::RunAsync() {
if (options.headers.get()) { if (options.headers.get()) {
for (const downloads::HeaderNameValuePair& name_value : *options.headers) { for (const downloads::HeaderNameValuePair& name_value : *options.headers) {
if (!net::HttpUtil::IsValidHeaderName(name_value.name)) { if (!net::HttpUtil::IsValidHeaderName(name_value.name)) {
error_ = download_extension_errors::kInvalidHeaderName; return RespondNow(Error(download_extension_errors::kInvalidHeaderName));
return false;
} }
if (!net::HttpUtil::IsSafeHeader(name_value.name)) { if (!net::HttpUtil::IsSafeHeader(name_value.name)) {
error_ = download_extension_errors::kInvalidHeaderUnsafe; return RespondNow(
return false; Error(download_extension_errors::kInvalidHeaderUnsafe));
} }
if (!net::HttpUtil::IsValidHeaderValue(name_value.value)) { if (!net::HttpUtil::IsValidHeaderValue(name_value.value)) {
error_ = download_extension_errors::kInvalidHeaderValue; return RespondNow(
return false; Error(download_extension_errors::kInvalidHeaderValue));
} }
download_params->add_request_header(name_value.name, name_value.value); download_params->add_request_header(name_value.name, name_value.value);
} }
...@@ -1113,11 +1112,12 @@ bool DownloadsDownloadFunction::RunAsync() { ...@@ -1113,11 +1112,12 @@ bool DownloadsDownloadFunction::RunAsync() {
download_params->set_do_not_prompt_for_login(true); download_params->set_do_not_prompt_for_login(true);
download_params->set_download_source(download::DownloadSource::EXTENSION_API); download_params->set_download_source(download::DownloadSource::EXTENSION_API);
DownloadManager* manager = BrowserContext::GetDownloadManager(GetProfile()); DownloadManager* manager =
BrowserContext::GetDownloadManager(browser_context());
manager->DownloadUrl(std::move(download_params)); manager->DownloadUrl(std::move(download_params));
RecordApiFunctions(DOWNLOADS_FUNCTION_DOWNLOAD); RecordApiFunctions(DOWNLOADS_FUNCTION_DOWNLOAD);
return true; return RespondLater();
} }
void DownloadsDownloadFunction::OnStarted( void DownloadsDownloadFunction::OnStarted(
...@@ -1129,7 +1129,8 @@ void DownloadsDownloadFunction::OnStarted( ...@@ -1129,7 +1129,8 @@ void DownloadsDownloadFunction::OnStarted(
VLOG(1) << __func__ << " " << item << " " << interrupt_reason; VLOG(1) << __func__ << " " << item << " " << interrupt_reason;
if (item) { if (item) {
DCHECK_EQ(download::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); DCHECK_EQ(download::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason);
SetResult(std::make_unique<base::Value>(static_cast<int>(item->GetId()))); Respond(OneArgument(
std::make_unique<base::Value>(static_cast<int>(item->GetId()))));
if (!creator_suggested_filename.empty() || if (!creator_suggested_filename.empty() ||
(creator_conflict_action != (creator_conflict_action !=
downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY)) { downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY)) {
...@@ -1147,9 +1148,8 @@ void DownloadsDownloadFunction::OnStarted( ...@@ -1147,9 +1148,8 @@ void DownloadsDownloadFunction::OnStarted(
item->UpdateObservers(); item->UpdateObservers();
} else { } else {
DCHECK_NE(download::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); DCHECK_NE(download::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason);
error_ = download::DownloadInterruptReasonToString(interrupt_reason); Respond(Error(download::DownloadInterruptReasonToString(interrupt_reason)));
} }
SendResponse(error_.empty());
} }
DownloadsSearchFunction::DownloadsSearchFunction() {} DownloadsSearchFunction::DownloadsSearchFunction() {}
...@@ -1297,30 +1297,32 @@ DownloadsRemoveFileFunction::DownloadsRemoveFileFunction() { ...@@ -1297,30 +1297,32 @@ DownloadsRemoveFileFunction::DownloadsRemoveFileFunction() {
DownloadsRemoveFileFunction::~DownloadsRemoveFileFunction() { DownloadsRemoveFileFunction::~DownloadsRemoveFileFunction() {
} }
bool DownloadsRemoveFileFunction::RunAsync() { ExtensionFunction::ResponseAction DownloadsRemoveFileFunction::Run() {
std::unique_ptr<downloads::RemoveFile::Params> params( std::unique_ptr<downloads::RemoveFile::Params> params(
downloads::RemoveFile::Params::Create(*args_)); downloads::RemoveFile::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
DownloadItem* download_item = GetDownload( DownloadItem* download_item = GetDownload(
browser_context(), include_incognito_information(), params->download_id); browser_context(), include_incognito_information(), params->download_id);
if (InvalidId(download_item, &error_) || std::string error;
if (InvalidId(download_item, &error) ||
Fault((download_item->GetState() != DownloadItem::COMPLETE), Fault((download_item->GetState() != DownloadItem::COMPLETE),
download_extension_errors::kNotComplete, &error_) || download_extension_errors::kNotComplete, &error) ||
Fault(download_item->GetFileExternallyRemoved(), Fault(download_item->GetFileExternallyRemoved(),
download_extension_errors::kFileAlreadyDeleted, &error_)) download_extension_errors::kFileAlreadyDeleted, &error))
return false; return RespondNow(Error(error));
RecordApiFunctions(DOWNLOADS_FUNCTION_REMOVE_FILE); RecordApiFunctions(DOWNLOADS_FUNCTION_REMOVE_FILE);
download_item->DeleteFile( download_item->DeleteFile(
base::Bind(&DownloadsRemoveFileFunction::Done, this)); base::Bind(&DownloadsRemoveFileFunction::Done, this));
return true; return RespondLater();
} }
void DownloadsRemoveFileFunction::Done(bool success) { void DownloadsRemoveFileFunction::Done(bool success) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!success) { if (!success) {
error_ = download_extension_errors::kFileNotRemoved; Respond(Error(download_extension_errors::kFileNotRemoved));
} else {
Respond(NoArguments());
} }
SendResponse(error_.empty());
} }
DownloadsAcceptDangerFunction::DownloadsAcceptDangerFunction() {} DownloadsAcceptDangerFunction::DownloadsAcceptDangerFunction() {}
...@@ -1330,26 +1332,27 @@ DownloadsAcceptDangerFunction::~DownloadsAcceptDangerFunction() {} ...@@ -1330,26 +1332,27 @@ DownloadsAcceptDangerFunction::~DownloadsAcceptDangerFunction() {}
DownloadsAcceptDangerFunction::OnPromptCreatedCallback* DownloadsAcceptDangerFunction::OnPromptCreatedCallback*
DownloadsAcceptDangerFunction::on_prompt_created_ = NULL; DownloadsAcceptDangerFunction::on_prompt_created_ = NULL;
bool DownloadsAcceptDangerFunction::RunAsync() { ExtensionFunction::ResponseAction DownloadsAcceptDangerFunction::Run() {
std::unique_ptr<downloads::AcceptDanger::Params> params( std::unique_ptr<downloads::AcceptDanger::Params> params(
downloads::AcceptDanger::Params::Create(*args_)); downloads::AcceptDanger::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
PromptOrWait(params->download_id, 10); PromptOrWait(params->download_id, 10);
return true; return RespondLater();
} }
void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) { void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
DownloadItem* download_item = GetDownload( DownloadItem* download_item = GetDownload(
browser_context(), include_incognito_information(), download_id); browser_context(), include_incognito_information(), download_id);
content::WebContents* web_contents = dispatcher()->GetVisibleWebContents(); content::WebContents* web_contents = dispatcher()->GetVisibleWebContents();
if (InvalidId(download_item, &error_) || std::string error;
if (InvalidId(download_item, &error) ||
Fault(download_item->GetState() != DownloadItem::IN_PROGRESS, Fault(download_item->GetState() != DownloadItem::IN_PROGRESS,
download_extension_errors::kNotInProgress, &error_) || download_extension_errors::kNotInProgress, &error) ||
Fault(!download_item->IsDangerous(), Fault(!download_item->IsDangerous(),
download_extension_errors::kNotDangerous, &error_) || download_extension_errors::kNotDangerous, &error) ||
Fault(!web_contents, download_extension_errors::kInvisibleContext, Fault(!web_contents, download_extension_errors::kInvisibleContext,
&error_)) { &error)) {
SendResponse(error_.empty()); Respond(Error(error));
return; return;
} }
bool visible = platform_util::IsVisible(web_contents->GetNativeView()); bool visible = platform_util::IsVisible(web_contents->GetNativeView());
...@@ -1362,8 +1365,7 @@ void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) { ...@@ -1362,8 +1365,7 @@ void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
base::TimeDelta::FromMilliseconds(100)); base::TimeDelta::FromMilliseconds(100));
return; return;
} }
error_ = download_extension_errors::kInvisibleContext; Respond(Error(download_extension_errors::kInvisibleContext));
SendResponse(false);
return; return;
} }
RecordApiFunctions(DOWNLOADS_FUNCTION_ACCEPT_DANGER); RecordApiFunctions(DOWNLOADS_FUNCTION_ACCEPT_DANGER);
...@@ -1386,10 +1388,13 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback( ...@@ -1386,10 +1388,13 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback(
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
DownloadItem* download_item = GetDownload( DownloadItem* download_item = GetDownload(
browser_context(), include_incognito_information(), download_id); browser_context(), include_incognito_information(), download_id);
if (InvalidId(download_item, &error_) || std::string error;
if (InvalidId(download_item, &error) ||
Fault(download_item->GetState() != DownloadItem::IN_PROGRESS, Fault(download_item->GetState() != DownloadItem::IN_PROGRESS,
download_extension_errors::kNotInProgress, &error_)) download_extension_errors::kNotInProgress, &error)) {
Respond(Error(error));
return; return;
}
switch (action) { switch (action) {
case DownloadDangerPrompt::ACCEPT: case DownloadDangerPrompt::ACCEPT:
download_item->ValidateDangerousDownload(); download_item->ValidateDangerousDownload();
...@@ -1400,7 +1405,7 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback( ...@@ -1400,7 +1405,7 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback(
case DownloadDangerPrompt::DISMISS: case DownloadDangerPrompt::DISMISS:
break; break;
} }
SendResponse(error_.empty()); Respond(NoArguments());
} }
DownloadsShowFunction::DownloadsShowFunction() {} DownloadsShowFunction::DownloadsShowFunction() {}
...@@ -1580,7 +1585,7 @@ void DownloadsGetFileIconFunction::SetIconExtractorForTesting( ...@@ -1580,7 +1585,7 @@ void DownloadsGetFileIconFunction::SetIconExtractorForTesting(
icon_extractor_.reset(extractor); icon_extractor_.reset(extractor);
} }
bool DownloadsGetFileIconFunction::RunAsync() { ExtensionFunction::ResponseAction DownloadsGetFileIconFunction::Run() {
std::unique_ptr<downloads::GetFileIcon::Params> params( std::unique_ptr<downloads::GetFileIcon::Params> params(
downloads::GetFileIcon::Params::Create(*args_)); downloads::GetFileIcon::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
...@@ -1591,10 +1596,11 @@ bool DownloadsGetFileIconFunction::RunAsync() { ...@@ -1591,10 +1596,11 @@ bool DownloadsGetFileIconFunction::RunAsync() {
icon_size = *options->size; icon_size = *options->size;
DownloadItem* download_item = GetDownload( DownloadItem* download_item = GetDownload(
browser_context(), include_incognito_information(), params->download_id); browser_context(), include_incognito_information(), params->download_id);
if (InvalidId(download_item, &error_) || std::string error;
if (InvalidId(download_item, &error) ||
Fault(download_item->GetTargetFilePath().empty(), Fault(download_item->GetTargetFilePath().empty(),
download_extension_errors::kEmptyFile, &error_)) download_extension_errors::kEmptyFile, &error))
return false; return RespondNow(Error(error));
// In-progress downloads return the intermediate filename for GetFullPath() // In-progress downloads return the intermediate filename for GetFullPath()
// which doesn't have the final extension. Therefore a good file icon can't be // which doesn't have the final extension. Therefore a good file icon can't be
// found, so use GetTargetFilePath() instead. // found, so use GetTargetFilePath() instead.
...@@ -1610,18 +1616,18 @@ bool DownloadsGetFileIconFunction::RunAsync() { ...@@ -1610,18 +1616,18 @@ bool DownloadsGetFileIconFunction::RunAsync() {
scale, scale,
IconLoaderSizeFromPixelSize(icon_size), IconLoaderSizeFromPixelSize(icon_size),
base::Bind(&DownloadsGetFileIconFunction::OnIconURLExtracted, this))); base::Bind(&DownloadsGetFileIconFunction::OnIconURLExtracted, this)));
return true; return RespondLater();
} }
void DownloadsGetFileIconFunction::OnIconURLExtracted(const std::string& url) { void DownloadsGetFileIconFunction::OnIconURLExtracted(const std::string& url) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (Fault(url.empty(), download_extension_errors::kIconNotFound, &error_)) { std::string error;
SendResponse(false); if (Fault(url.empty(), download_extension_errors::kIconNotFound, &error)) {
Respond(Error(error));
return; return;
} }
RecordApiFunctions(DOWNLOADS_FUNCTION_GET_FILE_ICON); RecordApiFunctions(DOWNLOADS_FUNCTION_GET_FILE_ICON);
SetResult(std::make_unique<base::Value>(url)); Respond(OneArgument(std::make_unique<base::Value>(url)));
SendResponse(true);
} }
ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter( ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(
......
...@@ -14,18 +14,19 @@ ...@@ -14,18 +14,19 @@
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/download/download_danger_prompt.h" #include "chrome/browser/download/download_danger_prompt.h"
#include "chrome/browser/extensions/chrome_extension_function.h"
#include "chrome/common/extensions/api/downloads.h" #include "chrome/common/extensions/api/downloads.h"
#include "components/download/content/public/all_download_item_notifier.h" #include "components/download/content/public/all_download_item_notifier.h"
#include "components/download/public/common/download_path_reservation_tracker.h" #include "components/download/public/common/download_path_reservation_tracker.h"
#include "content/public/browser/download_manager.h" #include "content/public/browser/download_manager.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h" #include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/warning_set.h" #include "extensions/browser/warning_set.h"
class DownloadFileIconExtractor; class DownloadFileIconExtractor;
class DownloadOpenPrompt; class DownloadOpenPrompt;
class Profile;
// Functions in the chrome.downloads namespace facilitate // Functions in the chrome.downloads namespace facilitate
// controlling downloads from extensions. See the full API doc at // controlling downloads from extensions. See the full API doc at
...@@ -85,11 +86,11 @@ class DownloadedByExtension : public base::SupportsUserData::Data { ...@@ -85,11 +86,11 @@ class DownloadedByExtension : public base::SupportsUserData::Data {
DISALLOW_COPY_AND_ASSIGN(DownloadedByExtension); DISALLOW_COPY_AND_ASSIGN(DownloadedByExtension);
}; };
class DownloadsDownloadFunction : public ChromeAsyncExtensionFunction { class DownloadsDownloadFunction : public ExtensionFunction {
public: public:
DECLARE_EXTENSION_FUNCTION("downloads.download", DOWNLOADS_DOWNLOAD) DECLARE_EXTENSION_FUNCTION("downloads.download", DOWNLOADS_DOWNLOAD)
DownloadsDownloadFunction(); DownloadsDownloadFunction();
bool RunAsync() override; ResponseAction Run() override;
protected: protected:
~DownloadsDownloadFunction() override; ~DownloadsDownloadFunction() override;
...@@ -169,11 +170,11 @@ class DownloadsEraseFunction : public ExtensionFunction { ...@@ -169,11 +170,11 @@ class DownloadsEraseFunction : public ExtensionFunction {
DISALLOW_COPY_AND_ASSIGN(DownloadsEraseFunction); DISALLOW_COPY_AND_ASSIGN(DownloadsEraseFunction);
}; };
class DownloadsRemoveFileFunction : public ChromeAsyncExtensionFunction { class DownloadsRemoveFileFunction : public ExtensionFunction {
public: public:
DECLARE_EXTENSION_FUNCTION("downloads.removeFile", DOWNLOADS_REMOVEFILE) DECLARE_EXTENSION_FUNCTION("downloads.removeFile", DOWNLOADS_REMOVEFILE)
DownloadsRemoveFileFunction(); DownloadsRemoveFileFunction();
bool RunAsync() override; ResponseAction Run() override;
protected: protected:
~DownloadsRemoveFileFunction() override; ~DownloadsRemoveFileFunction() override;
...@@ -184,7 +185,7 @@ class DownloadsRemoveFileFunction : public ChromeAsyncExtensionFunction { ...@@ -184,7 +185,7 @@ class DownloadsRemoveFileFunction : public ChromeAsyncExtensionFunction {
DISALLOW_COPY_AND_ASSIGN(DownloadsRemoveFileFunction); DISALLOW_COPY_AND_ASSIGN(DownloadsRemoveFileFunction);
}; };
class DownloadsAcceptDangerFunction : public ChromeAsyncExtensionFunction { class DownloadsAcceptDangerFunction : public ExtensionFunction {
public: public:
typedef base::Callback<void(DownloadDangerPrompt*)> OnPromptCreatedCallback; typedef base::Callback<void(DownloadDangerPrompt*)> OnPromptCreatedCallback;
static void OnPromptCreatedForTesting( static void OnPromptCreatedForTesting(
...@@ -194,7 +195,7 @@ class DownloadsAcceptDangerFunction : public ChromeAsyncExtensionFunction { ...@@ -194,7 +195,7 @@ class DownloadsAcceptDangerFunction : public ChromeAsyncExtensionFunction {
DECLARE_EXTENSION_FUNCTION("downloads.acceptDanger", DOWNLOADS_ACCEPTDANGER) DECLARE_EXTENSION_FUNCTION("downloads.acceptDanger", DOWNLOADS_ACCEPTDANGER)
DownloadsAcceptDangerFunction(); DownloadsAcceptDangerFunction();
bool RunAsync() override; ResponseAction Run() override;
protected: protected:
~DownloadsAcceptDangerFunction() override; ~DownloadsAcceptDangerFunction() override;
...@@ -272,11 +273,11 @@ class DownloadsSetShelfEnabledFunction : public ExtensionFunction { ...@@ -272,11 +273,11 @@ class DownloadsSetShelfEnabledFunction : public ExtensionFunction {
DISALLOW_COPY_AND_ASSIGN(DownloadsSetShelfEnabledFunction); DISALLOW_COPY_AND_ASSIGN(DownloadsSetShelfEnabledFunction);
}; };
class DownloadsGetFileIconFunction : public ChromeAsyncExtensionFunction { class DownloadsGetFileIconFunction : public ExtensionFunction {
public: public:
DECLARE_EXTENSION_FUNCTION("downloads.getFileIcon", DOWNLOADS_GETFILEICON) DECLARE_EXTENSION_FUNCTION("downloads.getFileIcon", DOWNLOADS_GETFILEICON)
DownloadsGetFileIconFunction(); DownloadsGetFileIconFunction();
bool RunAsync() override; ResponseAction Run() override;
void SetIconExtractorForTesting(DownloadFileIconExtractor* extractor); void SetIconExtractorForTesting(DownloadFileIconExtractor* extractor);
protected: protected:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment