downloads_api_browsertest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Disable everything on windows only. http://crbug.com/306144 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef OS_WIN 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_file_icon_extractor.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_test_file_activity_observer.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/downloads/downloads_api.h" 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_slow_download_job.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/data_url.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h" 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::URLRequestSlowDownloadJob; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace errors = download_extension_errors; 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace api = extensions::api::downloads; 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Comparator that orders download items by their ID. Can be used with 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::sort. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DownloadIdComparator { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator() (DownloadItem* first, DownloadItem* second) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first->GetId() < second->GetId(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadsEventsListener : public content::NotificationObserver { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsEventsListener() 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : waiting_(false) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DownloadsEventsListener() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Remove(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&events_); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearEvents() { 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STLDeleteElements(&events_); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events_.clear(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Event { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Event(Profile* profile, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& event_name, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& json_args, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time caught) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_name_(event_name), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_args_(json_args), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_(base::JSONReader::Read(json_args)), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caught_(caught) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& caught() { return caught_; } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Satisfies(const Event& other) const { 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return other.SatisfiedBy(*this); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SatisfiedBy(const Event& other) const { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((profile_ != other.profile_) || 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event_name_ != other.event_name_)) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (((event_name_ == api::OnDeterminingFilename::kEventName) || 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) (event_name_ == api::OnCreated::kEventName) || 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) (event_name_ == api::OnChanged::kEventName)) && 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_.get() && 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_.get()) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* left_list = NULL; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* left_dict = NULL; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* right_list = NULL; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* right_dict = NULL; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args_->GetAsList(&left_list) || 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !other.args_->GetAsList(&right_list) || 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !left_list->GetDictionary(0, &left_dict) || 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !right_list->GetDictionary(0, &right_dict)) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*left_dict); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* right_value = NULL; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!right_dict->HasKey(iter.key()) || 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (right_dict->Get(iter.key(), &right_value) && 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.value().Equals(right_value))) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else if ((event_name_ == api::OnErased::kEventName) && 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_.get() && 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_.get()) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int my_id = -1, other_id = -1; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (args_->GetAsInteger(&my_id) && 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_->GetAsInteger(&other_id) && 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my_id == other_id); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return json_args_ == other.json_args_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string Debug() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("Event(%p, %s, %s, %f)", 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_name_.c_str(), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_args_.c_str(), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caught_.ToJsTime()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_name_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_args_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> args_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time caught_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Event); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsNotificationSource; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsNotificationSource* dns = 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<DownloadsNotificationSource>(source).ptr(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Event* new_event = new Event( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dns->profile, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dns->event_name, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *content::Details<std::string>(details).ptr(), base::Time::Now()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events_.push_back(new_event); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_ && 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_.get() && 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_event->Satisfies(*waiting_for_)) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = false; 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitFor(Profile* profile, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& event_name, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& json_args) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_.reset(new Event(profile, event_name, json_args, base::Time())); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::deque<Event*>::const_iterator iter = events_.begin(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != events_.end(); ++iter) { 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((*iter)->Satisfies(*waiting_for_.get())) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = true; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = !waiting_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Print the events that were caught since the last WaitFor() call to help 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // find the erroneous event. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(benjhayden) Fuzzy-match and highlight the erroneous event. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::deque<Event*>::const_iterator iter = events_.begin(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != events_.end(); ++iter) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->caught() > last_wait_) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Caught " << (*iter)->Debug(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_for_.get()) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Timed out waiting for " << waiting_for_->Debug(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = false; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_.reset(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_wait_ = base::Time::Now(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_wait_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Event> waiting_for_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<Event*> events_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadExtensionTest : public ExtensionApiTest { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest() 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : extension_(NULL), 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_browser_(NULL), 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser_(NULL) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used with CreateHistoryDownloads 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct HistoryDownloadInfo { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filename to use. CreateHistoryDownloads will append this filename to the 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // temporary downloads directory specified by downloads_directory(). 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* filename; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // State for the download. Note that IN_PROGRESS downloads will be created 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as CANCELLED. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::DownloadState state; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadDangerType danger_type; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadExtension(const char* name) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store the created Extension object so that we can attach it to 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionFunctions. Also load the extension in incognito profiles for 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing incognito. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_ = LoadExtensionIncognito(test_data_dir_.AppendASCII(name)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(extension_); 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_->GetResourceURL("empty.html"), 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_router()->AddEventListener( 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnCreated::kEventName, 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab->GetRenderProcessHost(), 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId()); 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_router()->AddEventListener( 2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnChanged::kEventName, 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab->GetRenderProcessHost(), 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId()); 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_router()->AddEventListener( 2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnErased::kEventName, 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab->GetRenderProcessHost(), 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderProcessHost* AddFilenameDeterminer() { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_->GetResourceURL("empty.html"), 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_router()->AddEventListener( 3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab->GetRenderProcessHost(), 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tab->GetRenderProcessHost(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveFilenameDeterminer(content::RenderProcessHost* host) { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(current_browser()->profile())-> 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_router()->RemoveEventListener( 3123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId()); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() { return current_browser_; } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InProcessBrowserTest 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionApiTest::SetUpOnMainThread(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::SetUpOnMainThread(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateAndSetDownloadsDirectory(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOnRecordManager()->RemoveAllDownloads(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events_listener_.reset(new DownloadsEventsListener()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable file chooser for current profile. 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadTestFileActivityObserver observer(current_browser()->profile()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.EnableFileChooser(false); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoOnTheRecord() { current_browser_ = browser(); } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoOffTheRecord() { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!incognito_browser_) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_browser_ = CreateIncognitoBrowser(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOffRecordManager()->RemoveAllDownloads(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable file chooser for incognito profile. 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadTestFileActivityObserver observer(incognito_browser_->profile()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.EnableFileChooser(false); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser_ = incognito_browser_; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitFor(const std::string& event_name, const std::string& json_args) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events_listener_->WaitFor( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile(), event_name, json_args); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool WaitForInterruption( 356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadItem* item, 357558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DownloadInterruptReason expected_error, 358558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string& on_created_event) { 3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!WaitFor(api::OnCreated::kEventName, on_created_event)) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, onCreated is always fired before interruption. 3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return WaitFor(api::OnChanged::kEventName, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\": {\"current\": \"%s\"}," 365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"state\": {" 366558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\": \"in_progress\"," 367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\": \"interrupted\"}}]", 368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item->GetId(), 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::InterruptReasonDebugString( 370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_error).c_str())); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearEvents() { 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events_listener_->ClearEvents(); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetExtensionURL() { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_->url().spec(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetExtensionId() { 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extension_->id(); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetFilename(const char* path) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result = 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::string::size_type next = result.find("\\"); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next != std::string::npos; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = result.find("\\", next)) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.replace(next, 1, "\\\\"); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next += 2; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetOnRecordManager() { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager(browser()->profile()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetOffRecordManager() { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager( 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetOffTheRecordProfile()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetCurrentManager() { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (current_browser_ == incognito_browser_) ? 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOffRecordManager() : GetOnRecordManager(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a set of history downloads based on the provided |history_info| 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // array. |count| is the number of elements in |history_info|. On success, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |items| will contain |count| DownloadItems in the order that they were 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified in |history_info|. Returns true on success and false otherwise. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector* items) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadIdComparator download_id_comparator; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time current = base::Time::Now(); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->clear(); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetOnRecordManager()->GetAllDownloads(items); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(0, static_cast<int>(items->size())); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL> url_chain; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_chain.push_back(GURL()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetOnRecordManager()->CreateDownloadItem( 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadItem::kInvalidId + 1 + i, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory().Append(history_info[i].filename), 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloads_directory().Append(history_info[i].filename), 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_chain, GURL(), // URL Chain, referrer 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current, current, // start_time, end_time 431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string(), std::string(), // etag, last_modified 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 1, // received_bytes, total_bytes 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_info[i].state, // state 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); // opened 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->push_back(item); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Order by ID so that they are in the order that we created them. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(items->begin(), items->end(), download_id_comparator); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the danger type if necessary. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_info[i].danger_type != 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_info[i].danger_type); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items->at(i)->OnContentCheckCompleted(history_info[i].danger_type); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateSlowTestDownloads( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, DownloadManager::DownloadVector* items) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInProgressDownloadObserver(1)); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), slow_download_url, CURRENT_TAB, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager()->GetAllDownloads(items); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(count, items->size()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* CreateSlowTestDownload() { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInProgressDownloadObserver(1)); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* manager = GetCurrentManager(); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(0, manager->NonMaliciousInProgressCount()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, manager->InProgressCount()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager->InProgressCount() != 0) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), slow_download_url, CURRENT_TAB, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetAllDownloads(&items); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* new_item = NULL; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != items.end(); ++iter) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be only one IN_PROGRESS item. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, new_item); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_item = *iter; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_item; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FinishPendingSlowDownloads() { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateDownloadObserver(1)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), finish_url, NEW_FOREGROUND_TAB, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateDownloadObserver(size_t download_count) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverTerminal( 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager(), download_count, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateInProgressDownloadObserver( 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t download_count) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverInProgress( 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager(), download_count); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RunFunction(UIThreadExtensionFunction* function, 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> delete_function(function); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpExtensionFunction(function); 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool result = extension_function_test_utils::RunFunction( 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function, args, browser(), GetFlags()); 533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!result) { 534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(ERROR) << function->GetError(); 535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::RunFunctionFlags GetFlags() { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_browser()->profile()->IsOffTheRecord() ? 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::INCLUDE_INCOGNITO : 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::NONE; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension_function_test_utils::RunFunction*() only uses browser for its 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile(), so pass it the on-record browser so that it always uses the 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on-record profile to match real-life behavior. 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* RunFunctionAndReturnResult( 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args) { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_function_test_utils::RunFunctionAndReturnSingleResult( 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function.get(), args, browser(), GetFlags()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string RunFunctionAndReturnError( 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args) { 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_function_test_utils::RunFunctionAndReturnError( 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function.get(), args, browser(), GetFlags()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool RunFunctionAndReturnString( 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args, 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* result_string) { 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args)); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.get()); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.get() && result->GetAsString(result_string); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string DownloadItemIdAsArgList(const DownloadItem* download_item) { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("[%d]", download_item->GetId()); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& downloads_directory() { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return downloads_directory_.path(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsEventsListener* events_listener() { return events_listener_.get(); } 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUpExtensionFunction(UIThreadExtensionFunction* function) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate the tab each time for insulation. 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_->GetResourceURL("empty.html"), 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension_); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function->SetRenderViewHost(tab->GetRenderViewHost()); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateAndSetDownloadsDirectory() { 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetFilePath( 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDownloadDefaultDirectory, 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path()); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir downloads_directory_; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension_; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* incognito_browser_; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser_; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadsEventsListener> events_listener_; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockIconExtractorImpl : public DownloadFileIconExtractor { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockIconExtractorImpl(const base::FilePath& path, 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconLoader::IconSize icon_size, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : expected_path_(path), 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_icon_size_(icon_size), 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_(response) { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockIconExtractorImpl() {} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ExtractIconURLForPath(const base::FilePath& path, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize icon_size, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconURLCallback callback) OVERRIDE { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(expected_path_.value().c_str(), path.value().c_str()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_icon_size_, icon_size); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_path_ == path && 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_icon_size_ == icon_size) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockIconExtractorImpl::RunCallback, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunCallback() { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(response_); 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Drop the reference on extension function to avoid memory leaks. 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_ = IconURLCallback(); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_path_; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize expected_icon_size_; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string response_; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconURLCallback callback_; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ItemNotInProgress(DownloadItem* item) { 65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return item->GetState() != DownloadItem::IN_PROGRESS; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels the underlying DownloadItem when the ScopedCancellingItem goes out of 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scope. Like a scoped_ptr, but for DownloadItems. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedCancellingItem { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedCancellingItem(DownloadItem* item) : item_(item) {} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedCancellingItem() { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item_->Cancel(true); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadUpdatedObserver observer( 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_, base::Bind(&ItemNotInProgress)); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForEvent(); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* get() { return item_; } 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item_; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedCancellingItem); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels all the underlying DownloadItems when the ScopedItemVectorCanceller 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes out of scope. Generalization of ScopedCancellingItem to many 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadItems. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedItemVectorCanceller { 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedItemVectorCanceller(DownloadManager::DownloadVector* items) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : items_(items) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedItemVectorCanceller() { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::const_iterator item = items_->begin(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item != items_->end(); ++item) { 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if ((*item)->GetState() == DownloadItem::IN_PROGRESS) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*item)->Cancel(true); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadUpdatedObserver observer( 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*item), base::Bind(&ItemNotInProgress)); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForEvent(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector* items_; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes an HTML5 file so that it can be downloaded. 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTML5FileWriter { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static bool CreateFileForTesting(fileapi::FileSystemContext* context, 705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const fileapi::FileSystemURL& path, 706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char*data, 707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int length) { 708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create a temp file. 709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath temp_file; 710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!file_util::CreateTemporaryFile(&temp_file) || 711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_util::WriteFile(temp_file, data, length) != length) { 712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoke the fileapi to copy it into the sandboxed filesystem. 715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool result = false; 716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent done_event(true, false); 717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::PostTask( 718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CreateFileForTestingOnIOThread, 720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(context), 721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) path, temp_file, 722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(&result), 723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(&done_event))); 724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Wait for that to finish. 725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) done_event.Wait(); 726a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DeleteFile(temp_file, false); 727a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void CopyInCompletion(bool* result, 732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* done_event, 733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::PlatformFileError error) { 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *result = error == base::PLATFORM_FILE_OK; 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) done_event->Signal(); 737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void CreateFileForTestingOnIOThread( 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fileapi::FileSystemContext* context, 741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const fileapi::FileSystemURL& path, 742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& temp_file, 743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool* result, 744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* done_event) { 745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context->operation_runner()->CopyInForeignFile( 747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) temp_file, path, 748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CopyInCompletion, 749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(result), 750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(done_event))); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Merge this with the other TestObservers. 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class JustInProgressDownloadObserver 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public content::DownloadTestObserverInProgress { 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JustInProgressDownloadObserver( 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager* download_manager, size_t wait_count) 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : content::DownloadTestObserverInProgress(download_manager, wait_count) { 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~JustInProgressDownloadObserver() {} 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE { 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return item->GetState() == DownloadItem::IN_PROGRESS; 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver); 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ItemIsInterrupted(DownloadItem* item) { 77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return item->GetState() == DownloadItem::INTERRUPTED; 775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochcontent::DownloadInterruptReason InterruptReasonExtensionToContent( 778558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::InterruptReason error) { 779558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (error) { 780558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case api::INTERRUPT_REASON_NONE: 781558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_NONE; 782558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define INTERRUPT_REASON(name, value) \ 783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case api::INTERRUPT_REASON_##name: \ 784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_##name; 785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 788558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_NONE; 790558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 791558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 792558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochapi::InterruptReason InterruptReasonContentToExtension( 793558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DownloadInterruptReason error) { 794558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (error) { 795558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case content::DOWNLOAD_INTERRUPT_REASON_NONE: 796558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return api::INTERRUPT_REASON_NONE; 797558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define INTERRUPT_REASON(name, value) \ 798558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case content::DOWNLOAD_INTERRUPT_REASON_##name: \ 799558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return api::INTERRUPT_REASON_##name; 800558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 801558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 802558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 803558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 804558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return api::INTERRUPT_REASON_NONE; 805558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 806558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_Open) { 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 812558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunFunctionAndReturnError( 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsOpenFunction(), 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[-42]").c_str()); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_item); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpenWhenComplete()); 8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"application/octet-stream\"," 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item->GetURL().spec().c_str()))); 828558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotComplete, 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunFunctionAndReturnError( 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsOpenFunction(), 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemIdAsArgList(download_item)).c_str()); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishPendingSlowDownloads(); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsOpenFunction(), 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(download_item->GetOpened()); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_PauseResumeCancelErase) { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string error; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call pause(). It should succeed and the download should be paused on 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return. 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) 852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling removeFile on a non-active download yields kNotComplete 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and should not crash. http://crbug.com/319984 854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsRemoveFileFunction(), 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItemIdAsArgList(download_item)); 856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_STREQ(errors::kNotComplete, error.c_str()); 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling pause() twice shouldn't be an error. 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try resuming this download. It should succeed. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resume again. Resuming a download that wasn't paused is not an error. 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pause again. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And now cancel. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel again. Shouldn't have any effect. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling paused on a non-active download yields kNotInProgress. 889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = RunFunctionAndReturnError( 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item)); 891558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling resume on a non-active download yields kNotResumable 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item)); 896558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling pause on a non-existent download yields kInvalidId. 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsPauseFunction(), "[-42]"); 901558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, error.c_str()); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 903558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Calling resume on a non-existent download yields kInvalidId 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsResumeFunction(), "[-42]"); 906558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, error.c_str()); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling removeFile on a non-existent download yields kInvalidId. 909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = RunFunctionAndReturnError( 910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new DownloadsRemoveFileFunction(), "[-42]"); 911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_STREQ(errors::kInvalidId, error.c_str()); 912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = download_item->GetId(); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsEraseFunction(), 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d}]", id))); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManager::DownloadVector items; 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetCurrentManager()->GetAllDownloads(&items); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0UL, items.size()); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item = NULL; 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* result_list = NULL; 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int element = -1; 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result_list->GetInteger(0, &element)); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(id, element); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<UIThreadExtensionFunction> MockedGetFileIconFunction( 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& expected_path, 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize icon_size, 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) { 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DownloadsGetFileIconFunction> function( 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsGetFileIconFunction()); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->SetIconExtractorForTesting(new MockIconExtractorImpl( 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_path, icon_size, response)); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return function; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download items. 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_FileIcon_Active) { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string args32(base::StringPrintf("[%d, {\"size\": 32}]", 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetId())); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the icon for the in-progress download. This call should succeed even 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the file type isn't registered. 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test whether the correct path is being pased into the icon extractor. 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", download_item->GetId()), &result_string)); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try a 16x16 icon. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::SMALL, "foo"), 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {\"size\": 16}]", download_item->GetId()), 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly asking for 32x32 should give us a 32x32 icon. 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finish the download and try again. 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishPendingSlowDownloads(); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DownloadItem::COMPLETE, download_item->GetState()); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the path passed to the icon extractor post-completion. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now create another download. 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item = CreateSlowTestDownload(); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args32 = base::StringPrintf("[%d, {\"size\": 32}]", download_item->GetId()); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the download. As long as the download has a target path, we should 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be able to query the file icon. 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->Cancel(true); 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let cleanup complete on the FILE thread. 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(BrowserThread::FILE); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the path passed to the icon extractor post-cancellation. 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an error during icon load by invoking the mock with an empty 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result string. 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = RunFunctionAndReturnError( 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockedGetFileIconFunction(download_item->GetTargetFilePath(), 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IconLoader::NORMAL, 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()), 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32); 1007558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kIconNotFound, error.c_str()); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1009558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Once the download item is deleted, we should return kInvalidId. 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = download_item->GetId(); 1011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) download_item->Remove(); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item = NULL; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<DownloadItem*>(NULL), 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager()->GetDownload(id)); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args32); 1016558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can acquire file icons for history downloads regardless of 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether they exist or not. If the file doesn't exist we should receive a 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generic icon from the OS/toolkit that may or may not be specific to the file 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type. 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_FileIcon_History) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("real.txt"), 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("fake.txt"), 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector all_downloads; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &all_downloads)); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1038b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath real_path = all_downloads[0]->GetTargetFilePath(); 1039b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath fake_path = all_downloads[1]->GetTargetFilePath(); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, file_util::WriteFile(real_path, "", 0)); 10427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(real_path)); 10437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(fake_path)); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = all_downloads.begin(); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != all_downloads.end(); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter) { 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a MockIconExtractorImpl to test if the correct path is being passed 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the DownloadFileIconExtractor. 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 1052b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->GetTargetFilePath(), IconLoader::NORMAL, "hello"), 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {\"size\": 32}]", (*iter)->GetId()), 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("hello", result_string.c_str()); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test passing the empty query to search(). 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchEmptyQuery) { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem item(CreateSlowTestDownload()); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item.get()); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |filenameRegex| parameter for search(). 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchFilenameRegex) { 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("foobar"), 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector all_downloads; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &all_downloads)); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]")); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id = -1; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetInteger("id", &item_id)); 10987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(all_downloads[0]->GetId(), static_cast<uint32>(item_id)); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |id| parameter for search(). 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchId) { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 11087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new DownloadsSearchFunction(), base::StringPrintf( 11097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "[{\"id\": %u}]", items[0]->GetId()))); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id = -1; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetInteger("id", &item_id)); 11187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(items[0]->GetId(), static_cast<uint32>(item_id)); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying both the |id| and |filename| parameters for search(). 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchIdAndFilename) { 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"id\": 0, \"filename\": \"foobar\"}]")); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0UL, result_list->GetSize()); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a single |orderBy| parameter for search(). 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchOrderBy) { 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": [\"filename\"]}]")); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item0_value = NULL; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item1_value = NULL; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item0_value)); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &item1_value)); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item0_name, item1_name; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item0_value->GetString("filename", &item0_name)); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item1_value->GetString("filename", &item1_name)); 1165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_GT(items[0]->GetTargetFilePath().value(), 1166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) items[1]->GetTargetFilePath().value()); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(item0_name, item1_name); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying an empty |orderBy| parameter for search(). 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchOrderByEmpty) { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1186558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": []}]")); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item0_value = NULL; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item1_value = NULL; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item0_value)); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &item1_value)); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item0_name, item1_name; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item0_value->GetString("filename", &item0_name)); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item1_value->GetString("filename", &item1_name)); 1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_GT(items[0]->GetTargetFilePath().value(), 1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) items[1]->GetTargetFilePath().value()); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(item0_name, item1_name); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |danger| option for search(). 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchDanger) { 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]")); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |state| option for search(). 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchState) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items[0]->Cancel(true); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]")); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |limit| option for search(). 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchLimit) { 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"limit\": 1}]")); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test invalid search parameters. 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchInvalid) { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = RunFunctionAndReturnError( 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"filenameRegex\": \"(\"}]"); 1263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilter, 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 1266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": [\"goat\"]}]"); 1267558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidOrderBy, 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"limit\": -1}]"); 1271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidQueryLimit, 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test searching using multiple conditions through multiple downloads. 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchPlural) { 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("aaa"), 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::CANCELLED, 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{" 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"state\": \"complete\", " 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"danger\": \"content\", " 1297558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "\"orderBy\": [\"filename\"], " 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"limit\": 1}]")); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType item_name; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetString("filename", &item_name)); 1307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that incognito downloads are only visible in incognito contexts, and 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that on-record downloads are visible in both incognito and on-record 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contexts, for DownloadsSearchFunction, DownloadsPauseFunction, 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadsResumeFunction, and DownloadsCancelFunction. 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchPauseResumeCancelGetFileIconIncognito) { 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result_value; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* result_dict = NULL; 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType filename; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_incognito = false; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string on_item_arg; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string off_item_arg; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up one on-record item and one off-record item. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the off-record item first because otherwise there are mysteriously 3 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items total instead of 2. 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(benjhayden): Figure out where the third item comes from. 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* off_item = CreateSlowTestDownload(); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(off_item); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg = DownloadItemIdAsArgList(off_item); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* on_item = CreateSlowTestDownload(); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(on_item); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_item_arg = DownloadItemIdAsArgList(on_item); 1339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(on_item->GetTargetFilePath() != off_item->GetTargetFilePath()); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions running in the incognito window should have access to both 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items because the Test extension is in spanning mode. 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_value.reset(RunFunctionAndReturnResult( 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value.get()); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value->GetAsList(&result_list)); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 1352b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename)); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(is_incognito); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &result_dict)); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 1357b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename)); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(is_incognito); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions running in the on-record window should have access only to the 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on-record item. 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_value.reset(RunFunctionAndReturnResult( 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value.get()); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value->GetAsList(&result_list)); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 1370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename)); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(is_incognito); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pausing/Resuming the off-record item while on the record should return an 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error. Cancelling "non-existent" downloads is not an error. 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg); 1377558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg); 1381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsGetFileIconFunction(), 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", off_item->GetId())); 1386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the FileIcon test for both the on- and off-items while off the record. 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE(benjhayden): This does not include the FileIcon test from history, 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just active downloads. This shouldn't be a problem. 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string)); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", off_item->GetId()), &result_string)); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the pause/resume/cancel test for both the on- and off-items while off 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the record. 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg)); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(on_item->IsPaused()); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg)); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(on_item->IsPaused()); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg)); 141490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState()); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg)); 141690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState()); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsPauseFunction(), on_item_arg); 1418558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), on_item_arg); 1420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg)); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(off_item->IsPaused()); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg)); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(off_item->IsPaused()); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg)); 143290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState()); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg)); 143490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState()); 1435558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg); 1436558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg); 1439558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download and that the correct sequence of events is 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fired for it. 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Basic) { 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 14713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1474b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 14783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download from an incognito context, and that the 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download knows that it's incognito. 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Incognito) { 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": true," 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 15153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\":%d," 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1518b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 15223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\":%d," 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"," 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"}}]", 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 1531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This test is very flaky on Win Aura. http://crbug.com/248438 1532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \ 1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_DownloadExtensionTest_Download_UnsafeHeaders 1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 1535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \ 1536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DownloadExtensionTest_Download_UnsafeHeaders 1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we disallow certain headers case-insensitively. 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MAYBE_DownloadExtensionTest_Download_UnsafeHeaders) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kUnsafeHeaders[] = { 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-chArsEt", 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "accept-eNcoding", 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNNection", 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNteNt-leNgth", 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cooKIE", 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cOOkie2", 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNteNt-traNsfer-eNcodiNg", 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dAtE", 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ExpEcT", 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hOsT", 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kEEp-aLivE", 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rEfErEr", 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "tE", 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trAilER", 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trANsfer-eNcodiNg", 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "upGRAde", 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "usER-agENt", 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "viA", 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pRoxY-", 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sEc-", 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pRoxY-probably-not-evil", 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sEc-probably-not-evil", 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "oRiGiN", 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Access-Control-Request-Headers", 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Access-Control-Request-Method", 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) { 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 1577558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidHeader, 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"unsafe-header-%d.txt\"," 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [{" 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"%s\"," 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"value\": \"unsafe\"}]}]", 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str(), 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(index), 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUnsafeHeaders[index])).c_str()); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1591558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) 1592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\ 1593558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISABLED_DownloadExtensionTest_Download_Subdirectory 1594558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else 1595558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\ 1596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadExtensionTest_Download_Subdirectory 1597558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MAYBE_DownloadExtensionTest_Download_Subdirectory) { 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1606558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1607558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 1608558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "[{\"url\": \"%s\"," 1609558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"filename\": \"sub/dir/ect/ory.txt\"}]", 1610558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 1611558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(result.get()); 1612558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int result_id = -1; 1613558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 1614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 1615558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(item); 1616558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedCancellingItem canceller(item); 1617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 1618558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 16193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 1620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 1621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 1622558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"text/plain\"," 1623558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 1624558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 1625558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 16263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1627558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"id\": %d," 1628558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"filename\": {" 1629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\": \"\"," 1630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\": \"%s\"}}]", 1631558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 1632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetFilename("sub/dir/ect/ory.txt").c_str()))); 16333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"id\": %d," 1635558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"state\": {" 1636558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\": \"in_progress\"," 1637558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\": \"complete\"}}]", 1638558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id))); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that invalid filenames are disallowed. 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_InvalidFilename) { 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"../../../../../etc/passwd\"}]", 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str())).c_str()); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloading invalid URLs immediately returns kInvalidURLError. 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_InvalidURLs) { 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kInvalidURLs[] = { 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo bar", 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "../hello", 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/hello", 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://", 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#frag", 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo/bar.html#frag", 1671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "google.com/", 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) { 1675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidURL, 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 167858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str()) 167958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch << kInvalidURLs[index]; 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 168158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1682bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError( 1683bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1684bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str()); 1685bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError( 1686bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1687bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"javascript:return false;\"}]").c_str()); 1688bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_STREQ("net::ERR_NOT_IMPLEMENTED", RunFunctionAndReturnError( 1689bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1690bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str()); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions, test downloading from ftp. 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid URLs plus fragments are still valid URLs. 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_URLFragment) { 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0#fragment").spec(); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 17233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1726b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 17303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid data URLs are valid URLs. 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_DataURL) { 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = "data:text/plain,hello"; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"data.txt\"}]", download_url.c_str()))); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 17643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1767b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("data.txt").c_str()))); 17713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid file URLs are valid URLs. 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to crbug.com/175711 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \ 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_DownloadExtensionTest_Download_File 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \ 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_Download_File 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_DownloadExtensionTest_Download_File) { 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = "file:///"; 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url += "C:/"; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"file.txt\"}]", download_url.c_str()))); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/html\"," 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 18163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 1819b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("file.txt").c_str()))); 18233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that auth-basic-succeed would fail if the resource requires the 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authorization header and chrome fails to propagate it back to the server. 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests both that testserver.py does not succeed when it should fail as 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well as how the downloads extension API exposes the failure to extensions. 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_AuthBasic_Fail) { 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("auth-basic").spec(); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"auth-basic-fail.txt\"}]", 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1856558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 1857558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 1858558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, 1859558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 1860558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 1861558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"text/html\"," 1862558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 1863558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 1864558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates |headers| to the URLRequest. 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Headers) { 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/downloads/" 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec(); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"headers-succeed.txt\"," 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [" 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\"name\": \"Foo\", \"value\": \"bar\"}," 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\"name\": \"Qx\", \"value\":\"yo\"}]}]", 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"application/octet-stream\"," 1897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 1898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 19003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 1903b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 1905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("headers-succeed.txt").c_str()))); 19073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 1909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that headers-succeed would fail if the resource requires the headers and 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome fails to propagate them back to the server. This tests both that 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testserver.py does not succeed when it should fail as well as how the 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloads extension api exposes the failure to extensions. 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Headers_Fail) { 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/downloads/" 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec(); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"headers-fail.txt\"}]", 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1941558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 1942558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 1943558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 1944558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 1945558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 1946558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"bytesReceived\": 0," 1947558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 1948558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 1949558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 1950558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the Authorization header 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly. 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_AuthBasic) { 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("auth-basic").spec(); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is just base64 of 'username:secret'. 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0"; 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"auth-basic-succeed.txt\"," 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [{" 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"Authorization\"," 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"value\": \"Basic %s\"}]}]", 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str(), kAuthorization))); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/html\"," 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", download_url.c_str()))); 19873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"state\": {" 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"previous\": \"in_progress\"," 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"complete\"}}]", result_id))); 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the |method| and |body| 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters to the URLRequest. 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post) { 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1999eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-succeed.txt\"," 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"method\": \"POST\"," 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"body\": \"BODY\"}]", 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"application/octet-stream\"," 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", download_url.c_str()))); 20263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 2029b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"%s\"}}]", 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("post-succeed.txt").c_str()))); 20333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |method| parameter back to the 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post_Get) { 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2049eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2050eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"body\": \"BODY\"," 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-get.txt\"}]", 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2069558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2070558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2071558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2072558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2073558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2074558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2075558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2076558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"id\": %d," 2077558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2078558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 2079558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |body| parameter back to the 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post_NoBody) { 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"method\": \"POST\"," 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-nobody.txt\"}]", 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"id\": %d," 2118558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 2120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cancel()ing an in-progress download causes its state to transition 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to interrupted, and test that that state transition is detectable by an 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// onChanged event listener. TODO(benjhayden): Test other sources of 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interruptions such as server death. 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Cancel) { 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL( 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "download-known-size").spec(); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"application/octet-stream\"," 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"id\": %d," 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->Cancel(true); 21573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\": {\"current\":\"USER_CANCELED\"}," 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"state\": {" 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"previous\": \"in_progress\"," 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"interrupted\"}}]", 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id))); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloading filesystem: URLs. 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: chrome disallows creating HTML5 FileSystem Files in incognito. 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_FileSystemURL) { 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kPayloadData = "on the record\ndata"; 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string download_url = "filesystem:" + GetExtensionURL() + 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "temporary/on_record.txt"; 2176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Setup a file in the filesystem which we can download. 2178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(HTML5FileWriter::CreateFileForTesting( 2179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(browser()->profile())-> 2180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetFileSystemContext(), 2181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fileapi::FileSystemURL::CreateForTest(GURL(download_url)), 2182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) kPayloadData, strlen(kPayloadData))); 2183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now download it. 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/plain\"," 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 22043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[{\"id\": %d," 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 2207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("on_record.txt").c_str()))); 22113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string disk_data; 221858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(item->GetTargetFilePath(), &disk_data)); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(kPayloadData, disk_data.c_str()); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test is flaky: http://crbug.com/302071 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 22244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_NoChange) { 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 22453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 22553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 226090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 2270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 22753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 22823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) { 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 23223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 232790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("overridden.swf")), 2337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"danger\": {" 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\":\"safe\"," 2345558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\":\"file\"}}]", 23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item->ValidateDangerousDownload(); 23493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"danger\": {" 2352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"previous\":\"file\"," 2353558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"current\":\"accepted\"}}]", 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 23553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(downloads_directory().AppendASCII("overridden.swf"), 2362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) item->GetTargetFilePath()); 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ReferencesParentInvalid) { 23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 23973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 240290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("sneaky/../../sneaky.txt")), 2412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 24153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 24162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\": {" 2418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 24223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IllegalFilename) { 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 24623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 246790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 24752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("<")), 2477558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2479558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 24803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2483b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 24873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IllegalFilenameExtension) { 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 25032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 25162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 25273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 253290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}/foo")), 2543558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2545558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 25463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 2547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2549b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 25533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 2554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) 25614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\ 25624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename 25634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 25644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\ 25654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ReservedFilename 25664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 25694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename) { 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 25993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 260490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("con.foo")), 2614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2616558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 26173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 26243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 2625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"id\": %d," 2626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_CurDirInvalid) { 2635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 2661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 2663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor( 26643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 2665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 266990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 2672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL(".")), 2679558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 2681558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 26823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2685b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 26893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ParentDirInvalid) { 2700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 2720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 2728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor( 27293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 2730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 273490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 2738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 2740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 2741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 2742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("..")), 2744558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 2746558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 27473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2750b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 27543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_AbsPathInvalid) { 27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 27943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 279990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 28002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. Absolute paths should be rejected. 28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) downloads_directory().Append(FILE_PATH_LITERAL("sneaky.txt")), 2809558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2811558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 28142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\": {" 2816b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 28203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_EmptyBasenameInvalid) { 28312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 28392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 28432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 28452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 28462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 28472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 28603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 286590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. Empty basenames should be rejected. 2868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 2869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 2871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 2872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 2873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("foo/")), 2875558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 2877558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 2878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2882b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 28863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 2887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_Override) { 2897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 29153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 2916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 2922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 2924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitFor( 29253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 2926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 293090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 2931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 29342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 29352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 2940558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 29422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 29452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 2947b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 2949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 29513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 2973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 2974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 2975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 2976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 2977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 2978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 29803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 29822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 29832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 29842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 298590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 29862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also test that DetermineFilename allows (chrome) extensions to set 29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // filenames without (filename) extensions. (Don't ask about v8 extensions or 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // python extensions or kernel extensions or firefox extensions...) 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("foo")), 2998558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_OVERWRITE, 29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 30012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 30032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3005b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("foo").c_str()))); 30093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 30102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 30122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 30132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO test precedence rules: install_time 30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 30212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer) { 3022eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3023eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 30242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 30262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderProcessHost* host = AddFilenameDeterminer(); 30272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 30332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 30342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 30352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 30422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 30492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 30502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 30513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 30522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 305690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove a determiner while waiting for it. 30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveFilenameDeterminer(host); 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 30702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IncognitoSplit) { 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 3073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 30752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 30762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 30822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an on-record download. 30842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 30872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 30882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 30892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 30912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 30922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 30932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 30942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 30973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 30982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 30992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 31002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 31073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 31082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 31102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 31122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 311390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename events. 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 31192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 31202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 31212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 31262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 31283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("42.txt").c_str()))); 31353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 31382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an incognito download for comparison. 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 31502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 31612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 31622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On-Record renderers should not see events for off-record items. 31652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 31663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 31672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 31692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 31712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 317290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 31782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("5.txt")), 3182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 31852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 31873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 31882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("5.txt").c_str()))); 31943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IncognitoSpanning) { 32052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_spanning"); 3206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 32082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 32092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 32112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 32122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There is a single extension renderer that sees both on-record and 32142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // off-record events. The extension functions see the on-record profile with 32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // include_incognito=true. 32162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an on-record download. 32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 32192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 32222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 32232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 32242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 32252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 32262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 32272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 32282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 32292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 32313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 32322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 32342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 32352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 32362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 32372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 32382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 32402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 32413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 32422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 32432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 32442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 32452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 32462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 324790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 32482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename events. 32502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 32512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 32522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 32532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 32542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 32552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 32582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 32592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 32623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 32632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("42.txt").c_str()))); 32693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 32702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 32712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 32722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 32732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 32752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an incognito download for comparison. 32772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 32782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 32792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 32802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 32822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 32832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 32842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 32852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 32862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 32872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 32882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 32902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 32912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 32922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 32932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 32993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 33012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": true," 33022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 33032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 33042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 330590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 33062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 33082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 33092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 33102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 33112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 33122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 33132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 33142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3315558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 33162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 33172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 33182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 33203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 33212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\": {" 3323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 3325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFilename("42 (1).txt").c_str()))); 33273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 33282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 33292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 33302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 33312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 33322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id))); 33332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 33342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33355e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#if defined(OS_WIN) 33365e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)// This test is very flaky on Win XP and Aura. http://crbug.com/248438 33375e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \ 33385e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume 33395e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#else 33405e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \ 33415e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_InterruptedResume 33425e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#endif 33435e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 3344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test download interruption while extensions determining filename. Should not 3345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// re-dispatch onDeterminingFilename. 33462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 33472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 33485e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) { 3349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 3350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switches::kEnableDownloadResumption); 33512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 3352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 33542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 3355a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::RenderProcessHost* host = AddFilenameDeterminer(); 33562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start a download. 3358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = NULL; 3359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 3360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager* manager = GetCurrentManager(); 3361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 3362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new JustInProgressDownloadObserver(manager, 1)); 3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0, manager->InProgressCount()); 33648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(0, manager->NonMaliciousInProgressCount()); 3365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tabs created just for a download are automatically closed, invalidating 3366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the download's WebContents. Downloads without WebContents cannot be 3367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // resumed. http://crbug.com/225901 3368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 3370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl), 3371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CURRENT_TAB, 3372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 3373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer->WaitForFinished(); 3374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 3375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager::DownloadVector items; 3376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager->GetAllDownloads(&items); 3377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 3378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != items.end(); ++iter) { 3379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 3380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // There should be only one IN_PROGRESS item. 3381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, item); 3382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item = *iter; 3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 33872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename event. 33903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnCreated::kEventName, 33912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 3392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 3393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 3394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"application/octet-stream\"," 3395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false}]", 3396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 33972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitFor( 33983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) api::OnDeterminingFilename::kEventName, 33992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 34002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 3401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"filename\":\"download-unknown-size\"}]", 3402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 34032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 340490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 34052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 3409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl), 3410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NEW_BACKGROUND_TAB, 3411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 34122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Errors caught before filename determination are delayed until after 3414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // filename determination. 34152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 34162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 34172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 34182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 34192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 3420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId(), 34212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 3422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY, 3423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)) << error; 34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 34253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 3426b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3427b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"filename\": {" 3428b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3429b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"current\": \"%s\"}}]", 3430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) item->GetId(), 3431b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetFilename("42.txt").c_str()))); 34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadUpdatedObserver interrupted(item, base::Bind( 3434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ItemIsInterrupted)); 3435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(interrupted.WaitForEvent()); 34363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 3437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3438558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\":{\"current\":\"NETWORK_FAILED\"}," 3439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\":{" 3440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\":\"in_progress\"," 3441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\":\"interrupted\"}}]", 3442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 3443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3445a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Downloads that are restarted on resumption trigger another download target 3446a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // determination. 3447a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RemoveFilenameDeterminer(host); 3448a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) item->Resume(); 3449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Errors caught before filename determination is complete are delayed until 3451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // after filename determination so that, on resumption, filename determination 3452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // does not need to be re-done. So, there will not be a second 3453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onDeterminingFilename event. 3454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 3456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 3457558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\":{\"previous\":\"NETWORK_FAILED\"}," 3458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\":{" 3459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\":\"interrupted\"," 3460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\":\"in_progress\"}}]", 3461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 3462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FinishPendingSlowDownloads(); 3465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 34673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, 34682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 34692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 34702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 34712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 3472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId()))); 34732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 3476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadExtensionTest_SetShelfEnabled) { 3477a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoadExtension("downloads_split"); 3478a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[false]")); 3479a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(DownloadServiceFactory::GetForBrowserContext( 3480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser()->profile())->IsShelfEnabled()); 3481a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[true]")); 3482a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(DownloadServiceFactory::GetForBrowserContext( 3483a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser()->profile())->IsShelfEnabled()); 3484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test that existing shelves are hidden. 3485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test multiple extensions. 3486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test disabling extensions. 3487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test that browsers associated with other profiles are not 3488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // affected. 3489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test incognito. 3490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3491a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benjhayden) Figure out why DisableExtension() does not fire 34932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnListenerRemoved. 3494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Test that the shelf is shown for download() both with and 3496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// without a WebContents. 3497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3498424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OnDangerPromptCreated(DownloadDangerPrompt* prompt) { 3499424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) prompt->InvokeActionForTesting(DownloadDangerPrompt::ACCEPT); 3500424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 3501424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3502424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 3503424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadExtensionTest_AcceptDanger) { 3504424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Download a file that will be marked dangerous; click the browser action 3505424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // button; the browser action poup will call acceptDanger(); when the 3506424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // DownloadDangerPrompt is created, pretend that the user clicks the Accept 3507424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // button; wait until the download completes. 3508424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LoadExtension("downloads_split"); 3509424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 3510424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new DownloadsDownloadFunction(), 3511424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "[{\"url\": \"data:,\", \"filename\": \"dangerous.swf\"}]")); 3512424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(result.get()); 3513424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int result_id = -1; 3514424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 3515424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 3516424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(item); 3517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(WaitFor(api::OnChanged::kEventName, base::StringPrintf( 3518424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "[{\"id\": %d, " 3519424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) " \"danger\": {" 3520424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) " \"previous\": \"safe\"," 3521424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) " \"current\": \"file\"}}]", 3522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) result_id))); 3523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(item->IsDangerous()); 3524424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ScopedCancellingItem canceller(item); 3525424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 3526424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new content::DownloadTestObserverTerminal( 3527424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetCurrentManager(), 1, 3528424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE)); 3529424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadsAcceptDangerFunction::OnPromptCreatedCallback callback = 3530424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(&OnDangerPromptCreated); 3531424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadsAcceptDangerFunction::OnPromptCreatedForTesting( 3532424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &callback); 3533424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 3534424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) observer->WaitForFinished(); 3535424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 3536424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadsApiTest : public ExtensionApiTest { 3538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 3539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadsApiTest() {} 3540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DownloadsApiTest() {} 3541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 3542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadsApiTest); 3543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) { 3547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("downloads")) << message_; 3548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3549558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3550558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST(DownloadInterruptReasonEnumsSynced, 3551558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadInterruptReasonEnumsSynced) { 3552558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define INTERRUPT_REASON(name, value) \ 3553558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(InterruptReasonContentToExtension( \ 3554558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_##name), \ 3555558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::INTERRUPT_REASON_##name); \ 3556558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(InterruptReasonExtensionToContent( \ 3557558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch api::INTERRUPT_REASON_##name), \ 3558558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_##name); 3559558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 3560558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 3561558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 3562ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3563ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(ExtensionDetermineDownloadFilenameInternal, 3564ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDetermineDownloadFilenameInternal) { 3565ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3566ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string winner_id; 3567ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath filename; 3568ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extensions::api::downloads::FilenameConflictAction conflict_action = 3569ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch api::FILENAME_CONFLICT_ACTION_UNIQUIFY; 3570ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extensions::ExtensionWarningSet warnings; 3571ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3572ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Empty incumbent determiner 3573ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.clear(); 3574ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 3575ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath(FILE_PATH_LITERAL("a")), 3576ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch api::FILENAME_CONFLICT_ACTION_OVERWRITE, 3577ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "suggester", 3578ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now(), 3579ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "", 3580ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time(), 3581ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &winner_id, 3582ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &filename, 3583ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &conflict_action, 3584ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &warnings); 3585ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("suggester", winner_id); 3586ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value()); 3587ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(api::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action); 3588ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(warnings.empty()); 3589ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3590ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Incumbent wins 3591ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.clear(); 3592ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 3593ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath(FILE_PATH_LITERAL("b")), 3594ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch api::FILENAME_CONFLICT_ACTION_PROMPT, 3595ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "suggester", 3596ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - base::TimeDelta::FromDays(1), 3597ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "incumbent", 3598ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now(), 3599ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &winner_id, 3600ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &filename, 3601ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &conflict_action, 3602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &warnings); 3603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("incumbent", winner_id); 3604ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value()); 3605ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(api::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action); 3606ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(warnings.empty()); 3607ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(extensions::ExtensionWarning::kDownloadFilenameConflict, 3608ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.begin()->warning_type()); 3609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("suggester", warnings.begin()->extension_id()); 3610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3611ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Suggester wins 3612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.clear(); 3613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 3614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath(FILE_PATH_LITERAL("b")), 3615ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch api::FILENAME_CONFLICT_ACTION_PROMPT, 3616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "suggester", 3617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now(), 3618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "incumbent", 3619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - base::TimeDelta::FromDays(1), 3620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &winner_id, 3621ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &filename, 3622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &conflict_action, 3623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &warnings); 3624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("suggester", winner_id); 3625ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(FILE_PATH_LITERAL("b"), filename.value()); 3626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(api::FILENAME_CONFLICT_ACTION_PROMPT, conflict_action); 3627ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(warnings.empty()); 3628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(extensions::ExtensionWarning::kDownloadFilenameConflict, 3629ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.begin()->warning_type()); 3630ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("incumbent", warnings.begin()->extension_id()); 3631ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 3632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // http://crbug.com/3061144 3634