| Index: chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
|
| diff --git a/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc b/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
|
| deleted file mode 100644
|
| index 93a40f2ffc6d5696c3131292794f540b4f70cf15..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
|
| +++ /dev/null
|
| @@ -1,3544 +0,0 @@
|
| -// Copyright (c) 2012 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 <algorithm>
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/json/json_reader.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/prefs/pref_service.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/download/download_file_icon_extractor.h"
|
| -#include "chrome/browser/download/download_service.h"
|
| -#include "chrome/browser/download/download_service_factory.h"
|
| -#include "chrome/browser/download/download_test_file_activity_observer.h"
|
| -#include "chrome/browser/extensions/api/downloads/downloads_api.h"
|
| -#include "chrome/browser/extensions/event_names.h"
|
| -#include "chrome/browser/extensions/extension_apitest.h"
|
| -#include "chrome/browser/extensions/extension_function_test_utils.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| -#include "chrome/browser/history/download_row.h"
|
| -#include "chrome/browser/net/url_request_mock_util.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_tabstrip.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/test/base/in_process_browser_test.h"
|
| -#include "chrome/test/base/ui_test_utils.h"
|
| -#include "content/public/browser/browser_context.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/download_item.h"
|
| -#include "content/public/browser/download_manager.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/storage_partition.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "content/public/common/page_transition_types.h"
|
| -#include "content/public/test/download_test_observer.h"
|
| -#include "content/test/net/url_request_slow_download_job.h"
|
| -#include "net/base/data_url.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/url_request/url_request.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_job.h"
|
| -#include "net/url_request/url_request_job_factory.h"
|
| -#include "net/url_request/url_request_job_factory_impl.h"
|
| -#include "webkit/browser/blob/blob_storage_controller.h"
|
| -#include "webkit/browser/blob/blob_url_request_job.h"
|
| -#include "webkit/browser/fileapi/file_system_context.h"
|
| -#include "webkit/browser/fileapi/file_system_operation_runner.h"
|
| -#include "webkit/browser/fileapi/file_system_url.h"
|
| -#include "webkit/common/blob/blob_data.h"
|
| -
|
| -using content::BrowserContext;
|
| -using content::BrowserThread;
|
| -using content::DownloadItem;
|
| -using content::DownloadManager;
|
| -using content::URLRequestSlowDownloadJob;
|
| -
|
| -namespace events = extensions::event_names;
|
| -
|
| -namespace {
|
| -
|
| -// Comparator that orders download items by their ID. Can be used with
|
| -// std::sort.
|
| -struct DownloadIdComparator {
|
| - bool operator() (DownloadItem* first, DownloadItem* second) {
|
| - return first->GetId() < second->GetId();
|
| - }
|
| -};
|
| -
|
| -class DownloadsEventsListener : public content::NotificationObserver {
|
| - public:
|
| - DownloadsEventsListener()
|
| - : waiting_(false) {
|
| - registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
|
| - content::NotificationService::AllSources());
|
| - }
|
| -
|
| - virtual ~DownloadsEventsListener() {
|
| - registrar_.Remove(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
|
| - content::NotificationService::AllSources());
|
| - STLDeleteElements(&events_);
|
| - }
|
| -
|
| - void ClearEvents() {
|
| - STLDeleteElements(&events_);
|
| - events_.clear();
|
| - }
|
| -
|
| - class Event {
|
| - public:
|
| - Event(Profile* profile,
|
| - const std::string& event_name,
|
| - const std::string& json_args,
|
| - base::Time caught)
|
| - : profile_(profile),
|
| - event_name_(event_name),
|
| - json_args_(json_args),
|
| - args_(base::JSONReader::Read(json_args)),
|
| - caught_(caught) {
|
| - }
|
| -
|
| - const base::Time& caught() { return caught_; }
|
| -
|
| - bool Satisfies(const Event& other) const {
|
| - return other.SatisfiedBy(*this);
|
| - }
|
| -
|
| - bool SatisfiedBy(const Event& other) const {
|
| - if ((profile_ != other.profile_) ||
|
| - (event_name_ != other.event_name_))
|
| - return false;
|
| - if (((event_name_ == events::kOnDownloadDeterminingFilename) ||
|
| - (event_name_ == events::kOnDownloadCreated) ||
|
| - (event_name_ == events::kOnDownloadChanged)) &&
|
| - args_.get() &&
|
| - other.args_.get()) {
|
| - base::ListValue* left_list = NULL;
|
| - base::DictionaryValue* left_dict = NULL;
|
| - base::ListValue* right_list = NULL;
|
| - base::DictionaryValue* right_dict = NULL;
|
| - if (!args_->GetAsList(&left_list) ||
|
| - !other.args_->GetAsList(&right_list) ||
|
| - !left_list->GetDictionary(0, &left_dict) ||
|
| - !right_list->GetDictionary(0, &right_dict))
|
| - return false;
|
| - for (base::DictionaryValue::Iterator iter(*left_dict);
|
| - !iter.IsAtEnd(); iter.Advance()) {
|
| - base::Value* right_value = NULL;
|
| - if (!right_dict->HasKey(iter.key()) ||
|
| - (right_dict->Get(iter.key(), &right_value) &&
|
| - !iter.value().Equals(right_value))) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| - } else if ((event_name_ == events::kOnDownloadErased) &&
|
| - args_.get() &&
|
| - other.args_.get()) {
|
| - int my_id = -1, other_id = -1;
|
| - return (args_->GetAsInteger(&my_id) &&
|
| - other.args_->GetAsInteger(&other_id) &&
|
| - my_id == other_id);
|
| - }
|
| - return json_args_ == other.json_args_;
|
| - }
|
| -
|
| - std::string Debug() {
|
| - return base::StringPrintf("Event(%p, %s, %s, %f)",
|
| - profile_,
|
| - event_name_.c_str(),
|
| - json_args_.c_str(),
|
| - caught_.ToJsTime());
|
| - }
|
| -
|
| - private:
|
| - Profile* profile_;
|
| - std::string event_name_;
|
| - std::string json_args_;
|
| - scoped_ptr<base::Value> args_;
|
| - base::Time caught_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Event);
|
| - };
|
| -
|
| - typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource
|
| - DownloadsNotificationSource;
|
| -
|
| - virtual void Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) OVERRIDE {
|
| - switch (type) {
|
| - case chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT:
|
| - {
|
| - DownloadsNotificationSource* dns =
|
| - content::Source<DownloadsNotificationSource>(source).ptr();
|
| - Event* new_event = new Event(
|
| - dns->profile,
|
| - dns->event_name,
|
| - *content::Details<std::string>(details).ptr(), base::Time::Now());
|
| - events_.push_back(new_event);
|
| - if (waiting_ &&
|
| - waiting_for_.get() &&
|
| - new_event->Satisfies(*waiting_for_)) {
|
| - waiting_ = false;
|
| - base::MessageLoopForUI::current()->Quit();
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - }
|
| -
|
| - bool WaitFor(Profile* profile,
|
| - const std::string& event_name,
|
| - const std::string& json_args) {
|
| - waiting_for_.reset(new Event(profile, event_name, json_args, base::Time()));
|
| - for (std::deque<Event*>::const_iterator iter = events_.begin();
|
| - iter != events_.end(); ++iter) {
|
| - if ((*iter)->Satisfies(*waiting_for_.get())) {
|
| - return true;
|
| - }
|
| - }
|
| - waiting_ = true;
|
| - content::RunMessageLoop();
|
| - bool success = !waiting_;
|
| - if (waiting_) {
|
| - // Print the events that were caught since the last WaitFor() call to help
|
| - // find the erroneous event.
|
| - // TODO(benjhayden) Fuzzy-match and highlight the erroneous event.
|
| - for (std::deque<Event*>::const_iterator iter = events_.begin();
|
| - iter != events_.end(); ++iter) {
|
| - if ((*iter)->caught() > last_wait_) {
|
| - LOG(INFO) << "Caught " << (*iter)->Debug();
|
| - }
|
| - }
|
| - if (waiting_for_.get()) {
|
| - LOG(INFO) << "Timed out waiting for " << waiting_for_->Debug();
|
| - }
|
| - waiting_ = false;
|
| - }
|
| - waiting_for_.reset();
|
| - last_wait_ = base::Time::Now();
|
| - return success;
|
| - }
|
| -
|
| - private:
|
| - bool waiting_;
|
| - base::Time last_wait_;
|
| - scoped_ptr<Event> waiting_for_;
|
| - content::NotificationRegistrar registrar_;
|
| - std::deque<Event*> events_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener);
|
| -};
|
| -
|
| -class DownloadExtensionTest : public ExtensionApiTest {
|
| - public:
|
| - DownloadExtensionTest()
|
| - : extension_(NULL),
|
| - incognito_browser_(NULL),
|
| - current_browser_(NULL) {
|
| - }
|
| -
|
| - protected:
|
| - // Used with CreateHistoryDownloads
|
| - struct HistoryDownloadInfo {
|
| - // Filename to use. CreateHistoryDownloads will append this filename to the
|
| - // temporary downloads directory specified by downloads_directory().
|
| - const base::FilePath::CharType* filename;
|
| -
|
| - // State for the download. Note that IN_PROGRESS downloads will be created
|
| - // as CANCELLED.
|
| - DownloadItem::DownloadState state;
|
| -
|
| - // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS
|
| - // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT.
|
| - content::DownloadDangerType danger_type;
|
| - };
|
| -
|
| - void LoadExtension(const char* name) {
|
| - // Store the created Extension object so that we can attach it to
|
| - // ExtensionFunctions. Also load the extension in incognito profiles for
|
| - // testing incognito.
|
| - extension_ = LoadExtensionIncognito(test_data_dir_.AppendASCII(name));
|
| - CHECK(extension_);
|
| - content::WebContents* tab = chrome::AddSelectedTabWithURL(
|
| - current_browser(),
|
| - extension_->GetResourceURL("empty.html"),
|
| - content::PAGE_TRANSITION_LINK);
|
| - extensions::ExtensionSystem::Get(current_browser()->profile())->
|
| - event_router()->AddEventListener(
|
| - extensions::event_names::kOnDownloadCreated,
|
| - tab->GetRenderProcessHost(),
|
| - GetExtensionId());
|
| - extensions::ExtensionSystem::Get(current_browser()->profile())->
|
| - event_router()->AddEventListener(
|
| - extensions::event_names::kOnDownloadChanged,
|
| - tab->GetRenderProcessHost(),
|
| - GetExtensionId());
|
| - extensions::ExtensionSystem::Get(current_browser()->profile())->
|
| - event_router()->AddEventListener(
|
| - extensions::event_names::kOnDownloadErased,
|
| - tab->GetRenderProcessHost(),
|
| - GetExtensionId());
|
| - }
|
| -
|
| - content::RenderProcessHost* AddFilenameDeterminer() {
|
| - content::WebContents* tab = chrome::AddSelectedTabWithURL(
|
| - current_browser(),
|
| - extension_->GetResourceURL("empty.html"),
|
| - content::PAGE_TRANSITION_LINK);
|
| - extensions::ExtensionSystem::Get(current_browser()->profile())->
|
| - event_router()->AddEventListener(
|
| - extensions::event_names::kOnDownloadDeterminingFilename,
|
| - tab->GetRenderProcessHost(),
|
| - GetExtensionId());
|
| - return tab->GetRenderProcessHost();
|
| - }
|
| -
|
| - void RemoveFilenameDeterminer(content::RenderProcessHost* host) {
|
| - extensions::ExtensionSystem::Get(current_browser()->profile())->
|
| - event_router()->RemoveEventListener(
|
| - extensions::event_names::kOnDownloadDeterminingFilename,
|
| - host,
|
| - GetExtensionId());
|
| - }
|
| -
|
| - Browser* current_browser() { return current_browser_; }
|
| -
|
| - // InProcessBrowserTest
|
| - virtual void SetUpOnMainThread() OVERRIDE {
|
| - ExtensionApiTest::SetUpOnMainThread();
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
|
| - InProcessBrowserTest::SetUpOnMainThread();
|
| - GoOnTheRecord();
|
| - CreateAndSetDownloadsDirectory();
|
| - current_browser()->profile()->GetPrefs()->SetBoolean(
|
| - prefs::kPromptForDownload, false);
|
| - GetOnRecordManager()->RemoveAllDownloads();
|
| - events_listener_.reset(new DownloadsEventsListener());
|
| - // Disable file chooser for current profile.
|
| - DownloadTestFileActivityObserver observer(current_browser()->profile());
|
| - observer.EnableFileChooser(false);
|
| - }
|
| -
|
| - void GoOnTheRecord() { current_browser_ = browser(); }
|
| -
|
| - void GoOffTheRecord() {
|
| - if (!incognito_browser_) {
|
| - incognito_browser_ = CreateIncognitoBrowser();
|
| - GetOffRecordManager()->RemoveAllDownloads();
|
| - // Disable file chooser for incognito profile.
|
| - DownloadTestFileActivityObserver observer(incognito_browser_->profile());
|
| - observer.EnableFileChooser(false);
|
| - }
|
| - current_browser_ = incognito_browser_;
|
| - }
|
| -
|
| - bool WaitFor(const std::string& event_name, const std::string& json_args) {
|
| - return events_listener_->WaitFor(
|
| - current_browser()->profile(), event_name, json_args);
|
| - }
|
| -
|
| - bool WaitForInterruption(DownloadItem* item, int expected_error,
|
| - const std::string& on_created_event) {
|
| - if (!WaitFor(events::kOnDownloadCreated, on_created_event))
|
| - return false;
|
| - // Now, onCreated is always fired before interruption.
|
| - return WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"error\": {\"current\": %d},"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"interrupted\"}}]",
|
| - item->GetId(),
|
| - expected_error));
|
| - }
|
| -
|
| - void ClearEvents() {
|
| - events_listener_->ClearEvents();
|
| - }
|
| -
|
| - std::string GetExtensionURL() {
|
| - return extension_->url().spec();
|
| - }
|
| - std::string GetExtensionId() {
|
| - return extension_->id();
|
| - }
|
| -
|
| - std::string GetFilename(const char* path) {
|
| - std::string result =
|
| - downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe();
|
| -#if defined(OS_WIN)
|
| - for (std::string::size_type next = result.find("\\");
|
| - next != std::string::npos;
|
| - next = result.find("\\", next)) {
|
| - result.replace(next, 1, "\\\\");
|
| - next += 2;
|
| - }
|
| -#endif
|
| - return result;
|
| - }
|
| -
|
| - DownloadManager* GetOnRecordManager() {
|
| - return BrowserContext::GetDownloadManager(browser()->profile());
|
| - }
|
| - DownloadManager* GetOffRecordManager() {
|
| - return BrowserContext::GetDownloadManager(
|
| - browser()->profile()->GetOffTheRecordProfile());
|
| - }
|
| - DownloadManager* GetCurrentManager() {
|
| - return (current_browser_ == incognito_browser_) ?
|
| - GetOffRecordManager() : GetOnRecordManager();
|
| - }
|
| -
|
| - // Creates a set of history downloads based on the provided |history_info|
|
| - // array. |count| is the number of elements in |history_info|. On success,
|
| - // |items| will contain |count| DownloadItems in the order that they were
|
| - // specified in |history_info|. Returns true on success and false otherwise.
|
| - bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info,
|
| - size_t count,
|
| - DownloadManager::DownloadVector* items) {
|
| - DownloadIdComparator download_id_comparator;
|
| - base::Time current = base::Time::Now();
|
| - items->clear();
|
| - GetOnRecordManager()->GetAllDownloads(items);
|
| - CHECK_EQ(0, static_cast<int>(items->size()));
|
| - std::vector<GURL> url_chain;
|
| - url_chain.push_back(GURL());
|
| - for (size_t i = 0; i < count; ++i) {
|
| - DownloadItem* item = GetOnRecordManager()->CreateDownloadItem(
|
| - content::DownloadItem::kInvalidId + 1 + i,
|
| - downloads_directory().Append(history_info[i].filename),
|
| - downloads_directory().Append(history_info[i].filename),
|
| - url_chain, GURL(), // URL Chain, referrer
|
| - current, current, // start_time, end_time
|
| - 1, 1, // received_bytes, total_bytes
|
| - history_info[i].state, // state
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| - content::DOWNLOAD_INTERRUPT_REASON_NONE,
|
| - false); // opened
|
| - items->push_back(item);
|
| - }
|
| -
|
| - // Order by ID so that they are in the order that we created them.
|
| - std::sort(items->begin(), items->end(), download_id_comparator);
|
| - // Set the danger type if necessary.
|
| - for (size_t i = 0; i < count; ++i) {
|
| - if (history_info[i].danger_type !=
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) {
|
| - EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
|
| - history_info[i].danger_type);
|
| - items->at(i)->OnContentCheckCompleted(history_info[i].danger_type);
|
| - }
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - void CreateSlowTestDownloads(
|
| - size_t count, DownloadManager::DownloadVector* items) {
|
| - for (size_t i = 0; i < count; ++i) {
|
| - scoped_ptr<content::DownloadTestObserver> observer(
|
| - CreateInProgressDownloadObserver(1));
|
| - GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(), slow_download_url, CURRENT_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| - observer->WaitForFinished();
|
| - EXPECT_EQ(
|
| - 1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
|
| - }
|
| - GetCurrentManager()->GetAllDownloads(items);
|
| - ASSERT_EQ(count, items->size());
|
| - }
|
| -
|
| - DownloadItem* CreateSlowTestDownload() {
|
| - scoped_ptr<content::DownloadTestObserver> observer(
|
| - CreateInProgressDownloadObserver(1));
|
| - GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
|
| - DownloadManager* manager = GetCurrentManager();
|
| -
|
| - EXPECT_EQ(0, manager->InProgressCount());
|
| - if (manager->InProgressCount() != 0)
|
| - return NULL;
|
| -
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(), slow_download_url, CURRENT_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| -
|
| - observer->WaitForFinished();
|
| - EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
|
| -
|
| - DownloadManager::DownloadVector items;
|
| - manager->GetAllDownloads(&items);
|
| -
|
| - DownloadItem* new_item = NULL;
|
| - for (DownloadManager::DownloadVector::iterator iter = items.begin();
|
| - iter != items.end(); ++iter) {
|
| - if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
|
| - // There should be only one IN_PROGRESS item.
|
| - EXPECT_EQ(NULL, new_item);
|
| - new_item = *iter;
|
| - }
|
| - }
|
| - return new_item;
|
| - }
|
| -
|
| - void FinishPendingSlowDownloads() {
|
| - scoped_ptr<content::DownloadTestObserver> observer(
|
| - CreateDownloadObserver(1));
|
| - GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl);
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(), finish_url, NEW_FOREGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| - observer->WaitForFinished();
|
| - EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
|
| - }
|
| -
|
| - content::DownloadTestObserver* CreateDownloadObserver(size_t download_count) {
|
| - return new content::DownloadTestObserverTerminal(
|
| - GetCurrentManager(), download_count,
|
| - content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
|
| - }
|
| -
|
| - content::DownloadTestObserver* CreateInProgressDownloadObserver(
|
| - size_t download_count) {
|
| - return new content::DownloadTestObserverInProgress(
|
| - GetCurrentManager(), download_count);
|
| - }
|
| -
|
| - bool RunFunction(UIThreadExtensionFunction* function,
|
| - const std::string& args) {
|
| - scoped_refptr<UIThreadExtensionFunction> delete_function(function);
|
| - SetUpExtensionFunction(function);
|
| - return extension_function_test_utils::RunFunction(
|
| - function, args, browser(), GetFlags());
|
| - }
|
| -
|
| - extension_function_test_utils::RunFunctionFlags GetFlags() {
|
| - return current_browser()->profile()->IsOffTheRecord() ?
|
| - extension_function_test_utils::INCLUDE_INCOGNITO :
|
| - extension_function_test_utils::NONE;
|
| - }
|
| -
|
| - // extension_function_test_utils::RunFunction*() only uses browser for its
|
| - // profile(), so pass it the on-record browser so that it always uses the
|
| - // on-record profile to match real-life behavior.
|
| -
|
| - base::Value* RunFunctionAndReturnResult(
|
| - scoped_refptr<UIThreadExtensionFunction> function,
|
| - const std::string& args) {
|
| - SetUpExtensionFunction(function.get());
|
| - return extension_function_test_utils::RunFunctionAndReturnSingleResult(
|
| - function.get(), args, browser(), GetFlags());
|
| - }
|
| -
|
| - std::string RunFunctionAndReturnError(
|
| - scoped_refptr<UIThreadExtensionFunction> function,
|
| - const std::string& args) {
|
| - SetUpExtensionFunction(function.get());
|
| - return extension_function_test_utils::RunFunctionAndReturnError(
|
| - function.get(), args, browser(), GetFlags());
|
| - }
|
| -
|
| - bool RunFunctionAndReturnString(
|
| - scoped_refptr<UIThreadExtensionFunction> function,
|
| - const std::string& args,
|
| - std::string* result_string) {
|
| - SetUpExtensionFunction(function.get());
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args));
|
| - EXPECT_TRUE(result.get());
|
| - return result.get() && result->GetAsString(result_string);
|
| - }
|
| -
|
| - std::string DownloadItemIdAsArgList(const DownloadItem* download_item) {
|
| - return base::StringPrintf("[%d]", download_item->GetId());
|
| - }
|
| -
|
| - const base::FilePath& downloads_directory() {
|
| - return downloads_directory_.path();
|
| - }
|
| -
|
| - DownloadsEventsListener* events_listener() { return events_listener_.get(); }
|
| -
|
| - private:
|
| - void SetUpExtensionFunction(UIThreadExtensionFunction* function) {
|
| - if (extension_) {
|
| - // Recreate the tab each time for insulation.
|
| - content::WebContents* tab = chrome::AddSelectedTabWithURL(
|
| - current_browser(),
|
| - extension_->GetResourceURL("empty.html"),
|
| - content::PAGE_TRANSITION_LINK);
|
| - function->set_extension(extension_);
|
| - function->SetRenderViewHost(tab->GetRenderViewHost());
|
| - }
|
| - }
|
| -
|
| - void CreateAndSetDownloadsDirectory() {
|
| - ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
|
| - current_browser()->profile()->GetPrefs()->SetFilePath(
|
| - prefs::kDownloadDefaultDirectory,
|
| - downloads_directory_.path());
|
| - }
|
| -
|
| - base::ScopedTempDir downloads_directory_;
|
| - const extensions::Extension* extension_;
|
| - Browser* incognito_browser_;
|
| - Browser* current_browser_;
|
| - scoped_ptr<DownloadsEventsListener> events_listener_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest);
|
| -};
|
| -
|
| -class MockIconExtractorImpl : public DownloadFileIconExtractor {
|
| - public:
|
| - MockIconExtractorImpl(const base::FilePath& path,
|
| - IconLoader::IconSize icon_size,
|
| - const std::string& response)
|
| - : expected_path_(path),
|
| - expected_icon_size_(icon_size),
|
| - response_(response) {
|
| - }
|
| - virtual ~MockIconExtractorImpl() {}
|
| -
|
| - virtual bool ExtractIconURLForPath(const base::FilePath& path,
|
| - IconLoader::IconSize icon_size,
|
| - IconURLCallback callback) OVERRIDE {
|
| - EXPECT_STREQ(expected_path_.value().c_str(), path.value().c_str());
|
| - EXPECT_EQ(expected_icon_size_, icon_size);
|
| - if (expected_path_ == path &&
|
| - expected_icon_size_ == icon_size) {
|
| - callback_ = callback;
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&MockIconExtractorImpl::RunCallback,
|
| - base::Unretained(this)));
|
| - return true;
|
| - } else {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - private:
|
| - void RunCallback() {
|
| - callback_.Run(response_);
|
| - }
|
| -
|
| - base::FilePath expected_path_;
|
| - IconLoader::IconSize expected_icon_size_;
|
| - std::string response_;
|
| - IconURLCallback callback_;
|
| -};
|
| -
|
| -bool ItemNotInProgress(DownloadItem* item) {
|
| - return item->GetState() != DownloadItem::IN_PROGRESS;
|
| -}
|
| -
|
| -// Cancels the underlying DownloadItem when the ScopedCancellingItem goes out of
|
| -// scope. Like a scoped_ptr, but for DownloadItems.
|
| -class ScopedCancellingItem {
|
| - public:
|
| - explicit ScopedCancellingItem(DownloadItem* item) : item_(item) {}
|
| - ~ScopedCancellingItem() {
|
| - item_->Cancel(true);
|
| - content::DownloadUpdatedObserver observer(
|
| - item_, base::Bind(&ItemNotInProgress));
|
| - observer.WaitForEvent();
|
| - }
|
| - DownloadItem* get() { return item_; }
|
| - private:
|
| - DownloadItem* item_;
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedCancellingItem);
|
| -};
|
| -
|
| -// Cancels all the underlying DownloadItems when the ScopedItemVectorCanceller
|
| -// goes out of scope. Generalization of ScopedCancellingItem to many
|
| -// DownloadItems.
|
| -class ScopedItemVectorCanceller {
|
| - public:
|
| - explicit ScopedItemVectorCanceller(DownloadManager::DownloadVector* items)
|
| - : items_(items) {
|
| - }
|
| - ~ScopedItemVectorCanceller() {
|
| - for (DownloadManager::DownloadVector::const_iterator item = items_->begin();
|
| - item != items_->end(); ++item) {
|
| - if ((*item)->GetState() == DownloadItem::IN_PROGRESS)
|
| - (*item)->Cancel(true);
|
| - content::DownloadUpdatedObserver observer(
|
| - (*item), base::Bind(&ItemNotInProgress));
|
| - observer.WaitForEvent();
|
| - }
|
| - }
|
| -
|
| - private:
|
| - DownloadManager::DownloadVector* items_;
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller);
|
| -};
|
| -
|
| -class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
|
| - public:
|
| - explicit TestProtocolHandler(
|
| - webkit_blob::BlobStorageController* blob_storage_controller,
|
| - fileapi::FileSystemContext* file_system_context)
|
| - : blob_storage_controller_(blob_storage_controller),
|
| - file_system_context_(file_system_context) {}
|
| -
|
| - virtual ~TestProtocolHandler() {}
|
| -
|
| - virtual net::URLRequestJob* MaybeCreateJob(
|
| - net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate) const OVERRIDE {
|
| - return new webkit_blob::BlobURLRequestJob(
|
| - request,
|
| - network_delegate,
|
| - blob_storage_controller_->GetBlobDataFromUrl(request->url()),
|
| - file_system_context_,
|
| - base::MessageLoopProxy::current().get());
|
| - }
|
| -
|
| - private:
|
| - webkit_blob::BlobStorageController* const blob_storage_controller_;
|
| - fileapi::FileSystemContext* const file_system_context_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler);
|
| -};
|
| -
|
| -class TestURLRequestContext : public net::URLRequestContext {
|
| - public:
|
| - explicit TestURLRequestContext(
|
| - fileapi::FileSystemContext* file_system_context)
|
| - : blob_storage_controller_(new webkit_blob::BlobStorageController) {
|
| - // Job factory owns the protocol handler.
|
| - job_factory_.SetProtocolHandler(
|
| - "blob", new TestProtocolHandler(blob_storage_controller_.get(),
|
| - file_system_context));
|
| - set_job_factory(&job_factory_);
|
| - }
|
| -
|
| - virtual ~TestURLRequestContext() {}
|
| -
|
| - webkit_blob::BlobStorageController* blob_storage_controller() const {
|
| - return blob_storage_controller_.get();
|
| - }
|
| -
|
| - private:
|
| - net::URLRequestJobFactoryImpl job_factory_;
|
| - scoped_ptr<webkit_blob::BlobStorageController> blob_storage_controller_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestURLRequestContext);
|
| -};
|
| -
|
| -// Writes an HTML5 file so that it can be downloaded.
|
| -class HTML5FileWriter {
|
| - public:
|
| - HTML5FileWriter(
|
| - Profile* profile,
|
| - const std::string& filename,
|
| - const std::string& origin,
|
| - DownloadsEventsListener* events_listener,
|
| - const std::string& payload)
|
| - : profile_(profile),
|
| - filename_(filename),
|
| - origin_(origin),
|
| - events_listener_(events_listener),
|
| - blob_data_(new webkit_blob::BlobData()),
|
| - payload_(payload),
|
| - fs_(BrowserContext::GetDefaultStoragePartition(profile_)->
|
| - GetFileSystemContext()) {
|
| - CHECK(profile_);
|
| - CHECK(events_listener_);
|
| - CHECK(fs_);
|
| - }
|
| -
|
| - ~HTML5FileWriter() {
|
| - CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
|
| - &HTML5FileWriter::TearDownURLRequestContext, base::Unretained(this))));
|
| - events_listener_->WaitFor(
|
| - profile_, kURLRequestContextToreDown, std::string());
|
| - }
|
| -
|
| - bool WriteFile() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - fs_->OpenFileSystem(
|
| - GURL(origin_),
|
| - fileapi::kFileSystemTypeTemporary,
|
| - fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
|
| - base::Bind(&HTML5FileWriter::OpenFileSystemCallback,
|
| - base::Unretained(this)));
|
| - return events_listener_->WaitFor(profile_, kHTML5FileWritten, filename_);
|
| - }
|
| -
|
| - private:
|
| - static const char kHTML5FileWritten[];
|
| - static const char kURLRequestContextToreDown[];
|
| - static const bool kExclusive = true;
|
| -
|
| - GURL blob_url() const { return GURL("blob:" + filename_); }
|
| -
|
| - void OpenFileSystemCallback(
|
| - base::PlatformFileError result,
|
| - const std::string& fs_name,
|
| - const GURL& root) {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - root_ = root.spec();
|
| - CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
|
| - &HTML5FileWriter::CreateFile, base::Unretained(this))));
|
| - }
|
| -
|
| - fileapi::FileSystemOperationRunner* operation_runner() {
|
| - return fs_->operation_runner();
|
| - }
|
| -
|
| - void CreateFile() {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - operation_runner()->CreateFile(fs_->CrackURL(GURL(root_ + filename_)),
|
| - kExclusive, base::Bind(
|
| - &HTML5FileWriter::CreateFileCallback, base::Unretained(this)));
|
| - }
|
| -
|
| - void CreateFileCallback(base::PlatformFileError result) {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - CHECK_EQ(base::PLATFORM_FILE_OK, result);
|
| - blob_data_->AppendData(payload_);
|
| - url_request_context_.reset(new TestURLRequestContext(fs_));
|
| - url_request_context_->blob_storage_controller()
|
| - ->AddFinishedBlob(blob_url(), blob_data_.get());
|
| - operation_runner()->Write(
|
| - url_request_context_.get(),
|
| - fs_->CrackURL(GURL(root_ + filename_)),
|
| - blob_url(),
|
| - 0, // offset
|
| - base::Bind(&HTML5FileWriter::WriteCallback, base::Unretained(this)));
|
| - }
|
| -
|
| - void WriteCallback(
|
| - base::PlatformFileError result,
|
| - int64 bytes,
|
| - bool complete) {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - CHECK_EQ(base::PLATFORM_FILE_OK, result);
|
| - CHECK(BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
|
| - &HTML5FileWriter::NotifyWritten, base::Unretained(this))));
|
| - }
|
| -
|
| - void NotifyWritten() {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DownloadsEventsListener::DownloadsNotificationSource notification_source;
|
| - notification_source.event_name = kHTML5FileWritten;
|
| - notification_source.profile = profile_;
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
|
| - content::Source<DownloadsEventsListener::DownloadsNotificationSource>(
|
| - ¬ification_source),
|
| - content::Details<std::string>(&filename_));
|
| - }
|
| -
|
| - void TearDownURLRequestContext() {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - url_request_context_->blob_storage_controller()->RemoveBlob(blob_url());
|
| - url_request_context_.reset();
|
| - CHECK(BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
|
| - &HTML5FileWriter::NotifyURLRequestContextToreDown,
|
| - base::Unretained(this))));
|
| - }
|
| -
|
| - void NotifyURLRequestContextToreDown() {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DownloadsEventsListener::DownloadsNotificationSource notification_source;
|
| - notification_source.event_name = kURLRequestContextToreDown;
|
| - notification_source.profile = profile_;
|
| - std::string empty_args;
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
|
| - content::Source<DownloadsEventsListener::DownloadsNotificationSource>(
|
| - ¬ification_source),
|
| - content::Details<std::string>(&empty_args));
|
| - }
|
| -
|
| - Profile* profile_;
|
| - std::string filename_;
|
| - std::string origin_;
|
| - std::string root_;
|
| - DownloadsEventsListener* events_listener_;
|
| - scoped_refptr<webkit_blob::BlobData> blob_data_;
|
| - std::string payload_;
|
| - scoped_ptr<TestURLRequestContext> url_request_context_;
|
| - fileapi::FileSystemContext* fs_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(HTML5FileWriter);
|
| -};
|
| -
|
| -const char HTML5FileWriter::kHTML5FileWritten[] = "html5_file_written";
|
| -const char HTML5FileWriter::kURLRequestContextToreDown[] =
|
| - "url_request_context_tore_down";
|
| -
|
| -// TODO(benjhayden) Merge this with the other TestObservers.
|
| -class JustInProgressDownloadObserver
|
| - : public content::DownloadTestObserverInProgress {
|
| - public:
|
| - JustInProgressDownloadObserver(
|
| - DownloadManager* download_manager, size_t wait_count)
|
| - : content::DownloadTestObserverInProgress(download_manager, wait_count) {
|
| - }
|
| -
|
| - virtual ~JustInProgressDownloadObserver() {}
|
| -
|
| - private:
|
| - virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE {
|
| - return item->GetState() == DownloadItem::IN_PROGRESS;
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver);
|
| -};
|
| -
|
| -bool ItemIsInterrupted(DownloadItem* item) {
|
| - return item->GetState() == DownloadItem::INTERRUPTED;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Open) {
|
| - LoadExtension("downloads_split");
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - RunFunctionAndReturnError(
|
| - new DownloadsOpenFunction(),
|
| - "[-42]").c_str());
|
| -
|
| - DownloadItem* download_item = CreateSlowTestDownload();
|
| - ASSERT_TRUE(download_item);
|
| - EXPECT_FALSE(download_item->GetOpened());
|
| - EXPECT_FALSE(download_item->GetOpenWhenComplete());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"application/octet-stream\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_item->GetURL().spec().c_str())));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - RunFunctionAndReturnError(
|
| - new DownloadsOpenFunction(),
|
| - DownloadItemIdAsArgList(download_item)).c_str());
|
| -
|
| - FinishPendingSlowDownloads();
|
| - EXPECT_FALSE(download_item->GetOpened());
|
| - EXPECT_TRUE(RunFunction(new DownloadsOpenFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_TRUE(download_item->GetOpened());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_PauseResumeCancelErase) {
|
| - DownloadItem* download_item = CreateSlowTestDownload();
|
| - ASSERT_TRUE(download_item);
|
| -
|
| - // Call pause(). It should succeed and the download should be paused on
|
| - // return.
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_TRUE(download_item->IsPaused());
|
| -
|
| - // Calling pause() twice shouldn't be an error.
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_TRUE(download_item->IsPaused());
|
| -
|
| - // Now try resuming this download. It should succeed.
|
| - EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_FALSE(download_item->IsPaused());
|
| -
|
| - // Resume again. Resuming a download that wasn't paused is not an error.
|
| - EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_FALSE(download_item->IsPaused());
|
| -
|
| - // Pause again.
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_TRUE(download_item->IsPaused());
|
| -
|
| - // And now cancel.
|
| - EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
|
| -
|
| - // Cancel again. Shouldn't have any effect.
|
| - EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(),
|
| - DownloadItemIdAsArgList(download_item)));
|
| - EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
|
| -
|
| - // Calling paused on a non-active download yields kInvalidOperationError.
|
| - std::string error = RunFunctionAndReturnError(
|
| - new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -
|
| - // Calling resume on a non-active download yields kInvalidOperationError
|
| - error = RunFunctionAndReturnError(
|
| - new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -
|
| - // Calling paused on a non-existent download yields kInvalidOperationError.
|
| - error = RunFunctionAndReturnError(
|
| - new DownloadsPauseFunction(), "[-42]");
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -
|
| - // Calling resume on a non-existent download yields kInvalidOperationError
|
| - error = RunFunctionAndReturnError(
|
| - new DownloadsResumeFunction(), "[-42]");
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -
|
| - int id = download_item->GetId();
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsEraseFunction(),
|
| - base::StringPrintf("[{\"id\": %d}]", id)));
|
| - DownloadManager::DownloadVector items;
|
| - GetCurrentManager()->GetAllDownloads(&items);
|
| - EXPECT_EQ(0UL, items.size());
|
| - ASSERT_TRUE(result);
|
| - download_item = NULL;
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| - int element = -1;
|
| - ASSERT_TRUE(result_list->GetInteger(0, &element));
|
| - EXPECT_EQ(id, element);
|
| -}
|
| -
|
| -scoped_refptr<UIThreadExtensionFunction> MockedGetFileIconFunction(
|
| - const base::FilePath& expected_path,
|
| - IconLoader::IconSize icon_size,
|
| - const std::string& response) {
|
| - scoped_refptr<DownloadsGetFileIconFunction> function(
|
| - new DownloadsGetFileIconFunction());
|
| - function->SetIconExtractorForTesting(new MockIconExtractorImpl(
|
| - expected_path, icon_size, response));
|
| - return function;
|
| -}
|
| -
|
| -// Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted
|
| -// download items.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_FileIcon_Active) {
|
| - DownloadItem* download_item = CreateSlowTestDownload();
|
| - ASSERT_TRUE(download_item);
|
| - ASSERT_FALSE(download_item->GetTargetFilePath().empty());
|
| - std::string args32(base::StringPrintf("[%d, {\"size\": 32}]",
|
| - download_item->GetId()));
|
| - std::string result_string;
|
| -
|
| - // Get the icon for the in-progress download. This call should succeed even
|
| - // if the file type isn't registered.
|
| - // Test whether the correct path is being pased into the icon extractor.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - base::StringPrintf("[%d, {}]", download_item->GetId()), &result_string));
|
| -
|
| - // Now try a 16x16 icon.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - download_item->GetTargetFilePath(), IconLoader::SMALL, "foo"),
|
| - base::StringPrintf("[%d, {\"size\": 16}]", download_item->GetId()),
|
| - &result_string));
|
| -
|
| - // Explicitly asking for 32x32 should give us a 32x32 icon.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - args32, &result_string));
|
| -
|
| - // Finish the download and try again.
|
| - FinishPendingSlowDownloads();
|
| - EXPECT_EQ(DownloadItem::COMPLETE, download_item->GetState());
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - args32, &result_string));
|
| -
|
| - // Check the path passed to the icon extractor post-completion.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - args32, &result_string));
|
| -
|
| - // Now create another download.
|
| - download_item = CreateSlowTestDownload();
|
| - ASSERT_TRUE(download_item);
|
| - ASSERT_FALSE(download_item->GetTargetFilePath().empty());
|
| - args32 = base::StringPrintf("[%d, {\"size\": 32}]", download_item->GetId());
|
| -
|
| - // Cancel the download. As long as the download has a target path, we should
|
| - // be able to query the file icon.
|
| - download_item->Cancel(true);
|
| - ASSERT_FALSE(download_item->GetTargetFilePath().empty());
|
| - // Let cleanup complete on the FILE thread.
|
| - content::RunAllPendingInMessageLoop(BrowserThread::FILE);
|
| - // Check the path passed to the icon extractor post-cancellation.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - args32,
|
| - &result_string));
|
| -
|
| - // Simulate an error during icon load by invoking the mock with an empty
|
| - // result string.
|
| - std::string error = RunFunctionAndReturnError(
|
| - MockedGetFileIconFunction(download_item->GetTargetFilePath(),
|
| - IconLoader::NORMAL,
|
| - std::string()),
|
| - args32);
|
| - EXPECT_STREQ(download_extension_errors::kIconNotFoundError, error.c_str());
|
| -
|
| - // Once the download item is deleted, we should return kInvalidOperationError.
|
| - int id = download_item->GetId();
|
| - download_item->Remove();
|
| - download_item = NULL;
|
| - EXPECT_EQ(static_cast<DownloadItem*>(NULL),
|
| - GetCurrentManager()->GetDownload(id));
|
| - error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args32);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -}
|
| -
|
| -// Test that we can acquire file icons for history downloads regardless of
|
| -// whether they exist or not. If the file doesn't exist we should receive a
|
| -// generic icon from the OS/toolkit that may or may not be specific to the file
|
| -// type.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_FileIcon_History) {
|
| - const HistoryDownloadInfo kHistoryInfo[] = {
|
| - { FILE_PATH_LITERAL("real.txt"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
|
| - { FILE_PATH_LITERAL("fake.txt"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
|
| - };
|
| - DownloadManager::DownloadVector all_downloads;
|
| - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
|
| - &all_downloads));
|
| -
|
| - base::FilePath real_path = all_downloads[0]->GetTargetFilePath();
|
| - base::FilePath fake_path = all_downloads[1]->GetTargetFilePath();
|
| -
|
| - EXPECT_EQ(0, file_util::WriteFile(real_path, "", 0));
|
| - ASSERT_TRUE(base::PathExists(real_path));
|
| - ASSERT_FALSE(base::PathExists(fake_path));
|
| -
|
| - for (DownloadManager::DownloadVector::iterator iter = all_downloads.begin();
|
| - iter != all_downloads.end();
|
| - ++iter) {
|
| - std::string result_string;
|
| - // Use a MockIconExtractorImpl to test if the correct path is being passed
|
| - // into the DownloadFileIconExtractor.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - (*iter)->GetTargetFilePath(), IconLoader::NORMAL, "hello"),
|
| - base::StringPrintf("[%d, {\"size\": 32}]", (*iter)->GetId()),
|
| - &result_string));
|
| - EXPECT_STREQ("hello", result_string.c_str());
|
| - }
|
| -
|
| - // The temporary files should be cleaned up when the base::ScopedTempDir is removed.
|
| -}
|
| -
|
| -// Test passing the empty query to search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchEmptyQuery) {
|
| - ScopedCancellingItem item(CreateSlowTestDownload());
|
| - ASSERT_TRUE(item.get());
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| -}
|
| -
|
| -// Test the |filenameRegex| parameter for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchFilenameRegex) {
|
| - const HistoryDownloadInfo kHistoryInfo[] = {
|
| - { FILE_PATH_LITERAL("foobar"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
|
| - { FILE_PATH_LITERAL("baz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
|
| - };
|
| - DownloadManager::DownloadVector all_downloads;
|
| - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
|
| - &all_downloads));
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| - base::DictionaryValue* item_value = NULL;
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
|
| - int item_id = -1;
|
| - ASSERT_TRUE(item_value->GetInteger("id", &item_id));
|
| - ASSERT_EQ(all_downloads[0]->GetId(), static_cast<uint32>(item_id));
|
| -}
|
| -
|
| -// Test the |id| parameter for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchId) {
|
| - DownloadManager::DownloadVector items;
|
| - CreateSlowTestDownloads(2, &items);
|
| - ScopedItemVectorCanceller delete_items(&items);
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), base::StringPrintf(
|
| - "[{\"id\": %u}]", items[0]->GetId())));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| - base::DictionaryValue* item_value = NULL;
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
|
| - int item_id = -1;
|
| - ASSERT_TRUE(item_value->GetInteger("id", &item_id));
|
| - ASSERT_EQ(items[0]->GetId(), static_cast<uint32>(item_id));
|
| -}
|
| -
|
| -// Test specifying both the |id| and |filename| parameters for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchIdAndFilename) {
|
| - DownloadManager::DownloadVector items;
|
| - CreateSlowTestDownloads(2, &items);
|
| - ScopedItemVectorCanceller delete_items(&items);
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(),
|
| - "[{\"id\": 0, \"filename\": \"foobar\"}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(0UL, result_list->GetSize());
|
| -}
|
| -
|
| -// Test a single |orderBy| parameter for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchOrderBy) {
|
| - const HistoryDownloadInfo kHistoryInfo[] = {
|
| - { FILE_PATH_LITERAL("zzz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
|
| - { FILE_PATH_LITERAL("baz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
|
| - };
|
| - DownloadManager::DownloadVector items;
|
| - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
|
| - &items));
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{\"orderBy\": \"filename\"}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(2UL, result_list->GetSize());
|
| - base::DictionaryValue* item0_value = NULL;
|
| - base::DictionaryValue* item1_value = NULL;
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &item0_value));
|
| - ASSERT_TRUE(result_list->GetDictionary(1, &item1_value));
|
| - std::string item0_name, item1_name;
|
| - ASSERT_TRUE(item0_value->GetString("filename", &item0_name));
|
| - ASSERT_TRUE(item1_value->GetString("filename", &item1_name));
|
| - ASSERT_GT(items[0]->GetTargetFilePath().value(),
|
| - items[1]->GetTargetFilePath().value());
|
| - ASSERT_LT(item0_name, item1_name);
|
| -}
|
| -
|
| -// Test specifying an empty |orderBy| parameter for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchOrderByEmpty) {
|
| - const HistoryDownloadInfo kHistoryInfo[] = {
|
| - { FILE_PATH_LITERAL("zzz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
|
| - { FILE_PATH_LITERAL("baz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
|
| - };
|
| - DownloadManager::DownloadVector items;
|
| - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
|
| - &items));
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{\"orderBy\": \"\"}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(2UL, result_list->GetSize());
|
| - base::DictionaryValue* item0_value = NULL;
|
| - base::DictionaryValue* item1_value = NULL;
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &item0_value));
|
| - ASSERT_TRUE(result_list->GetDictionary(1, &item1_value));
|
| - std::string item0_name, item1_name;
|
| - ASSERT_TRUE(item0_value->GetString("filename", &item0_name));
|
| - ASSERT_TRUE(item1_value->GetString("filename", &item1_name));
|
| - ASSERT_GT(items[0]->GetTargetFilePath().value(),
|
| - items[1]->GetTargetFilePath().value());
|
| - ASSERT_GT(item0_name, item1_name);
|
| -}
|
| -
|
| -// Test the |danger| option for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchDanger) {
|
| - const HistoryDownloadInfo kHistoryInfo[] = {
|
| - { FILE_PATH_LITERAL("zzz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
|
| - { FILE_PATH_LITERAL("baz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
|
| - };
|
| - DownloadManager::DownloadVector items;
|
| - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
|
| - &items));
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| -}
|
| -
|
| -// Test the |state| option for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchState) {
|
| - DownloadManager::DownloadVector items;
|
| - CreateSlowTestDownloads(2, &items);
|
| - ScopedItemVectorCanceller delete_items(&items);
|
| -
|
| - items[0]->Cancel(true);
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| -}
|
| -
|
| -// Test the |limit| option for search().
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchLimit) {
|
| - DownloadManager::DownloadVector items;
|
| - CreateSlowTestDownloads(2, &items);
|
| - ScopedItemVectorCanceller delete_items(&items);
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{\"limit\": 1}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| -}
|
| -
|
| -// Test invalid search parameters.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchInvalid) {
|
| - std::string error = RunFunctionAndReturnError(
|
| - new DownloadsSearchFunction(), "[{\"filenameRegex\": \"(\"}]");
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilterError,
|
| - error.c_str());
|
| - error = RunFunctionAndReturnError(
|
| - new DownloadsSearchFunction(), "[{\"orderBy\": \"goat\"}]");
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOrderByError,
|
| - error.c_str());
|
| - error = RunFunctionAndReturnError(
|
| - new DownloadsSearchFunction(), "[{\"limit\": -1}]");
|
| - EXPECT_STREQ(download_extension_errors::kInvalidQueryLimit,
|
| - error.c_str());
|
| -}
|
| -
|
| -// Test searching using multiple conditions through multiple downloads.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchPlural) {
|
| - const HistoryDownloadInfo kHistoryInfo[] = {
|
| - { FILE_PATH_LITERAL("aaa"),
|
| - DownloadItem::CANCELLED,
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
|
| - { FILE_PATH_LITERAL("zzz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
|
| - { FILE_PATH_LITERAL("baz"),
|
| - DownloadItem::COMPLETE,
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
|
| - };
|
| - DownloadManager::DownloadVector items;
|
| - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
|
| - &items));
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{"
|
| - "\"state\": \"complete\", "
|
| - "\"danger\": \"content\", "
|
| - "\"orderBy\": \"filename\", "
|
| - "\"limit\": 1}]"));
|
| - ASSERT_TRUE(result.get());
|
| - base::ListValue* result_list = NULL;
|
| - ASSERT_TRUE(result->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| - base::DictionaryValue* item_value = NULL;
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
|
| - base::FilePath::StringType item_name;
|
| - ASSERT_TRUE(item_value->GetString("filename", &item_name));
|
| - ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name);
|
| -}
|
| -
|
| -// Test that incognito downloads are only visible in incognito contexts, and
|
| -// test that on-record downloads are visible in both incognito and on-record
|
| -// contexts, for DownloadsSearchFunction, DownloadsPauseFunction,
|
| -// DownloadsResumeFunction, and DownloadsCancelFunction.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_SearchPauseResumeCancelGetFileIconIncognito) {
|
| - scoped_ptr<base::Value> result_value;
|
| - base::ListValue* result_list = NULL;
|
| - base::DictionaryValue* result_dict = NULL;
|
| - base::FilePath::StringType filename;
|
| - bool is_incognito = false;
|
| - std::string error;
|
| - std::string on_item_arg;
|
| - std::string off_item_arg;
|
| - std::string result_string;
|
| -
|
| - // Set up one on-record item and one off-record item.
|
| - // Set up the off-record item first because otherwise there are mysteriously 3
|
| - // items total instead of 2.
|
| - // TODO(benjhayden): Figure out where the third item comes from.
|
| - GoOffTheRecord();
|
| - DownloadItem* off_item = CreateSlowTestDownload();
|
| - ASSERT_TRUE(off_item);
|
| - off_item_arg = DownloadItemIdAsArgList(off_item);
|
| -
|
| - GoOnTheRecord();
|
| - DownloadItem* on_item = CreateSlowTestDownload();
|
| - ASSERT_TRUE(on_item);
|
| - on_item_arg = DownloadItemIdAsArgList(on_item);
|
| - ASSERT_TRUE(on_item->GetTargetFilePath() != off_item->GetTargetFilePath());
|
| -
|
| - // Extensions running in the incognito window should have access to both
|
| - // items because the Test extension is in spanning mode.
|
| - GoOffTheRecord();
|
| - result_value.reset(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{}]"));
|
| - ASSERT_TRUE(result_value.get());
|
| - ASSERT_TRUE(result_value->GetAsList(&result_list));
|
| - ASSERT_EQ(2UL, result_list->GetSize());
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
|
| - ASSERT_TRUE(result_dict->GetString("filename", &filename));
|
| - ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
|
| - EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
|
| - EXPECT_FALSE(is_incognito);
|
| - ASSERT_TRUE(result_list->GetDictionary(1, &result_dict));
|
| - ASSERT_TRUE(result_dict->GetString("filename", &filename));
|
| - ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
|
| - EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename));
|
| - EXPECT_TRUE(is_incognito);
|
| -
|
| - // Extensions running in the on-record window should have access only to the
|
| - // on-record item.
|
| - GoOnTheRecord();
|
| - result_value.reset(RunFunctionAndReturnResult(
|
| - new DownloadsSearchFunction(), "[{}]"));
|
| - ASSERT_TRUE(result_value.get());
|
| - ASSERT_TRUE(result_value->GetAsList(&result_list));
|
| - ASSERT_EQ(1UL, result_list->GetSize());
|
| - ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
|
| - ASSERT_TRUE(result_dict->GetString("filename", &filename));
|
| - EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
|
| - ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
|
| - EXPECT_FALSE(is_incognito);
|
| -
|
| - // Pausing/Resuming the off-record item while on the record should return an
|
| - // error. Cancelling "non-existent" downloads is not an error.
|
| - error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| - error = RunFunctionAndReturnError(new DownloadsResumeFunction(),
|
| - off_item_arg);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| - error = RunFunctionAndReturnError(
|
| - new DownloadsGetFileIconFunction(),
|
| - base::StringPrintf("[%d, {}]", off_item->GetId()));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -
|
| - GoOffTheRecord();
|
| -
|
| - // Do the FileIcon test for both the on- and off-items while off the record.
|
| - // NOTE(benjhayden): This does not include the FileIcon test from history,
|
| - // just active downloads. This shouldn't be a problem.
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - on_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string));
|
| - EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
|
| - off_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
|
| - base::StringPrintf("[%d, {}]", off_item->GetId()), &result_string));
|
| -
|
| - // Do the pause/resume/cancel test for both the on- and off-items while off
|
| - // the record.
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
|
| - EXPECT_TRUE(on_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
|
| - EXPECT_TRUE(on_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg));
|
| - EXPECT_FALSE(on_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg));
|
| - EXPECT_FALSE(on_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
|
| - EXPECT_TRUE(on_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg));
|
| - EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState());
|
| - EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg));
|
| - EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState());
|
| - error = RunFunctionAndReturnError(new DownloadsPauseFunction(), on_item_arg);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| - error = RunFunctionAndReturnError(new DownloadsResumeFunction(), on_item_arg);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
|
| - EXPECT_TRUE(off_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
|
| - EXPECT_TRUE(off_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg));
|
| - EXPECT_FALSE(off_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg));
|
| - EXPECT_FALSE(off_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
|
| - EXPECT_TRUE(off_item->IsPaused());
|
| - EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg));
|
| - EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState());
|
| - EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg));
|
| - EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState());
|
| - error = RunFunctionAndReturnError(new DownloadsPauseFunction(),
|
| - off_item_arg);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| - error = RunFunctionAndReturnError(new DownloadsResumeFunction(),
|
| - off_item_arg);
|
| - EXPECT_STREQ(download_extension_errors::kInvalidOperationError,
|
| - error.c_str());
|
| -}
|
| -
|
| -// Test that we can start a download and that the correct sequence of events is
|
| -// fired for it.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Basic) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| - GoOnTheRecord();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Test that we can start a download from an incognito context, and that the
|
| -// download knows that it's incognito.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Incognito) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - GoOffTheRecord();
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": true,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\":%d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\":%d,"
|
| - " \"state\": {"
|
| - " \"current\": \"complete\","
|
| - " \"previous\": \"in_progress\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -#if defined(OS_WIN) && defined(USE_AURA)
|
| -// This test is very flaky on Win Aura. http://crbug.com/248438
|
| -#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \
|
| - DISABLED_DownloadExtensionTest_Download_UnsafeHeaders
|
| -#else
|
| -#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \
|
| - DownloadExtensionTest_Download_UnsafeHeaders
|
| -#endif
|
| -
|
| -// Test that we disallow certain headers case-insensitively.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - MAYBE_DownloadExtensionTest_Download_UnsafeHeaders) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - GoOnTheRecord();
|
| -
|
| - static const char* kUnsafeHeaders[] = {
|
| - "Accept-chArsEt",
|
| - "accept-eNcoding",
|
| - "coNNection",
|
| - "coNteNt-leNgth",
|
| - "cooKIE",
|
| - "cOOkie2",
|
| - "coNteNt-traNsfer-eNcodiNg",
|
| - "dAtE",
|
| - "ExpEcT",
|
| - "hOsT",
|
| - "kEEp-aLivE",
|
| - "rEfErEr",
|
| - "tE",
|
| - "trAilER",
|
| - "trANsfer-eNcodiNg",
|
| - "upGRAde",
|
| - "usER-agENt",
|
| - "viA",
|
| - "pRoxY-",
|
| - "sEc-",
|
| - "pRoxY-probably-not-evil",
|
| - "sEc-probably-not-evil",
|
| - "oRiGiN",
|
| - "Access-Control-Request-Headers",
|
| - "Access-Control-Request-Method",
|
| - };
|
| -
|
| - for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) {
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| - EXPECT_STREQ(download_extension_errors::kGenericError,
|
| - RunFunctionAndReturnError(new DownloadsDownloadFunction(),
|
| - base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"unsafe-header-%d.txt\","
|
| - " \"headers\": [{"
|
| - " \"name\": \"%s\","
|
| - " \"value\": \"unsafe\"}]}]",
|
| - download_url.c_str(),
|
| - static_cast<int>(index),
|
| - kUnsafeHeaders[index])).c_str());
|
| - }
|
| -}
|
| -
|
| -// Test that subdirectories (slashes) are disallowed in filenames.
|
| -// TODO(benjhayden) Update this when subdirectories are supported.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Subdirectory) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| - GoOnTheRecord();
|
| -
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError,
|
| - RunFunctionAndReturnError(new DownloadsDownloadFunction(),
|
| - base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"sub/dir/ect/ory.txt\"}]",
|
| - download_url.c_str())).c_str());
|
| -}
|
| -
|
| -// Test that invalid filenames are disallowed.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_InvalidFilename) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| - GoOnTheRecord();
|
| -
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError,
|
| - RunFunctionAndReturnError(new DownloadsDownloadFunction(),
|
| - base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"../../../../../etc/passwd\"}]",
|
| - download_url.c_str())).c_str());
|
| -}
|
| -
|
| -// Test that downloading invalid URLs immediately returns kInvalidURLError.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_InvalidURLs) {
|
| - LoadExtension("downloads_split");
|
| - GoOnTheRecord();
|
| -
|
| - static const char* kInvalidURLs[] = {
|
| - "foo bar",
|
| - "../hello",
|
| - "/hello",
|
| - "google.com/",
|
| - "http://",
|
| - "#frag",
|
| - "foo/bar.html#frag",
|
| - };
|
| -
|
| - for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) {
|
| - EXPECT_STREQ(download_extension_errors::kInvalidURLError,
|
| - RunFunctionAndReturnError(new DownloadsDownloadFunction(),
|
| - base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str())
|
| - << kInvalidURLs[index];
|
| - }
|
| -
|
| - EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError(
|
| - new DownloadsDownloadFunction(),
|
| - "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str());
|
| - EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError(
|
| - new DownloadsDownloadFunction(),
|
| - "[{\"url\": \"javascript:return false;\"}]").c_str());
|
| - EXPECT_STREQ("net::ERR_NOT_IMPLEMENTED", RunFunctionAndReturnError(
|
| - new DownloadsDownloadFunction(),
|
| - "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str());
|
| -}
|
| -
|
| -// TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to
|
| -// permissions, test downloading from ftp.
|
| -
|
| -// Valid URLs plus fragments are still valid URLs.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_URLFragment) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0#fragment").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Valid data URLs are valid URLs.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_DataURL) {
|
| - LoadExtension("downloads_split");
|
| - std::string download_url = "data:text/plain,hello";
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"data.txt\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("data.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Valid file URLs are valid URLs.
|
| -#if defined(OS_WIN) && defined(USE_AURA)
|
| -// Disabled due to crbug.com/175711
|
| -#define MAYBE_DownloadExtensionTest_Download_File \
|
| - DISABLED_DownloadExtensionTest_Download_File
|
| -#else
|
| -#define MAYBE_DownloadExtensionTest_Download_File \
|
| - DownloadExtensionTest_Download_File
|
| -#endif
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - MAYBE_DownloadExtensionTest_Download_File) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - std::string download_url = "file:///";
|
| -#if defined(OS_WIN)
|
| - download_url += "C:/";
|
| -#endif
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"file.txt\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/html\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("file.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Test that auth-basic-succeed would fail if the resource requires the
|
| -// Authorization header and chrome fails to propagate it back to the server.
|
| -// This tests both that testserver.py does not succeed when it should fail as
|
| -// well as how the downloads extension API exposes the failure to extensions.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_AuthBasic_Fail) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("auth-basic").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"auth-basic-fail.txt\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitForInterruption(item, 30, base::StringPrintf(
|
| - "[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/html\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| -}
|
| -
|
| -// Test that DownloadsDownloadFunction propagates |headers| to the URLRequest.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Headers) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("files/downloads/"
|
| - "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"headers-succeed.txt\","
|
| - " \"headers\": ["
|
| - " {\"name\": \"Foo\", \"value\": \"bar\"},"
|
| - " {\"name\": \"Qx\", \"value\":\"yo\"}]}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"application/octet-stream\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("headers-succeed.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Test that headers-succeed would fail if the resource requires the headers and
|
| -// chrome fails to propagate them back to the server. This tests both that
|
| -// testserver.py does not succeed when it should fail as well as how the
|
| -// downloads extension api exposes the failure to extensions.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Headers_Fail) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("files/downloads/"
|
| - "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"headers-fail.txt\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitForInterruption(item, 33, base::StringPrintf(
|
| - "[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"bytesReceived\": 0,"
|
| - " \"mime\": \"\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| -}
|
| -
|
| -// Test that DownloadsDownloadFunction propagates the Authorization header
|
| -// correctly.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_AuthBasic) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("auth-basic").spec();
|
| - // This is just base64 of 'username:secret'.
|
| - static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0";
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"auth-basic-succeed.txt\","
|
| - " \"headers\": [{"
|
| - " \"name\": \"Authorization\","
|
| - " \"value\": \"Basic %s\"}]}]",
|
| - download_url.c_str(), kAuthorization)));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/html\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]", result_id)));
|
| -}
|
| -
|
| -// Test that DownloadsDownloadFunction propagates the |method| and |body|
|
| -// parameters to the URLRequest.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Post) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("files/post/downloads/"
|
| - "a_zip_file.zip?expected_body=BODY").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"filename\": \"post-succeed.txt\","
|
| - " \"method\": \"POST\","
|
| - " \"body\": \"BODY\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"application/octet-stream\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("post-succeed.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Test that downloadPostSuccess would fail if the resource requires the POST
|
| -// method, and chrome fails to propagate the |method| parameter back to the
|
| -// server. This tests both that testserver.py does not succeed when it should
|
| -// fail, and this tests how the downloads extension api exposes the failure to
|
| -// extensions.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Post_Get) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("files/post/downloads/"
|
| - "a_zip_file.zip?expected_body=BODY").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"body\": \"BODY\","
|
| - " \"filename\": \"post-get.txt\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitForInterruption(item, 33, base::StringPrintf(
|
| - "[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"\","
|
| - " \"paused\": false,"
|
| - " \"id\": %d,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| -}
|
| -
|
| -// Test that downloadPostSuccess would fail if the resource requires the POST
|
| -// method, and chrome fails to propagate the |body| parameter back to the
|
| -// server. This tests both that testserver.py does not succeed when it should
|
| -// fail, and this tests how the downloads extension api exposes the failure to
|
| -// extensions.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Post_NoBody) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("files/post/downloads/"
|
| - "a_zip_file.zip?expected_body=BODY").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\","
|
| - " \"method\": \"POST\","
|
| - " \"filename\": \"post-nobody.txt\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitForInterruption(item, 33, base::StringPrintf(
|
| - "[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"\","
|
| - " \"paused\": false,"
|
| - " \"id\": %d,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| -}
|
| -
|
| -// Test that cancel()ing an in-progress download causes its state to transition
|
| -// to interrupted, and test that that state transition is detectable by an
|
| -// onChanged event listener. TODO(benjhayden): Test other sources of
|
| -// interruptions such as server death.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_Cancel) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL(
|
| - "download-known-size").spec();
|
| - GoOnTheRecord();
|
| -
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"application/octet-stream\","
|
| - " \"paused\": false,"
|
| - " \"id\": %d,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - item->Cancel(true);
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"error\": {\"current\": 40},"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"interrupted\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// Test downloading filesystem: URLs.
|
| -// NOTE: chrome disallows creating HTML5 FileSystem Files in incognito.
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_Download_FileSystemURL) {
|
| - static const char* kPayloadData = "on the record\ndata";
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - HTML5FileWriter html5_file_writer(
|
| - browser()->profile(),
|
| - "on_record.txt",
|
| - GetExtensionURL(),
|
| - events_listener(),
|
| - kPayloadData);
|
| - ASSERT_TRUE(html5_file_writer.WriteFile());
|
| -
|
| - std::string download_url = "filesystem:" + GetExtensionURL() +
|
| - "temporary/on_record.txt";
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| -
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("on_record.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| - std::string disk_data;
|
| - EXPECT_TRUE(file_util::ReadFileToString(item->GetTargetFilePath(),
|
| - &disk_data));
|
| - EXPECT_STREQ(kPayloadData, disk_data.c_str());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_NoChange) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - // Wait for the onCreated and onDeterminingFilename events.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("overridden.swf")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"danger\": {"
|
| - " \"previous\":\"safe\","
|
| - " \"current\":\"file\"},"
|
| - " \"dangerAccepted\": {"
|
| - " \"current\":false}}]",
|
| - result_id)));
|
| -
|
| - item->ValidateDangerousDownload();
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"dangerAccepted\": {"
|
| - " \"previous\":false,"
|
| - " \"current\":true}}]",
|
| - result_id)));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| - EXPECT_EQ(downloads_directory().AppendASCII("overridden.swf"),
|
| - item->GetTargetFilePath());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_ReferencesParentInvalid) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("sneaky/../../sneaky.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_IllegalFilename) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("<")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf(
|
| - "[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf(
|
| - "[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_IllegalFilenameExtension) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL(
|
| - "My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}/foo")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf(
|
| - "[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf(
|
| - "[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_ReservedFilename) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("con.foo")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf(
|
| - "[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf(
|
| - "[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_CurDirInvalid) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL(".")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_ParentDirInvalid) {
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("..")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_AbsPathInvalid) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename. Absolute paths should be rejected.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - downloads_directory().Append(FILE_PATH_LITERAL("sneaky.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_EmptyBasenameInvalid) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename. Empty basenames should be rejected.
|
| - std::string error;
|
| - ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("foo/")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_STREQ(download_extension_errors::kInvalidFilenameError, error.c_str());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_Override) {
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - AddFilenameDeterminer();
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - std::string error;
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("slow.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -
|
| - // Start downloading a file.
|
| - result.reset(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller2(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - // Also test that DetermineFilename allows (chrome) extensions to set
|
| - // filenames without (filename) extensions. (Don't ask about v8 extensions or
|
| - // python extensions or kernel extensions or firefox extensions...)
|
| - error = "";
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("foo")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("foo").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -// TODO test precedence rules: install_time
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer) {
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - GoOnTheRecord();
|
| - LoadExtension("downloads_split");
|
| - content::RenderProcessHost* host = AddFilenameDeterminer();
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - // Start downloading a file.
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Remove a determiner while waiting for it.
|
| - RemoveFilenameDeterminer(host);
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_IncognitoSplit) {
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - GoOnTheRecord();
|
| - AddFilenameDeterminer();
|
| -
|
| - GoOffTheRecord();
|
| - AddFilenameDeterminer();
|
| -
|
| - // Start an on-record download.
|
| - GoOnTheRecord();
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - // Wait for the onCreated and onDeterminingFilename events.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"incognito\": false,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename events.
|
| - std::string error;
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - current_browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("42.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("42.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -
|
| - // Start an incognito download for comparison.
|
| - GoOffTheRecord();
|
| - result.reset(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller2(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": true,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - // On-Record renderers should not see events for off-record items.
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"incognito\": true,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - error = "";
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - current_browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("5.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("5.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - DownloadExtensionTest_OnDeterminingFilename_IncognitoSpanning) {
|
| - LoadExtension("downloads_spanning");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - std::string download_url = test_server()->GetURL("slow?0").spec();
|
| -
|
| - GoOnTheRecord();
|
| - AddFilenameDeterminer();
|
| -
|
| - // There is a single extension renderer that sees both on-record and
|
| - // off-record events. The extension functions see the on-record profile with
|
| - // include_incognito=true.
|
| -
|
| - // Start an on-record download.
|
| - GoOnTheRecord();
|
| - scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - int result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - // Wait for the onCreated and onDeterminingFilename events.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"incognito\": false,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename events.
|
| - std::string error;
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - current_browser()->profile(),
|
| - true,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("42.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("42.txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -
|
| - // Start an incognito download for comparison.
|
| - GoOffTheRecord();
|
| - result.reset(RunFunctionAndReturnResult(
|
| - new DownloadsDownloadFunction(), base::StringPrintf(
|
| - "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| - ASSERT_TRUE(result.get());
|
| - result_id = -1;
|
| - ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| - item = GetCurrentManager()->GetDownload(result_id);
|
| - ASSERT_TRUE(item);
|
| - ScopedCancellingItem canceller2(item);
|
| - ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": true,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"text/plain\","
|
| - " \"paused\": false,"
|
| - " \"url\": \"%s\"}]",
|
| - result_id,
|
| - download_url.c_str())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"incognito\": true,"
|
| - " \"filename\":\"slow.txt\"}]",
|
| - result_id)));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - // Respond to the onDeterminingFilename.
|
| - error = "";
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - current_browser()->profile(),
|
| - true,
|
| - GetExtensionId(),
|
| - result_id,
|
| - base::FilePath(FILE_PATH_LITERAL("42.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error));
|
| - EXPECT_EQ("", error);
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - result_id,
|
| - GetFilename("42 (1).txt").c_str())));
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - result_id)));
|
| -}
|
| -
|
| -#if defined(OS_WIN)
|
| -// This test is very flaky on Win XP and Aura. http://crbug.com/248438
|
| -#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
|
| - DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
|
| -#else
|
| -#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
|
| - DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
|
| -#endif
|
| -
|
| -// Test download interruption while extensions determining filename. Should not
|
| -// re-dispatch onDeterminingFilename.
|
| -IN_PROC_BROWSER_TEST_F(
|
| - DownloadExtensionTest,
|
| - MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) {
|
| - CommandLine::ForCurrentProcess()->AppendSwitch(
|
| - switches::kEnableDownloadResumption);
|
| - LoadExtension("downloads_split");
|
| - ASSERT_TRUE(StartEmbeddedTestServer());
|
| - ASSERT_TRUE(test_server()->Start());
|
| - GoOnTheRecord();
|
| - content::RenderProcessHost* host = AddFilenameDeterminer();
|
| -
|
| - // Start a download.
|
| - DownloadItem* item = NULL;
|
| - {
|
| - DownloadManager* manager = GetCurrentManager();
|
| - scoped_ptr<content::DownloadTestObserver> observer(
|
| - new JustInProgressDownloadObserver(manager, 1));
|
| - ASSERT_EQ(0, manager->InProgressCount());
|
| - // Tabs created just for a download are automatically closed, invalidating
|
| - // the download's WebContents. Downloads without WebContents cannot be
|
| - // resumed. http://crbug.com/225901
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(),
|
| - GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl),
|
| - CURRENT_TAB,
|
| - ui_test_utils::BROWSER_TEST_NONE);
|
| - observer->WaitForFinished();
|
| - EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
|
| - DownloadManager::DownloadVector items;
|
| - manager->GetAllDownloads(&items);
|
| - for (DownloadManager::DownloadVector::iterator iter = items.begin();
|
| - iter != items.end(); ++iter) {
|
| - if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
|
| - // There should be only one IN_PROGRESS item.
|
| - EXPECT_EQ(NULL, item);
|
| - item = *iter;
|
| - }
|
| - }
|
| - ASSERT_TRUE(item);
|
| - }
|
| - ScopedCancellingItem canceller(item);
|
| -
|
| - // Wait for the onCreated and onDeterminingFilename event.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| - base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"application/octet-stream\","
|
| - " \"paused\": false}]",
|
| - item->GetId())));
|
| - ASSERT_TRUE(WaitFor(
|
| - events::kOnDownloadDeterminingFilename,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"incognito\": false,"
|
| - " \"filename\":\"download-unknown-size\"}]",
|
| - item->GetId())));
|
| - ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| - ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
|
| -
|
| - ClearEvents();
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(),
|
| - GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl),
|
| - NEW_BACKGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| -
|
| - // Errors caught before filename determination are delayed until after
|
| - // filename determination.
|
| - std::string error;
|
| - ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| - current_browser()->profile(),
|
| - false,
|
| - GetExtensionId(),
|
| - item->GetId(),
|
| - base::FilePath(FILE_PATH_LITERAL("42.txt")),
|
| - extensions::api::downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
|
| - &error)) << error;
|
| - EXPECT_EQ("", error);
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"\","
|
| - " \"current\": \"%s\"}}]",
|
| - item->GetId(),
|
| - GetFilename("42.txt").c_str())));
|
| -
|
| - content::DownloadUpdatedObserver interrupted(item, base::Bind(
|
| - ItemIsInterrupted));
|
| - ASSERT_TRUE(interrupted.WaitForEvent());
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"error\":{\"current\":20},"
|
| - " \"state\":{"
|
| - " \"previous\":\"in_progress\","
|
| - " \"current\":\"interrupted\"}}]",
|
| - item->GetId())));
|
| -
|
| - ClearEvents();
|
| - // Downloads that are restarted on resumption trigger another download target
|
| - // determination.
|
| - RemoveFilenameDeterminer(host);
|
| - item->Resume();
|
| -
|
| - // Errors caught before filename determination is complete are delayed until
|
| - // after filename determination so that, on resumption, filename determination
|
| - // does not need to be re-done. So, there will not be a second
|
| - // onDeterminingFilename event.
|
| -
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"error\":{\"previous\":20},"
|
| - " \"state\":{"
|
| - " \"previous\":\"interrupted\","
|
| - " \"current\":\"in_progress\"}}]",
|
| - item->GetId())));
|
| -
|
| - ClearEvents();
|
| - FinishPendingSlowDownloads();
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"state\": {"
|
| - " \"previous\": \"in_progress\","
|
| - " \"current\": \"complete\"}}]",
|
| - item->GetId())));
|
| -}
|
| -
|
| -// TODO(benjhayden) Figure out why DisableExtension() does not fire
|
| -// OnListenerRemoved.
|
| -
|
| -// TODO(benjhayden) Test that the shelf is shown for download() both with and
|
| -// without a WebContents.
|
| -
|
| -class DownloadsApiTest : public ExtensionApiTest {
|
| - public:
|
| - DownloadsApiTest() {}
|
| - virtual ~DownloadsApiTest() {}
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(DownloadsApiTest);
|
| -};
|
| -
|
| -
|
| -IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) {
|
| - ASSERT_TRUE(RunExtensionTest("downloads")) << message_;
|
| -}
|
|
|