15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_file_icon_extractor.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_test_file_activity_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/downloads/downloads_api.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_names.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_slow_download_job.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/data_url.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h" 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::URLRequestSlowDownloadJob; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace events = extensions::event_names; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace errors = download_extension_errors; 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace api = extensions::api::downloads; 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Comparator that orders download items by their ID. Can be used with 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::sort. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DownloadIdComparator { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator() (DownloadItem* first, DownloadItem* second) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first->GetId() < second->GetId(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadsEventsListener : public content::NotificationObserver { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsEventsListener() 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : waiting_(false) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DownloadsEventsListener() { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Remove(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&events_); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearEvents() { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STLDeleteElements(&events_); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events_.clear(); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Event { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Event(Profile* profile, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& event_name, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& json_args, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time caught) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_name_(event_name), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_args_(json_args), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_(base::JSONReader::Read(json_args)), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caught_(caught) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& caught() { return caught_; } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Satisfies(const Event& other) const { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return other.SatisfiedBy(*this); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SatisfiedBy(const Event& other) const { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((profile_ != other.profile_) || 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event_name_ != other.event_name_)) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (((event_name_ == events::kOnDownloadDeterminingFilename) || 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (event_name_ == events::kOnDownloadCreated) || 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (event_name_ == events::kOnDownloadChanged)) && 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_.get() && 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_.get()) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* left_list = NULL; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* left_dict = NULL; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* right_list = NULL; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* right_dict = NULL; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args_->GetAsList(&left_list) || 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !other.args_->GetAsList(&right_list) || 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !left_list->GetDictionary(0, &left_dict) || 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !right_list->GetDictionary(0, &right_dict)) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*left_dict); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* right_value = NULL; 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!right_dict->HasKey(iter.key()) || 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (right_dict->Get(iter.key(), &right_value) && 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.value().Equals(right_value))) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((event_name_ == events::kOnDownloadErased) && 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_.get() && 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_.get()) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int my_id = -1, other_id = -1; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (args_->GetAsInteger(&my_id) && 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_->GetAsInteger(&other_id) && 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my_id == other_id); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return json_args_ == other.json_args_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string Debug() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("Event(%p, %s, %s, %f)", 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_name_.c_str(), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_args_.c_str(), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caught_.ToJsTime()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_name_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_args_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> args_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time caught_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Event); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsNotificationSource; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsNotificationSource* dns = 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<DownloadsNotificationSource>(source).ptr(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Event* new_event = new Event( 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dns->profile, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dns->event_name, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *content::Details<std::string>(details).ptr(), base::Time::Now()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events_.push_back(new_event); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_ && 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_.get() && 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_event->Satisfies(*waiting_for_)) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = false; 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitFor(Profile* profile, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& event_name, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& json_args) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_.reset(new Event(profile, event_name, json_args, base::Time())); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::deque<Event*>::const_iterator iter = events_.begin(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != events_.end(); ++iter) { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((*iter)->Satisfies(*waiting_for_.get())) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = true; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = !waiting_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Print the events that were caught since the last WaitFor() call to help 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // find the erroneous event. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(benjhayden) Fuzzy-match and highlight the erroneous event. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::deque<Event*>::const_iterator iter = events_.begin(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != events_.end(); ++iter) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->caught() > last_wait_) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Caught " << (*iter)->Debug(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_for_.get()) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Timed out waiting for " << waiting_for_->Debug(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = false; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_.reset(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_wait_ = base::Time::Now(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_wait_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Event> waiting_for_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<Event*> events_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadExtensionTest : public ExtensionApiTest { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest() 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : extension_(NULL), 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_browser_(NULL), 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser_(NULL) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used with CreateHistoryDownloads 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct HistoryDownloadInfo { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filename to use. CreateHistoryDownloads will append this filename to the 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // temporary downloads directory specified by downloads_directory(). 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* filename; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // State for the download. Note that IN_PROGRESS downloads will be created 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as CANCELLED. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::DownloadState state; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadDangerType danger_type; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadExtension(const char* name) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store the created Extension object so that we can attach it to 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionFunctions. Also load the extension in incognito profiles for 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing incognito. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_ = LoadExtensionIncognito(test_data_dir_.AppendASCII(name)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(extension_); 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_->GetResourceURL("empty.html"), 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_router()->AddEventListener( 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::event_names::kOnDownloadCreated, 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab->GetRenderProcessHost(), 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId()); 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_router()->AddEventListener( 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::event_names::kOnDownloadChanged, 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab->GetRenderProcessHost(), 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId()); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_router()->AddEventListener( 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::event_names::kOnDownloadErased, 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab->GetRenderProcessHost(), 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderProcessHost* AddFilenameDeterminer() { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_->GetResourceURL("empty.html"), 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_router()->AddEventListener( 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::event_names::kOnDownloadDeterminingFilename, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab->GetRenderProcessHost(), 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId()); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tab->GetRenderProcessHost(); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveFilenameDeterminer(content::RenderProcessHost* host) { 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_router()->RemoveEventListener( 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::event_names::kOnDownloadDeterminingFilename, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId()); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() { return current_browser_; } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InProcessBrowserTest 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionApiTest::SetUpOnMainThread(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::SetUpOnMainThread(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateAndSetDownloadsDirectory(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOnRecordManager()->RemoveAllDownloads(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events_listener_.reset(new DownloadsEventsListener()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable file chooser for current profile. 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadTestFileActivityObserver observer(current_browser()->profile()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.EnableFileChooser(false); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoOnTheRecord() { current_browser_ = browser(); } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoOffTheRecord() { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!incognito_browser_) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_browser_ = CreateIncognitoBrowser(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOffRecordManager()->RemoveAllDownloads(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable file chooser for incognito profile. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadTestFileActivityObserver observer(incognito_browser_->profile()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.EnableFileChooser(false); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser_ = incognito_browser_; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitFor(const std::string& event_name, const std::string& json_args) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events_listener_->WaitFor( 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile(), event_name, json_args); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool WaitForInterruption( 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadItem* item, 356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DownloadInterruptReason expected_error, 357558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string& on_created_event) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!WaitFor(events::kOnDownloadCreated, on_created_event)) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, onCreated is always fired before interruption. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WaitFor(events::kOnDownloadChanged, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\": {\"current\": \"%s\"}," 364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"state\": {" 365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\": \"in_progress\"," 366558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\": \"interrupted\"}}]", 367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item->GetId(), 368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::InterruptReasonDebugString( 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_error).c_str())); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearEvents() { 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events_listener_->ClearEvents(); 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetExtensionURL() { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_->url().spec(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetExtensionId() { 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extension_->id(); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetFilename(const char* path) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result = 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::string::size_type next = result.find("\\"); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next != std::string::npos; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = result.find("\\", next)) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.replace(next, 1, "\\\\"); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next += 2; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetOnRecordManager() { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager(browser()->profile()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetOffRecordManager() { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetOffTheRecordProfile()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetCurrentManager() { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (current_browser_ == incognito_browser_) ? 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOffRecordManager() : GetOnRecordManager(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a set of history downloads based on the provided |history_info| 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // array. |count| is the number of elements in |history_info|. On success, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |items| will contain |count| DownloadItems in the order that they were 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified in |history_info|. Returns true on success and false otherwise. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector* items) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadIdComparator download_id_comparator; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time current = base::Time::Now(); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->clear(); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetOnRecordManager()->GetAllDownloads(items); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(0, static_cast<int>(items->size())); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL> url_chain; 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_chain.push_back(GURL()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetOnRecordManager()->CreateDownloadItem( 4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadItem::kInvalidId + 1 + i, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory().Append(history_info[i].filename), 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloads_directory().Append(history_info[i].filename), 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_chain, GURL(), // URL Chain, referrer 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current, current, // start_time, end_time 4304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string(), std::string(), // etag, last_modified 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 1, // received_bytes, total_bytes 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_info[i].state, // state 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); // opened 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->push_back(item); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Order by ID so that they are in the order that we created them. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(items->begin(), items->end(), download_id_comparator); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the danger type if necessary. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_info[i].danger_type != 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_info[i].danger_type); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items->at(i)->OnContentCheckCompleted(history_info[i].danger_type); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateSlowTestDownloads( 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, DownloadManager::DownloadVector* items) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInProgressDownloadObserver(1)); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), slow_download_url, CURRENT_TAB, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager()->GetAllDownloads(items); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(count, items->size()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* CreateSlowTestDownload() { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInProgressDownloadObserver(1)); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* manager = GetCurrentManager(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, manager->InProgressCount()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager->InProgressCount() != 0) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), slow_download_url, CURRENT_TAB, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetAllDownloads(&items); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* new_item = NULL; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != items.end(); ++iter) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be only one IN_PROGRESS item. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, new_item); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_item = *iter; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_item; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FinishPendingSlowDownloads() { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateDownloadObserver(1)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), finish_url, NEW_FOREGROUND_TAB, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateDownloadObserver(size_t download_count) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverTerminal( 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager(), download_count, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateInProgressDownloadObserver( 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t download_count) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverInProgress( 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager(), download_count); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RunFunction(UIThreadExtensionFunction* function, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args) { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> delete_function(function); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpExtensionFunction(function); 529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool result = extension_function_test_utils::RunFunction( 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function, args, browser(), GetFlags()); 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!result) { 532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(ERROR) << function->GetError(); 533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::RunFunctionFlags GetFlags() { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_browser()->profile()->IsOffTheRecord() ? 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::INCLUDE_INCOGNITO : 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::NONE; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension_function_test_utils::RunFunction*() only uses browser for its 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile(), so pass it the on-record browser so that it always uses the 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on-record profile to match real-life behavior. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* RunFunctionAndReturnResult( 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args) { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_function_test_utils::RunFunctionAndReturnSingleResult( 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function.get(), args, browser(), GetFlags()); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string RunFunctionAndReturnError( 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_function_test_utils::RunFunctionAndReturnError( 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function.get(), args, browser(), GetFlags()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool RunFunctionAndReturnString( 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args, 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* result_string) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args)); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.get()); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.get() && result->GetAsString(result_string); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string DownloadItemIdAsArgList(const DownloadItem* download_item) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("[%d]", download_item->GetId()); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& downloads_directory() { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return downloads_directory_.path(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsEventsListener* events_listener() { return events_listener_.get(); } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUpExtensionFunction(UIThreadExtensionFunction* function) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate the tab each time for insulation. 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_->GetResourceURL("empty.html"), 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension_); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function->SetRenderViewHost(tab->GetRenderViewHost()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateAndSetDownloadsDirectory() { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir()); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetFilePath( 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDownloadDefaultDirectory, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path()); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir downloads_directory_; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension_; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* incognito_browser_; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser_; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadsEventsListener> events_listener_; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockIconExtractorImpl : public DownloadFileIconExtractor { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockIconExtractorImpl(const base::FilePath& path, 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconLoader::IconSize icon_size, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : expected_path_(path), 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_icon_size_(icon_size), 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_(response) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockIconExtractorImpl() {} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ExtractIconURLForPath(const base::FilePath& path, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize icon_size, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconURLCallback callback) OVERRIDE { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(expected_path_.value().c_str(), path.value().c_str()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_icon_size_, icon_size); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_path_ == path && 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_icon_size_ == icon_size) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockIconExtractorImpl::RunCallback, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunCallback() { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(response_); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_path_; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize expected_icon_size_; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string response_; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconURLCallback callback_; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ItemNotInProgress(DownloadItem* item) { 65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return item->GetState() != DownloadItem::IN_PROGRESS; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels the underlying DownloadItem when the ScopedCancellingItem goes out of 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scope. Like a scoped_ptr, but for DownloadItems. 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedCancellingItem { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedCancellingItem(DownloadItem* item) : item_(item) {} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedCancellingItem() { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item_->Cancel(true); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadUpdatedObserver observer( 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_, base::Bind(&ItemNotInProgress)); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForEvent(); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* get() { return item_; } 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item_; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedCancellingItem); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels all the underlying DownloadItems when the ScopedItemVectorCanceller 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes out of scope. Generalization of ScopedCancellingItem to many 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadItems. 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedItemVectorCanceller { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedItemVectorCanceller(DownloadManager::DownloadVector* items) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : items_(items) { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedItemVectorCanceller() { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::const_iterator item = items_->begin(); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item != items_->end(); ++item) { 68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if ((*item)->GetState() == DownloadItem::IN_PROGRESS) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*item)->Cancel(true); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadUpdatedObserver observer( 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*item), base::Bind(&ItemNotInProgress)); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForEvent(); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector* items_; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes an HTML5 file so that it can be downloaded. 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTML5FileWriter { 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static bool CreateFileForTesting(fileapi::FileSystemContext* context, 701a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const fileapi::FileSystemURL& path, 702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char*data, 703a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int length) { 704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create a temp file. 705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath temp_file; 706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!file_util::CreateTemporaryFile(&temp_file) || 707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_util::WriteFile(temp_file, data, length) != length) { 708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoke the fileapi to copy it into the sandboxed filesystem. 711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool result = false; 712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent done_event(true, false); 713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::PostTask( 714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CreateFileForTestingOnIOThread, 716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(context), 717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) path, temp_file, 718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(&result), 719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(&done_event))); 720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Wait for that to finish. 721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) done_event.Wait(); 722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DeleteFile(temp_file, false); 723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 727a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void CopyInCompletion(bool* result, 728a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* done_event, 729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::PlatformFileError error) { 730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *result = error == base::PLATFORM_FILE_OK; 732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) done_event->Signal(); 733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void CreateFileForTestingOnIOThread( 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fileapi::FileSystemContext* context, 737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const fileapi::FileSystemURL& path, 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& temp_file, 739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool* result, 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* done_event) { 741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context->operation_runner()->CopyInForeignFile( 743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) temp_file, path, 744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CopyInCompletion, 745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(result), 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(done_event))); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Merge this with the other TestObservers. 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class JustInProgressDownloadObserver 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public content::DownloadTestObserverInProgress { 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JustInProgressDownloadObserver( 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager* download_manager, size_t wait_count) 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : content::DownloadTestObserverInProgress(download_manager, wait_count) { 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~JustInProgressDownloadObserver() {} 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE { 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return item->GetState() == DownloadItem::IN_PROGRESS; 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver); 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ItemIsInterrupted(DownloadItem* item) { 77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return item->GetState() == DownloadItem::INTERRUPTED; 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 773558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochcontent::DownloadInterruptReason InterruptReasonExtensionToContent( 774558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::InterruptReason error) { 775558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (error) { 776558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case api::INTERRUPT_REASON_NONE: 777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_NONE; 778558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define INTERRUPT_REASON(name, value) \ 779558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case api::INTERRUPT_REASON_##name: \ 780558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_##name; 781558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 782558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_NONE; 786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 788558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochapi::InterruptReason InterruptReasonContentToExtension( 789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DownloadInterruptReason error) { 790558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (error) { 791558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case content::DOWNLOAD_INTERRUPT_REASON_NONE: 792558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return api::INTERRUPT_REASON_NONE; 793558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define INTERRUPT_REASON(name, value) \ 794558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case content::DOWNLOAD_INTERRUPT_REASON_##name: \ 795558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return api::INTERRUPT_REASON_##name; 796558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 797558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 798558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 799558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 800558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return api::INTERRUPT_REASON_NONE; 801558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 802558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_Open) { 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 808558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunFunctionAndReturnError( 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsOpenFunction(), 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[-42]").c_str()); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_item); 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpenWhenComplete()); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"application/octet-stream\"," 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item->GetURL().spec().c_str()))); 824558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotComplete, 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunFunctionAndReturnError( 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsOpenFunction(), 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemIdAsArgList(download_item)).c_str()); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishPendingSlowDownloads(); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsOpenFunction(), 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(download_item->GetOpened()); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_PauseResumeCancelErase) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call pause(). It should succeed and the download should be paused on 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling pause() twice shouldn't be an error. 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try resuming this download. It should succeed. 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resume again. Resuming a download that wasn't paused is not an error. 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pause again. 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And now cancel. 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel again. Shouldn't have any effect. 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 877558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Calling paused on a non-active download yields kInvalidId. 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = RunFunctionAndReturnError( 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item)); 880558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Calling resume on a non-active download yields kInvalidId 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item)); 885558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 887558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Calling paused on a non-existent download yields kInvalidId. 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsPauseFunction(), "[-42]"); 890558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, error.c_str()); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Calling resume on a non-existent download yields kInvalidId 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsResumeFunction(), "[-42]"); 895558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, error.c_str()); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = download_item->GetId(); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsEraseFunction(), 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d}]", id))); 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManager::DownloadVector items; 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetCurrentManager()->GetAllDownloads(&items); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0UL, items.size()); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item = NULL; 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* result_list = NULL; 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int element = -1; 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result_list->GetInteger(0, &element)); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(id, element); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<UIThreadExtensionFunction> MockedGetFileIconFunction( 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& expected_path, 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize icon_size, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DownloadsGetFileIconFunction> function( 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsGetFileIconFunction()); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->SetIconExtractorForTesting(new MockIconExtractorImpl( 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_path, icon_size, response)); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return function; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download items. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_FileIcon_Active) { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string args32(base::StringPrintf("[%d, {\"size\": 32}]", 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetId())); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the icon for the in-progress download. This call should succeed even 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the file type isn't registered. 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test whether the correct path is being pased into the icon extractor. 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", download_item->GetId()), &result_string)); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try a 16x16 icon. 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::SMALL, "foo"), 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {\"size\": 16}]", download_item->GetId()), 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly asking for 32x32 should give us a 32x32 icon. 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finish the download and try again. 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishPendingSlowDownloads(); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DownloadItem::COMPLETE, download_item->GetState()); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the path passed to the icon extractor post-completion. 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now create another download. 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item = CreateSlowTestDownload(); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args32 = base::StringPrintf("[%d, {\"size\": 32}]", download_item->GetId()); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the download. As long as the download has a target path, we should 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be able to query the file icon. 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->Cancel(true); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let cleanup complete on the FILE thread. 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(BrowserThread::FILE); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the path passed to the icon extractor post-cancellation. 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an error during icon load by invoking the mock with an empty 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result string. 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = RunFunctionAndReturnError( 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockedGetFileIconFunction(download_item->GetTargetFilePath(), 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IconLoader::NORMAL, 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()), 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32); 991558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kIconNotFound, error.c_str()); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 993558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Once the download item is deleted, we should return kInvalidId. 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = download_item->GetId(); 995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) download_item->Remove(); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item = NULL; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<DownloadItem*>(NULL), 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager()->GetDownload(id)); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args32); 1000558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can acquire file icons for history downloads regardless of 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether they exist or not. If the file doesn't exist we should receive a 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generic icon from the OS/toolkit that may or may not be specific to the file 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type. 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_FileIcon_History) { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("real.txt"), 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("fake.txt"), 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector all_downloads; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &all_downloads)); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath real_path = all_downloads[0]->GetTargetFilePath(); 1023b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath fake_path = all_downloads[1]->GetTargetFilePath(); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, file_util::WriteFile(real_path, "", 0)); 10267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(real_path)); 10277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(fake_path)); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = all_downloads.begin(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != all_downloads.end(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter) { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a MockIconExtractorImpl to test if the correct path is being passed 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the DownloadFileIconExtractor. 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 1036b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->GetTargetFilePath(), IconLoader::NORMAL, "hello"), 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {\"size\": 32}]", (*iter)->GetId()), 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("hello", result_string.c_str()); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test passing the empty query to search(). 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchEmptyQuery) { 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem item(CreateSlowTestDownload()); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item.get()); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |filenameRegex| parameter for search(). 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchFilenameRegex) { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("foobar"), 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector all_downloads; 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &all_downloads)); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]")); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id = -1; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetInteger("id", &item_id)); 10827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(all_downloads[0]->GetId(), static_cast<uint32>(item_id)); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |id| parameter for search(). 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchId) { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new DownloadsSearchFunction(), base::StringPrintf( 10937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "[{\"id\": %u}]", items[0]->GetId()))); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id = -1; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetInteger("id", &item_id)); 11027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(items[0]->GetId(), static_cast<uint32>(item_id)); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying both the |id| and |filename| parameters for search(). 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchIdAndFilename) { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"id\": 0, \"filename\": \"foobar\"}]")); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0UL, result_list->GetSize()); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a single |orderBy| parameter for search(). 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchOrderBy) { 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": [\"filename\"]}]")); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item0_value = NULL; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item1_value = NULL; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item0_value)); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &item1_value)); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item0_name, item1_name; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item0_value->GetString("filename", &item0_name)); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item1_value->GetString("filename", &item1_name)); 1149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_GT(items[0]->GetTargetFilePath().value(), 1150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) items[1]->GetTargetFilePath().value()); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(item0_name, item1_name); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying an empty |orderBy| parameter for search(). 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchOrderByEmpty) { 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1170558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": []}]")); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item0_value = NULL; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item1_value = NULL; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item0_value)); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &item1_value)); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item0_name, item1_name; 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item0_value->GetString("filename", &item0_name)); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item1_value->GetString("filename", &item1_name)); 1182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_GT(items[0]->GetTargetFilePath().value(), 1183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) items[1]->GetTargetFilePath().value()); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(item0_name, item1_name); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |danger| option for search(). 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchDanger) { 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]")); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |state| option for search(). 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchState) { 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items[0]->Cancel(true); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]")); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |limit| option for search(). 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchLimit) { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"limit\": 1}]")); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test invalid search parameters. 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchInvalid) { 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = RunFunctionAndReturnError( 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"filenameRegex\": \"(\"}]"); 1247558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilter, 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 1250558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": [\"goat\"]}]"); 1251558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidOrderBy, 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"limit\": -1}]"); 1255558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidQueryLimit, 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test searching using multiple conditions through multiple downloads. 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchPlural) { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("aaa"), 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::CANCELLED, 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{" 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"state\": \"complete\", " 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"danger\": \"content\", " 1281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "\"orderBy\": [\"filename\"], " 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"limit\": 1}]")); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType item_name; 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetString("filename", &item_name)); 1291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that incognito downloads are only visible in incognito contexts, and 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that on-record downloads are visible in both incognito and on-record 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contexts, for DownloadsSearchFunction, DownloadsPauseFunction, 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadsResumeFunction, and DownloadsCancelFunction. 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchPauseResumeCancelGetFileIconIncognito) { 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result_value; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* result_dict = NULL; 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType filename; 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_incognito = false; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string on_item_arg; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string off_item_arg; 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up one on-record item and one off-record item. 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the off-record item first because otherwise there are mysteriously 3 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items total instead of 2. 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(benjhayden): Figure out where the third item comes from. 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* off_item = CreateSlowTestDownload(); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(off_item); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg = DownloadItemIdAsArgList(off_item); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* on_item = CreateSlowTestDownload(); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(on_item); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_item_arg = DownloadItemIdAsArgList(on_item); 1323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(on_item->GetTargetFilePath() != off_item->GetTargetFilePath()); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions running in the incognito window should have access to both 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items because the Test extension is in spanning mode. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_value.reset(RunFunctionAndReturnResult( 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value.get()); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value->GetAsList(&result_list)); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 1336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename)); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(is_incognito); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &result_dict)); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 1341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename)); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(is_incognito); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions running in the on-record window should have access only to the 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on-record item. 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_value.reset(RunFunctionAndReturnResult( 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value.get()); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value->GetAsList(&result_list)); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 1354b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename)); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(is_incognito); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pausing/Resuming the off-record item while on the record should return an 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error. Cancelling "non-existent" downloads is not an error. 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg); 1361558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg); 1365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsGetFileIconFunction(), 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", off_item->GetId())); 1370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the FileIcon test for both the on- and off-items while off the record. 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE(benjhayden): This does not include the FileIcon test from history, 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just active downloads. This shouldn't be a problem. 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string)); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", off_item->GetId()), &result_string)); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the pause/resume/cancel test for both the on- and off-items while off 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the record. 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg)); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(on_item->IsPaused()); 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg)); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(on_item->IsPaused()); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg)); 139890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState()); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg)); 140090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState()); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsPauseFunction(), on_item_arg); 1402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), on_item_arg); 1404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg)); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(off_item->IsPaused()); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg)); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(off_item->IsPaused()); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg)); 141690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState()); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg)); 141890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState()); 1419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg); 1420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg); 1423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download and that the correct sequence of events is 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fired for it. 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Basic) { 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1458b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download from an incognito context, and that the 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download knows that it's incognito. 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Incognito) { 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": true," 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\":%d," 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1502b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\":%d," 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"," 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"}}]", 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 1515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This test is very flaky on Win Aura. http://crbug.com/248438 1516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \ 1517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_DownloadExtensionTest_Download_UnsafeHeaders 1518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 1519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \ 1520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DownloadExtensionTest_Download_UnsafeHeaders 1521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 1522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we disallow certain headers case-insensitively. 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MAYBE_DownloadExtensionTest_Download_UnsafeHeaders) { 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kUnsafeHeaders[] = { 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-chArsEt", 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "accept-eNcoding", 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNNection", 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNteNt-leNgth", 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cooKIE", 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cOOkie2", 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNteNt-traNsfer-eNcodiNg", 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dAtE", 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ExpEcT", 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hOsT", 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kEEp-aLivE", 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rEfErEr", 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "tE", 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trAilER", 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trANsfer-eNcodiNg", 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "upGRAde", 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "usER-agENt", 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "viA", 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pRoxY-", 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sEc-", 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pRoxY-probably-not-evil", 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sEc-probably-not-evil", 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "oRiGiN", 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Access-Control-Request-Headers", 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Access-Control-Request-Method", 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) { 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 1561558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidHeader, 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"unsafe-header-%d.txt\"," 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [{" 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"%s\"," 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"value\": \"unsafe\"}]}]", 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str(), 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(index), 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUnsafeHeaders[index])).c_str()); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) 1576558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\ 1577558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISABLED_DownloadExtensionTest_Download_Subdirectory 1578558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else 1579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\ 1580558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadExtensionTest_Download_Subdirectory 1581558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1583558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MAYBE_DownloadExtensionTest_Download_Subdirectory) { 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1590558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1591558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 1592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "[{\"url\": \"%s\"," 1593558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"filename\": \"sub/dir/ect/ory.txt\"}]", 1594558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 1595558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(result.get()); 1596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int result_id = -1; 1597558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 1598558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 1599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(item); 1600558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedCancellingItem canceller(item); 1601558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 1602558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1603558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 1604558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 1605558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 1606558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"text/plain\"," 1607558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 1608558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 1609558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 1610558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1611558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"id\": %d," 1612558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"filename\": {" 1613558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\": \"\"," 1614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\": \"%s\"}}]", 1615558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 1616558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetFilename("sub/dir/ect/ory.txt").c_str()))); 1617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1618558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"id\": %d," 1619558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"state\": {" 1620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\": \"in_progress\"," 1621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\": \"complete\"}}]", 1622558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id))); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that invalid filenames are disallowed. 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_InvalidFilename) { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"../../../../../etc/passwd\"}]", 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str())).c_str()); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloading invalid URLs immediately returns kInvalidURLError. 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_InvalidURLs) { 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kInvalidURLs[] = { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo bar", 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "../hello", 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/hello", 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://", 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#frag", 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo/bar.html#frag", 1655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "google.com/", 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) { 1659558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidURL, 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 166258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str()) 166358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch << kInvalidURLs[index]; 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 166558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1666bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError( 1667bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1668bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str()); 1669bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError( 1670bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1671bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"javascript:return false;\"}]").c_str()); 1672bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_STREQ("net::ERR_NOT_IMPLEMENTED", RunFunctionAndReturnError( 1673bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1674bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str()); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions, test downloading from ftp. 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid URLs plus fragments are still valid URLs. 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_URLFragment) { 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0#fragment").spec(); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1710b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid data URLs are valid URLs. 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_DataURL) { 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = "data:text/plain,hello"; 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"data.txt\"}]", download_url.c_str()))); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1751b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("data.txt").c_str()))); 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid file URLs are valid URLs. 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to crbug.com/175711 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \ 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_DownloadExtensionTest_Download_File 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \ 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_Download_File 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_DownloadExtensionTest_Download_File) { 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = "file:///"; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url += "C:/"; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"file.txt\"}]", download_url.c_str()))); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/html\"," 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 1803b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("file.txt").c_str()))); 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that auth-basic-succeed would fail if the resource requires the 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authorization header and chrome fails to propagate it back to the server. 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests both that testserver.py does not succeed when it should fail as 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well as how the downloads extension API exposes the failure to extensions. 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_AuthBasic_Fail) { 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("auth-basic").spec(); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"auth-basic-fail.txt\"}]", 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1840558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 1841558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 1842558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, 1843558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 1844558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 1845558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"text/html\"," 1846558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 1847558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 1848558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates |headers| to the URLRequest. 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Headers) { 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/downloads/" 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec(); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"headers-succeed.txt\"," 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [" 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\"name\": \"Foo\", \"value\": \"bar\"}," 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\"name\": \"Qx\", \"value\":\"yo\"}]}]", 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"application/octet-stream\"," 1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1887b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("headers-succeed.txt").c_str()))); 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that headers-succeed would fail if the resource requires the headers and 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome fails to propagate them back to the server. This tests both that 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testserver.py does not succeed when it should fail as well as how the 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloads extension api exposes the failure to extensions. 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Headers_Fail) { 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/downloads/" 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec(); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"headers-fail.txt\"}]", 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 1926558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 1927558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 1928558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 1929558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 1930558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"bytesReceived\": 0," 1931558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 1932558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 1933558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 1934558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the Authorization header 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly. 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_AuthBasic) { 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("auth-basic").spec(); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is just base64 of 'username:secret'. 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0"; 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"auth-basic-succeed.txt\"," 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [{" 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"Authorization\"," 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"value\": \"Basic %s\"}]}]", 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str(), kAuthorization))); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/html\"," 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", download_url.c_str()))); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"state\": {" 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"previous\": \"in_progress\"," 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"complete\"}}]", result_id))); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the |method| and |body| 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters to the URLRequest. 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post) { 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-succeed.txt\"," 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"method\": \"POST\"," 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"body\": \"BODY\"}]", 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"application/octet-stream\"," 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", download_url.c_str()))); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 2013b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"%s\"}}]", 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("post-succeed.txt").c_str()))); 2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |method| parameter back to the 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post_Get) { 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"body\": \"BODY\"," 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-get.txt\"}]", 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2053558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2054558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2055558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2056558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2057558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2058558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2059558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2060558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"id\": %d," 2061558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2062558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 2063558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |body| parameter back to the 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post_NoBody) { 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"method\": \"POST\"," 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-nobody.txt\"}]", 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2094558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2095558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2096558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2097558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2098558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2099558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"id\": %d," 2102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 2104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cancel()ing an in-progress download causes its state to transition 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to interrupted, and test that that state transition is detectable by an 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// onChanged event listener. TODO(benjhayden): Test other sources of 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interruptions such as server death. 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Cancel) { 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL( 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "download-known-size").spec(); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"application/octet-stream\"," 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"id\": %d," 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->Cancel(true); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\": {\"current\":\"USER_CANCELED\"}," 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"state\": {" 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"previous\": \"in_progress\"," 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"interrupted\"}}]", 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id))); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloading filesystem: URLs. 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: chrome disallows creating HTML5 FileSystem Files in incognito. 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_FileSystemURL) { 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kPayloadData = "on the record\ndata"; 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string download_url = "filesystem:" + GetExtensionURL() + 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "temporary/on_record.txt"; 2160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Setup a file in the filesystem which we can download. 2162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(HTML5FileWriter::CreateFileForTesting( 2163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(browser()->profile())-> 2164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetFileSystemContext(), 2165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fileapi::FileSystemURL::CreateForTest(GURL(download_url)), 2166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) kPayloadData, strlen(kPayloadData))); 2167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now download it. 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/plain\"," 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 2191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("on_record.txt").c_str()))); 2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string disk_data; 2202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(file_util::ReadFileToString(item->GetTargetFilePath(), 2203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) &disk_data)); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(kPayloadData, disk_data.c_str()); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_NoChange) { 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 224490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 2254558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) { 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 231190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("overridden.swf")), 2321558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"danger\": {" 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\":\"safe\"," 2329558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\":\"file\"}}]", 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item->ValidateDangerousDownload(); 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"danger\": {" 2336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\":\"file\"," 2337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\":\"accepted\"}}]", 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(downloads_directory().AppendASCII("overridden.swf"), 2346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) item->GetTargetFilePath()); 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ReferencesParentInvalid) { 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 238690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("sneaky/../../sneaky.txt")), 2396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\": {" 2402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IllegalFilename) { 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 245190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("<")), 2461558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2463558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf( 2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2467b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf( 2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IllegalFilenameExtension) { 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 24952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 25022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 25032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 251690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}/foo")), 2527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf( 2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2533b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf( 2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ReservedFilename) { 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 25632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 25652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 258290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("con.foo")), 2592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2594558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf( 2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2598b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, base::StringPrintf( 2603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_CurDirInvalid) { 2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 2633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 2639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor( 2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 2643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 264790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 2653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL(".")), 2657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 2659558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2663b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ParentDirInvalid) { 2678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 2706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor( 2707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 2708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 271290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 2718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 2719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 2720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("..")), 2722558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 2724558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 2725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2728b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_AbsPathInvalid) { 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 27492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 27552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 27692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 277790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. Absolute paths should be rejected. 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) downloads_directory().Append(FILE_PATH_LITERAL("sneaky.txt")), 2787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\": {" 2794b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_EmptyBasenameInvalid) { 28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2812eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 28142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 28302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 28312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 28392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 284390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. Empty basenames should be rejected. 2846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 2847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 2849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 2850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 2851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("foo/")), 2853558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 2855558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 2856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2860b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 2865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_Override) { 2875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 2894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 2900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 2902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor( 2903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 2904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 290890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 2909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 29162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 29172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 2918558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 29212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2925b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 29342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 29352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 29422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 29452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 29462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 2955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 296390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also test that DetermineFilename allows (chrome) extensions to set 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // filenames without (filename) extensions. (Don't ask about v8 extensions or 29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // python extensions or kernel extensions or firefox extensions...) 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("foo")), 2976558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_OVERWRITE, 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 29782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2983b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("foo").c_str()))); 29872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO test precedence rules: install_time 29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer) { 3000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 30032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderProcessHost* host = AddFilenameDeterminer(); 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 30092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 30102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 30122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 30132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 30212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 30232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 30242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 30262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 30272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 30292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 30332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 303490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 30352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove a determiner while waiting for it. 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveFilenameDeterminer(host); 30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 30412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 30422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 30492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IncognitoSplit) { 30502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 3051eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3052eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an on-record download. 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 30702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 30732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 30752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 30762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 30772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 30802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 30822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 30832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 30842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 30872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 30882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 30892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 309190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 30922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename events. 30942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 30972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 30982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 30992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("42.txt").c_str()))); 31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 31192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an incognito download for comparison. 31212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 31262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 31352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 31382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On-Record renderers should not see events for off-record items. 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 315090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("5.txt")), 3160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 31612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 31622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 31652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 31662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("5.txt").c_str()))); 31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 31782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IncognitoSpanning) { 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_spanning"); 3184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 31862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 31872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 31892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 31902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There is a single extension renderer that sees both on-record and 31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // off-record events. The extension functions see the on-record profile with 31932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // include_incognito=true. 31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an on-record download. 31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 32052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 32062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 32072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 32092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 32102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 32112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 32122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 32132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 32142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 32162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 32192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 32222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 32232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 32242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 322590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 32262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename events. 32282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 32292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 32302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 32312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 32322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3235558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 32362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 32372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 32382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 32402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 32412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("42.txt").c_str()))); 32472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 32482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 32492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 32502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 32512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 32522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 32532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an incognito download for comparison. 32552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 32572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 32582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 32592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 32612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 32622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 32632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 32642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 32652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 32662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 32682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 32692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 32702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 32712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 32722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 32732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 32762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 32772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 32782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 32792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 32802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 32822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 328390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 32842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 32862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 32872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 32882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 32892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 32902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 32912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("42 (1).txt").c_str()))); 33052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 33062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 33072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 33082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 33092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 33102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 33112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 33122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#if defined(OS_WIN) 33145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)// This test is very flaky on Win XP and Aura. http://crbug.com/248438 33155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \ 33165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume 33175e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#else 33185e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \ 33195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_InterruptedResume 33205e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#endif 33215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 3322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test download interruption while extensions determining filename. Should not 3323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// re-dispatch onDeterminingFilename. 33242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 33252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 33265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) { 3327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 3328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switches::kEnableDownloadResumption); 33292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 3330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 33322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 3333a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::RenderProcessHost* host = AddFilenameDeterminer(); 33342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start a download. 3336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = NULL; 3337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 3338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager* manager = GetCurrentManager(); 3339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 3340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new JustInProgressDownloadObserver(manager, 1)); 3341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0, manager->InProgressCount()); 3342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tabs created just for a download are automatically closed, invalidating 3343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the download's WebContents. Downloads without WebContents cannot be 3344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // resumed. http://crbug.com/225901 3345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 3347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl), 3348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CURRENT_TAB, 3349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 3350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer->WaitForFinished(); 3351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 3352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager::DownloadVector items; 3353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager->GetAllDownloads(&items); 3354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 3355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != items.end(); ++iter) { 3356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 3357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // There should be only one IN_PROGRESS item. 3358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, item); 3359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item = *iter; 3360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 33642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 33652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename event. 33672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, 33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 3369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 3370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 3371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"application/octet-stream\"," 3372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false}]", 3373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 33742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 33752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) events::kOnDownloadDeterminingFilename, 33762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 3378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"download-unknown-size\"}]", 3379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 33802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 338190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl), 3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NEW_BACKGROUND_TAB, 3388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 33892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Errors caught before filename determination are delayed until after 3391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // filename determination. 33922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 3397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId(), 33982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 3400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)) << error; 34012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 3402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 3403b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"filename\": {" 3405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"current\": \"%s\"}}]", 3407b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) item->GetId(), 3408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetFilename("42.txt").c_str()))); 34092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadUpdatedObserver interrupted(item, base::Bind( 3411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ItemIsInterrupted)); 3412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(interrupted.WaitForEvent()); 3413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 3414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\":{\"current\":\"NETWORK_FAILED\"}," 3416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\":{" 3417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\":\"in_progress\"," 3418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\":\"interrupted\"}}]", 3419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 3420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3422a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Downloads that are restarted on resumption trigger another download target 3423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // determination. 3424a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RemoveFilenameDeterminer(host); 3425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) item->Resume(); 3426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Errors caught before filename determination is complete are delayed until 3428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // after filename determination so that, on resumption, filename determination 3429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // does not need to be re-done. So, there will not be a second 3430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onDeterminingFilename event. 3431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 3433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\":{\"previous\":\"NETWORK_FAILED\"}," 3435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\":{" 3436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\":\"interrupted\"," 3437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\":\"in_progress\"}}]", 3438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 3439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FinishPendingSlowDownloads(); 3442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 34442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, 34452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 34462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 34472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 34482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 3449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 34502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 3453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadExtensionTest_SetShelfEnabled) { 3454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoadExtension("downloads_split"); 3455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[false]")); 3456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(DownloadServiceFactory::GetForBrowserContext( 3457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser()->profile())->IsShelfEnabled()); 3458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[true]")); 3459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(DownloadServiceFactory::GetForBrowserContext( 3460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser()->profile())->IsShelfEnabled()); 3461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test that existing shelves are hidden. 3462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test multiple extensions. 3463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test disabling extensions. 3464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test that browsers associated with other profiles are not 3465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // affected. 3466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test incognito. 3467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 34692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benjhayden) Figure out why DisableExtension() does not fire 34702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnListenerRemoved. 3471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Test that the shelf is shown for download() both with and 3473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// without a WebContents. 3474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadsApiTest : public ExtensionApiTest { 3476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 3477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadsApiTest() {} 3478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DownloadsApiTest() {} 3479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 3480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadsApiTest); 3481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) { 3485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("downloads")) << message_; 3486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3487558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3488558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST(DownloadInterruptReasonEnumsSynced, 3489558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadInterruptReasonEnumsSynced) { 3490558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define INTERRUPT_REASON(name, value) \ 3491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(InterruptReasonContentToExtension( \ 3492558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_##name), \ 3493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::INTERRUPT_REASON_##name); \ 3494558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(InterruptReasonExtensionToContent( \ 3495558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::INTERRUPT_REASON_##name), \ 3496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_##name); 3497558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 3498558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 3499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 35004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 35014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST(ExtensionDetermineDownloadFilenameInternal, 35024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ExtensionDetermineDownloadFilenameInternal) { 35034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 35044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string winner_id; 35054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::FilePath filename; 35064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch extensions::api::downloads::FilenameConflictAction conflict_action = 35074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY; 35084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch extensions::ExtensionWarningSet warnings; 35094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 35104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Empty incumbent determiner 35114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch warnings.clear(); 35124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 35134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::FilePath(FILE_PATH_LITERAL("a")), 35144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch api::FILENAME_CONFLICT_ACTION_OVERWRITE, 35154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "suggester", 35164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time::Now(), 35174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "", 35184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time(), 35194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &winner_id, 35204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &filename, 35214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &conflict_action, 35224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &warnings); 35234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ("suggester", winner_id); 35244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value()); 35254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(api::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action); 35264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_TRUE(warnings.empty()); 35274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 35284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Incumbent wins 35294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch warnings.clear(); 35304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 35314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::FilePath(FILE_PATH_LITERAL("b")), 35324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch api::FILENAME_CONFLICT_ACTION_PROMPT, 35334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "suggester", 35344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time::Now() - base::TimeDelta::FromDays(1), 35354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "incumbent", 35364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time::Now(), 35374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &winner_id, 35384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &filename, 35394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &conflict_action, 35404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &warnings); 35414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ("incumbent", winner_id); 35424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value()); 35434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(api::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action); 35444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_FALSE(warnings.empty()); 35454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(extensions::ExtensionWarning::kDownloadFilenameConflict, 35464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch warnings.begin()->warning_type()); 35474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ("suggester", warnings.begin()->extension_id()); 35484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 35494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Suggester wins 35504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch warnings.clear(); 35514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 35524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::FilePath(FILE_PATH_LITERAL("b")), 35534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch api::FILENAME_CONFLICT_ACTION_PROMPT, 35544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "suggester", 35554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time::Now(), 35564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "incumbent", 35574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time::Now() - base::TimeDelta::FromDays(1), 35584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &winner_id, 35594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &filename, 35604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &conflict_action, 35614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &warnings); 35624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ("suggester", winner_id); 35634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(FILE_PATH_LITERAL("b"), filename.value()); 35644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(api::FILENAME_CONFLICT_ACTION_PROMPT, conflict_action); 35654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_FALSE(warnings.empty()); 35664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ(extensions::ExtensionWarning::kDownloadFilenameConflict, 35674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch warnings.begin()->warning_type()); 35684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch EXPECT_EQ("incumbent", warnings.begin()->extension_id()); 35694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 3570