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

Unified Diff: chrome/browser/extensions/extension_downloads_api.cc

Issue 8451019: Move download extension api implementation to download/ dir. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: aa review Created 9 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_downloads_api.cc
diff --git a/chrome/browser/extensions/extension_downloads_api.cc b/chrome/browser/extensions/extension_downloads_api.cc
deleted file mode 100644
index 8e4657fb85bc80b39f210fccd1a64bfaa1d13477..0000000000000000000000000000000000000000
--- a/chrome/browser/extensions/extension_downloads_api.cc
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/extension_downloads_api.h"
-
-#include <algorithm>
-#include <cctype>
-#include <iterator>
-#include <set>
-#include <string>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/json/json_writer.h"
-#include "base/logging.h"
-#include "base/metrics/histogram.h"
-#include "base/stl_util.h"
-#include "base/string16.h"
-#include "base/string_util.h"
-#include "base/stringprintf.h"
-#include "base/values.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/download/download_service.h"
-#include "chrome/browser/download/download_service_factory.h"
-#include "chrome/browser/download/download_util.h"
-#include "chrome/browser/extensions/extension_downloads_api_constants.h"
-#include "chrome/browser/extensions/extension_event_names.h"
-#include "chrome/browser/extensions/extension_event_router.h"
-#include "chrome/browser/icon_loader.h"
-#include "chrome/browser/icon_manager.h"
-#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "content/browser/download/download_file_manager.h"
-#include "content/browser/download/download_item.h"
-#include "content/browser/download/download_types.h"
-#include "content/browser/download/interrupt_reasons.h"
-#include "content/browser/renderer_host/render_process_host.h"
-#include "content/browser/renderer_host/render_view_host.h"
-#include "content/browser/renderer_host/resource_dispatcher_host.h"
-#include "net/http/http_util.h"
-#include "net/url_request/url_request.h"
-
-using content::BrowserThread;
-
-namespace constants = extension_downloads_api_constants;
-
-bool DownloadsFunctionInterface::RunImplImpl(
- DownloadsFunctionInterface* pimpl) {
- CHECK(pimpl);
- if (!pimpl->ParseArgs()) return false;
- UMA_HISTOGRAM_ENUMERATION(
- "Download.ApiFunctions", pimpl->function(), DOWNLOADS_FUNCTION_LAST);
- pimpl->RunInternal();
- return true;
-}
-
-SyncDownloadsFunction::SyncDownloadsFunction(
- DownloadsFunctionInterface::DownloadsFunctionName function)
- : function_(function) {
-}
-
-SyncDownloadsFunction::~SyncDownloadsFunction() {}
-
-bool SyncDownloadsFunction::RunImpl() {
- return DownloadsFunctionInterface::RunImplImpl(this);
-}
-
-DownloadsFunctionInterface::DownloadsFunctionName
-SyncDownloadsFunction::function() const {
- return function_;
-}
-
-AsyncDownloadsFunction::AsyncDownloadsFunction(
- DownloadsFunctionInterface::DownloadsFunctionName function)
- : function_(function) {
-}
-
-AsyncDownloadsFunction::~AsyncDownloadsFunction() {}
-
-bool AsyncDownloadsFunction::RunImpl() {
- return DownloadsFunctionInterface::RunImplImpl(this);
-}
-
-DownloadsFunctionInterface::DownloadsFunctionName
-AsyncDownloadsFunction::function() const {
- return function_;
-}
-
-DownloadsDownloadFunction::DownloadsDownloadFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_DOWNLOAD) {
-}
-
-DownloadsDownloadFunction::~DownloadsDownloadFunction() {}
-
-DownloadsDownloadFunction::IOData::IOData()
- : save_as(false),
- extra_headers(NULL),
- method("GET"),
- rdh(NULL),
- resource_context(NULL),
- render_process_host_id(0),
- render_view_host_routing_id(0) {
-}
-
-DownloadsDownloadFunction::IOData::~IOData() {}
-
-bool DownloadsDownloadFunction::ParseArgs() {
- base::DictionaryValue* options = NULL;
- std::string url;
- iodata_.reset(new IOData());
- EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &options));
- EXTENSION_FUNCTION_VALIDATE(options->GetString(constants::kUrlKey, &url));
- iodata_->url = GURL(url);
- if (!iodata_->url.is_valid()) {
- error_ = constants::kInvalidURL;
- return false;
- }
- if (options->HasKey(constants::kFilenameKey))
- EXTENSION_FUNCTION_VALIDATE(options->GetString(
- constants::kFilenameKey, &iodata_->filename));
- // TODO(benjhayden): More robust validation of filename.
- if (((iodata_->filename[0] == L'.') && (iodata_->filename[1] == L'.')) ||
- (iodata_->filename[0] == L'/')) {
- error_ = constants::kGenericError;
- return false;
- }
- if (options->HasKey(constants::kSaveAsKey))
- EXTENSION_FUNCTION_VALIDATE(options->GetBoolean(
- constants::kSaveAsKey, &iodata_->save_as));
- if (options->HasKey(constants::kMethodKey))
- EXTENSION_FUNCTION_VALIDATE(options->GetString(
- constants::kMethodKey, &iodata_->method));
- // It's ok to use a pointer to extra_headers without DeepCopy()ing because
- // |args_| (which owns *extra_headers) is guaranteed to live as long as
- // |this|.
- if (options->HasKey(constants::kHeadersKey))
- EXTENSION_FUNCTION_VALIDATE(options->GetList(
- constants::kHeadersKey, &iodata_->extra_headers));
- if (options->HasKey(constants::kBodyKey))
- EXTENSION_FUNCTION_VALIDATE(options->GetString(
- constants::kBodyKey, &iodata_->post_body));
- if (iodata_->extra_headers != NULL) {
- for (size_t index = 0; index < iodata_->extra_headers->GetSize(); ++index) {
- base::DictionaryValue* header = NULL;
- std::string name, value;
- EXTENSION_FUNCTION_VALIDATE(iodata_->extra_headers->GetDictionary(
- index, &header));
- EXTENSION_FUNCTION_VALIDATE(header->GetString(
- constants::kHeaderNameKey, &name));
- EXTENSION_FUNCTION_VALIDATE(header->GetString(
- constants::kHeaderValueKey, &value));
- if (!net::HttpUtil::IsSafeHeader(name)) {
- error_ = constants::kGenericError;
- return false;
- }
- }
- }
- iodata_->rdh = g_browser_process->resource_dispatcher_host();
- iodata_->resource_context = &profile()->GetResourceContext();
- iodata_->render_process_host_id = render_view_host()->process()->id();
- iodata_->render_view_host_routing_id = render_view_host()->routing_id();
- return true;
-}
-
-void DownloadsDownloadFunction::RunInternal() {
- VLOG(1) << __FUNCTION__ << " " << iodata_->url.spec();
- if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
- &DownloadsDownloadFunction::BeginDownloadOnIOThread, this))) {
- error_ = constants::kGenericError;
- SendResponse(error_.empty());
- }
-}
-
-void DownloadsDownloadFunction::BeginDownloadOnIOThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DVLOG(1) << __FUNCTION__ << " " << iodata_->url.spec();
- DownloadSaveInfo save_info;
- // TODO(benjhayden) Ensure that this filename is interpreted as a path
- // relative to the default downloads directory without allowing '..'.
- save_info.suggested_name = iodata_->filename;
- net::URLRequest* request = new net::URLRequest(iodata_->url, iodata_->rdh);
- request->set_method(iodata_->method);
- if (iodata_->extra_headers != NULL) {
- for (size_t index = 0; index < iodata_->extra_headers->GetSize(); ++index) {
- base::DictionaryValue* header = NULL;
- std::string name, value;
- CHECK(iodata_->extra_headers->GetDictionary(index, &header));
- CHECK(header->GetString("name", &name));
- CHECK(header->GetString("value", &value));
- request->SetExtraRequestHeaderByName(name, value, false/*overwrite*/);
- }
- }
- if (!iodata_->post_body.empty()) {
- request->AppendBytesToUpload(iodata_->post_body.data(),
- iodata_->post_body.size());
- }
- iodata_->rdh->BeginDownload(
- request,
- save_info,
- iodata_->save_as,
- base::Bind(&DownloadsDownloadFunction::OnStarted, this),
- iodata_->render_process_host_id,
- iodata_->render_view_host_routing_id,
- *(iodata_->resource_context));
- iodata_.reset();
-}
-
-void DownloadsDownloadFunction::OnStarted(DownloadId dl_id, net::Error error) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- VLOG(1) << __FUNCTION__ << " " << dl_id << " " << error;
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
- &DownloadsDownloadFunction::RespondOnUIThread, this,
- dl_id.local(), error));
-}
-
-void DownloadsDownloadFunction::RespondOnUIThread(int dl_id, net::Error error) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- VLOG(1) << __FUNCTION__;
- if (dl_id >= 0) {
- result_.reset(base::Value::CreateIntegerValue(dl_id));
- } else {
- error_ = net::ErrorToString(error);
- }
- SendResponse(error_.empty());
-}
-
-DownloadsSearchFunction::DownloadsSearchFunction()
- : SyncDownloadsFunction(DOWNLOADS_FUNCTION_SEARCH) {
-}
-
-DownloadsSearchFunction::~DownloadsSearchFunction() {}
-
-bool DownloadsSearchFunction::ParseArgs() {
- base::DictionaryValue* query_json = NULL;
- EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &query_json));
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsSearchFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsPauseFunction::DownloadsPauseFunction()
- : SyncDownloadsFunction(DOWNLOADS_FUNCTION_PAUSE) {
-}
-
-DownloadsPauseFunction::~DownloadsPauseFunction() {}
-
-bool DownloadsPauseFunction::ParseArgs() {
- int dl_id = 0;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- VLOG(1) << __FUNCTION__ << " " << dl_id;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsPauseFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsResumeFunction::DownloadsResumeFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_RESUME) {
-}
-
-DownloadsResumeFunction::~DownloadsResumeFunction() {}
-
-bool DownloadsResumeFunction::ParseArgs() {
- int dl_id = 0;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- VLOG(1) << __FUNCTION__ << " " << dl_id;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsResumeFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsCancelFunction::DownloadsCancelFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_CANCEL) {
-}
-
-DownloadsCancelFunction::~DownloadsCancelFunction() {}
-
-bool DownloadsCancelFunction::ParseArgs() {
- int dl_id = 0;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- VLOG(1) << __FUNCTION__ << " " << dl_id;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsCancelFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsEraseFunction::DownloadsEraseFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_ERASE) {
-}
-
-DownloadsEraseFunction::~DownloadsEraseFunction() {}
-
-bool DownloadsEraseFunction::ParseArgs() {
- base::DictionaryValue* query_json = NULL;
- EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &query_json));
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsEraseFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsSetDestinationFunction::DownloadsSetDestinationFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_SET_DESTINATION) {
-}
-
-DownloadsSetDestinationFunction::~DownloadsSetDestinationFunction() {}
-
-bool DownloadsSetDestinationFunction::ParseArgs() {
- int dl_id = 0;
- std::string path;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &path));
- VLOG(1) << __FUNCTION__ << " " << dl_id << " " << &path;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsSetDestinationFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsAcceptDangerFunction::DownloadsAcceptDangerFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_ACCEPT_DANGER) {
-}
-
-DownloadsAcceptDangerFunction::~DownloadsAcceptDangerFunction() {}
-
-bool DownloadsAcceptDangerFunction::ParseArgs() {
- int dl_id = 0;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- VLOG(1) << __FUNCTION__ << " " << dl_id;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsAcceptDangerFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsShowFunction::DownloadsShowFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_SHOW) {
-}
-
-DownloadsShowFunction::~DownloadsShowFunction() {}
-
-bool DownloadsShowFunction::ParseArgs() {
- int dl_id = 0;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- VLOG(1) << __FUNCTION__ << " " << dl_id;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsShowFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-DownloadsDragFunction::DownloadsDragFunction()
- : AsyncDownloadsFunction(DOWNLOADS_FUNCTION_DRAG) {
-}
-
-DownloadsDragFunction::~DownloadsDragFunction() {}
-
-bool DownloadsDragFunction::ParseArgs() {
- int dl_id = 0;
- EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &dl_id));
- VLOG(1) << __FUNCTION__ << " " << dl_id;
- error_ = constants::kNotImplemented;
- return false;
-}
-
-void DownloadsDragFunction::RunInternal() {
- NOTIMPLEMENTED();
-}
-
-namespace {
-base::DictionaryValue* DownloadItemToJSON(DownloadItem* item) {
- base::DictionaryValue* json = new base::DictionaryValue();
- json->SetInteger(constants::kIdKey, item->id());
- json->SetString(constants::kUrlKey, item->original_url().spec());
- json->SetString(constants::kFilenameKey,
- item->full_path().LossyDisplayName());
- json->SetString(constants::kDangerKey,
- constants::DangerString(item->GetDangerType()));
- json->SetBoolean(constants::kDangerAcceptedKey,
- item->safety_state() == DownloadItem::DANGEROUS_BUT_VALIDATED);
- json->SetString(constants::kStateKey,
- constants::StateString(item->state()));
- json->SetBoolean(constants::kPausedKey, item->is_paused());
- json->SetString(constants::kMimeKey, item->mime_type());
- json->SetInteger(constants::kStartTimeKey,
- (item->start_time() - base::Time::UnixEpoch()).InMilliseconds());
- json->SetInteger(constants::kBytesReceivedKey, item->received_bytes());
- json->SetInteger(constants::kTotalBytesKey, item->total_bytes());
- if (item->state() == DownloadItem::INTERRUPTED)
- json->SetInteger(constants::kErrorKey,
- static_cast<int>(item->last_reason()));
- // TODO(benjhayden): Implement endTime and fileSize.
- // json->SetInteger(constants::kEndTimeKey, -1);
- json->SetInteger(constants::kFileSizeKey, item->total_bytes());
- return json;
-}
-} // anonymous namespace
-
-ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(
- Profile* profile)
- : profile_(profile),
- manager_(
- profile ?
- DownloadServiceFactory::GetForProfile(profile)->GetDownloadManager() :
- NULL) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(profile_);
- DCHECK(manager_);
- manager_->AddObserver(this);
-}
-
-ExtensionDownloadsEventRouter::~ExtensionDownloadsEventRouter() {
- if (manager_ != NULL)
- manager_->RemoveObserver(this);
-}
-
-void ExtensionDownloadsEventRouter::ModelChanged() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_ == NULL)
- return;
- DownloadManager::DownloadVector current_vec;
- manager_->SearchDownloads(string16(), &current_vec);
- DownloadIdSet current_set;
- ItemMap current_map;
- for (DownloadManager::DownloadVector::const_iterator iter =
- current_vec.begin();
- iter != current_vec.end(); ++iter) {
- DownloadItem* item = *iter;
- int item_id = item->id();
- // TODO(benjhayden): Remove the following line when every item's id >= 0,
- // which will allow firing onErased events for items from the history.
- if (item_id < 0) continue;
- DCHECK(current_map.find(item_id) == current_map.end());
- current_set.insert(item_id);
- current_map[item_id] = item;
- }
- DownloadIdSet new_set; // current_set - downloads_;
- DownloadIdSet erased_set; // downloads_ - current_set;
- std::insert_iterator<DownloadIdSet> new_insertor(new_set, new_set.begin());
- std::insert_iterator<DownloadIdSet> erased_insertor(
- erased_set, erased_set.begin());
- std::set_difference(current_set.begin(), current_set.end(),
- downloads_.begin(), downloads_.end(),
- new_insertor);
- std::set_difference(downloads_.begin(), downloads_.end(),
- current_set.begin(), current_set.end(),
- erased_insertor);
- for (DownloadIdSet::const_iterator iter = new_set.begin();
- iter != new_set.end(); ++iter) {
- DispatchEvent(extension_event_names::kOnDownloadCreated,
- DownloadItemToJSON(current_map[*iter]));
- }
- for (DownloadIdSet::const_iterator iter = erased_set.begin();
- iter != erased_set.end(); ++iter) {
- DispatchEvent(extension_event_names::kOnDownloadErased,
- base::Value::CreateIntegerValue(*iter));
- }
- downloads_.swap(current_set);
-}
-
-void ExtensionDownloadsEventRouter::ManagerGoingDown() {
- manager_->RemoveObserver(this);
- manager_ = NULL;
-}
-
-void ExtensionDownloadsEventRouter::DispatchEvent(
- const char* event_name, base::Value* arg) {
- ListValue args;
- args.Append(arg);
- std::string json_args;
- base::JSONWriter::Write(&args, false, &json_args);
- profile_->GetExtensionEventRouter()->DispatchEventToRenderers(
- event_name,
- json_args,
- profile_,
- GURL());
-}
« no previous file with comments | « chrome/browser/extensions/extension_downloads_api.h ('k') | chrome/browser/extensions/extension_downloads_api_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698