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() {}
DownloadsDownloadFunction::~DownloadsDownloadFunction() {}
bool DownloadsDownloadFunction::RunAsync() {
ExtensionFunction::ResponseAction DownloadsDownloadFunction::Run() {
std::unique_ptr<downloads::Download::Params> params(
downloads::Download::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
const downloads::DownloadOptions& options = params->options;
GURL download_url(options.url);
std::string error;
if (Fault(!download_url.is_valid(), download_extension_errors::kInvalidURL,
&error_))
return false;
&error))
return RespondNow(Error(error));
net::NetworkTrafficAnnotationTag traffic_annotation =
net::DefineNetworkTrafficAnnotation("downloads_api_run_async", R"(
......@@ -1070,8 +1071,7 @@ bool DownloadsDownloadFunction::RunAsync() {
creator_suggested_filename = base::FilePath(*options.filename);
#endif
if (!net::IsSafePortableRelativePath(creator_suggested_filename)) {
error_ = download_extension_errors::kInvalidFilename;
return false;
return RespondNow(Error(download_extension_errors::kInvalidFilename));
}
}
......@@ -1081,16 +1081,15 @@ bool DownloadsDownloadFunction::RunAsync() {
if (options.headers.get()) {
for (const downloads::HeaderNameValuePair& name_value : *options.headers) {
if (!net::HttpUtil::IsValidHeaderName(name_value.name)) {
error_ = download_extension_errors::kInvalidHeaderName;
return false;
return RespondNow(Error(download_extension_errors::kInvalidHeaderName));
}
if (!net::HttpUtil::IsSafeHeader(name_value.name)) {
error_ = download_extension_errors::kInvalidHeaderUnsafe;
return false;
return RespondNow(
Error(download_extension_errors::kInvalidHeaderUnsafe));
}
if (!net::HttpUtil::IsValidHeaderValue(name_value.value)) {
error_ = download_extension_errors::kInvalidHeaderValue;
return false;
return RespondNow(
Error(download_extension_errors::kInvalidHeaderValue));
}
download_params->add_request_header(name_value.name, name_value.value);
}
......@@ -1113,11 +1112,12 @@ bool DownloadsDownloadFunction::RunAsync() {
download_params->set_do_not_prompt_for_login(true);
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));
RecordApiFunctions(DOWNLOADS_FUNCTION_DOWNLOAD);
return true;
return RespondLater();
}
void DownloadsDownloadFunction::OnStarted(
......@@ -1129,7 +1129,8 @@ void DownloadsDownloadFunction::OnStarted(
VLOG(1) << __func__ << " " << item << " " << interrupt_reason;
if (item) {
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() ||
(creator_conflict_action !=
downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY)) {
......@@ -1147,9 +1148,8 @@ void DownloadsDownloadFunction::OnStarted(
item->UpdateObservers();
} else {
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() {}
......@@ -1297,30 +1297,32 @@ DownloadsRemoveFileFunction::DownloadsRemoveFileFunction() {
DownloadsRemoveFileFunction::~DownloadsRemoveFileFunction() {
}
bool DownloadsRemoveFileFunction::RunAsync() {
ExtensionFunction::ResponseAction DownloadsRemoveFileFunction::Run() {
std::unique_ptr<downloads::RemoveFile::Params> params(
downloads::RemoveFile::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
DownloadItem* download_item = GetDownload(
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),
download_extension_errors::kNotComplete, &error_) ||
download_extension_errors::kNotComplete, &error) ||
Fault(download_item->GetFileExternallyRemoved(),
download_extension_errors::kFileAlreadyDeleted, &error_))
return false;
download_extension_errors::kFileAlreadyDeleted, &error))
return RespondNow(Error(error));
RecordApiFunctions(DOWNLOADS_FUNCTION_REMOVE_FILE);
download_item->DeleteFile(
base::Bind(&DownloadsRemoveFileFunction::Done, this));
return true;
return RespondLater();
}
void DownloadsRemoveFileFunction::Done(bool success) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!success) {
error_ = download_extension_errors::kFileNotRemoved;
Respond(Error(download_extension_errors::kFileNotRemoved));
} else {
Respond(NoArguments());
}
SendResponse(error_.empty());
}
DownloadsAcceptDangerFunction::DownloadsAcceptDangerFunction() {}
......@@ -1330,26 +1332,27 @@ DownloadsAcceptDangerFunction::~DownloadsAcceptDangerFunction() {}
DownloadsAcceptDangerFunction::OnPromptCreatedCallback*
DownloadsAcceptDangerFunction::on_prompt_created_ = NULL;
bool DownloadsAcceptDangerFunction::RunAsync() {
ExtensionFunction::ResponseAction DownloadsAcceptDangerFunction::Run() {
std::unique_ptr<downloads::AcceptDanger::Params> params(
downloads::AcceptDanger::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
PromptOrWait(params->download_id, 10);
return true;
return RespondLater();
}
void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
DownloadItem* download_item = GetDownload(
browser_context(), include_incognito_information(), download_id);
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,
download_extension_errors::kNotInProgress, &error_) ||
download_extension_errors::kNotInProgress, &error) ||
Fault(!download_item->IsDangerous(),
download_extension_errors::kNotDangerous, &error_) ||
download_extension_errors::kNotDangerous, &error) ||
Fault(!web_contents, download_extension_errors::kInvisibleContext,
&error_)) {
SendResponse(error_.empty());
&error)) {
Respond(Error(error));
return;
}
bool visible = platform_util::IsVisible(web_contents->GetNativeView());
......@@ -1362,8 +1365,7 @@ void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
base::TimeDelta::FromMilliseconds(100));
return;
}
error_ = download_extension_errors::kInvisibleContext;
SendResponse(false);
Respond(Error(download_extension_errors::kInvisibleContext));
return;
}
RecordApiFunctions(DOWNLOADS_FUNCTION_ACCEPT_DANGER);
......@@ -1386,10 +1388,13 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback(
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DownloadItem* download_item = GetDownload(
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,
download_extension_errors::kNotInProgress, &error_))
download_extension_errors::kNotInProgress, &error)) {
Respond(Error(error));
return;
}
switch (action) {
case DownloadDangerPrompt::ACCEPT:
download_item->ValidateDangerousDownload();
......@@ -1400,7 +1405,7 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback(
case DownloadDangerPrompt::DISMISS:
break;
}
SendResponse(error_.empty());
Respond(NoArguments());
}
DownloadsShowFunction::DownloadsShowFunction() {}
......@@ -1580,7 +1585,7 @@ void DownloadsGetFileIconFunction::SetIconExtractorForTesting(
icon_extractor_.reset(extractor);
}
bool DownloadsGetFileIconFunction::RunAsync() {
ExtensionFunction::ResponseAction DownloadsGetFileIconFunction::Run() {
std::unique_ptr<downloads::GetFileIcon::Params> params(
downloads::GetFileIcon::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
......@@ -1591,10 +1596,11 @@ bool DownloadsGetFileIconFunction::RunAsync() {
icon_size = *options->size;
DownloadItem* download_item = GetDownload(
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(),
download_extension_errors::kEmptyFile, &error_))
return false;
download_extension_errors::kEmptyFile, &error))
return RespondNow(Error(error));
// In-progress downloads return the intermediate filename for GetFullPath()
// which doesn't have the final extension. Therefore a good file icon can't be
// found, so use GetTargetFilePath() instead.
......@@ -1610,18 +1616,18 @@ bool DownloadsGetFileIconFunction::RunAsync() {
scale,
IconLoaderSizeFromPixelSize(icon_size),
base::Bind(&DownloadsGetFileIconFunction::OnIconURLExtracted, this)));
return true;
return RespondLater();
}
void DownloadsGetFileIconFunction::OnIconURLExtracted(const std::string& url) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (Fault(url.empty(), download_extension_errors::kIconNotFound, &error_)) {
SendResponse(false);
std::string error;
if (Fault(url.empty(), download_extension_errors::kIconNotFound, &error)) {
Respond(Error(error));
return;
}
RecordApiFunctions(DOWNLOADS_FUNCTION_GET_FILE_ICON);
SetResult(std::make_unique<base::Value>(url));
SendResponse(true);
Respond(OneArgument(std::make_unique<base::Value>(url)));
}
ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(
......
......@@ -14,18 +14,19 @@
#include "base/scoped_observer.h"
#include "base/time/time.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 "components/download/content/public/all_download_item_notifier.h"
#include "components/download/public/common/download_path_reservation_tracker.h"
#include "content/public/browser/download_manager.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/warning_set.h"
class DownloadFileIconExtractor;
class DownloadOpenPrompt;
class Profile;
// Functions in the chrome.downloads namespace facilitate
// controlling downloads from extensions. See the full API doc at
......@@ -85,11 +86,11 @@ class DownloadedByExtension : public base::SupportsUserData::Data {
DISALLOW_COPY_AND_ASSIGN(DownloadedByExtension);
};
class DownloadsDownloadFunction : public ChromeAsyncExtensionFunction {
class DownloadsDownloadFunction : public ExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("downloads.download", DOWNLOADS_DOWNLOAD)
DownloadsDownloadFunction();
bool RunAsync() override;
ResponseAction Run() override;
protected:
~DownloadsDownloadFunction() override;
......@@ -169,11 +170,11 @@ class DownloadsEraseFunction : public ExtensionFunction {
DISALLOW_COPY_AND_ASSIGN(DownloadsEraseFunction);
};
class DownloadsRemoveFileFunction : public ChromeAsyncExtensionFunction {
class DownloadsRemoveFileFunction : public ExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("downloads.removeFile", DOWNLOADS_REMOVEFILE)
DownloadsRemoveFileFunction();
bool RunAsync() override;
ResponseAction Run() override;
protected:
~DownloadsRemoveFileFunction() override;
......@@ -184,7 +185,7 @@ class DownloadsRemoveFileFunction : public ChromeAsyncExtensionFunction {
DISALLOW_COPY_AND_ASSIGN(DownloadsRemoveFileFunction);
};
class DownloadsAcceptDangerFunction : public ChromeAsyncExtensionFunction {
class DownloadsAcceptDangerFunction : public ExtensionFunction {
public:
typedef base::Callback<void(DownloadDangerPrompt*)> OnPromptCreatedCallback;
static void OnPromptCreatedForTesting(
......@@ -194,7 +195,7 @@ class DownloadsAcceptDangerFunction : public ChromeAsyncExtensionFunction {
DECLARE_EXTENSION_FUNCTION("downloads.acceptDanger", DOWNLOADS_ACCEPTDANGER)
DownloadsAcceptDangerFunction();
bool RunAsync() override;
ResponseAction Run() override;
protected:
~DownloadsAcceptDangerFunction() override;
......@@ -272,11 +273,11 @@ class DownloadsSetShelfEnabledFunction : public ExtensionFunction {
DISALLOW_COPY_AND_ASSIGN(DownloadsSetShelfEnabledFunction);
};
class DownloadsGetFileIconFunction : public ChromeAsyncExtensionFunction {
class DownloadsGetFileIconFunction : public ExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("downloads.getFileIcon", DOWNLOADS_GETFILEICON)
DownloadsGetFileIconFunction();
bool RunAsync() override;
ResponseAction Run() override;
void SetIconExtractorForTesting(DownloadFileIconExtractor* extractor);
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