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) 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/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" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_file_icon_extractor.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_test_file_activity_observer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/downloads/downloads_api.h" 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_slow_download_job.h" 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/event_router.h" 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/data_url.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_runner.h" 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.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 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace extensions { 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace downloads = api::downloads; 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Comparator that orders download items by their ID. Can be used with 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::sort. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DownloadIdComparator { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator() (DownloadItem* first, DownloadItem* second) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first->GetId() < second->GetId(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadsEventsListener : public content::NotificationObserver { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsEventsListener() 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : waiting_(false) { 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Add(this, 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DownloadsEventsListener() { 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Remove(this, 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&events_); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearEvents() { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STLDeleteElements(&events_); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events_.clear(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Event { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Event(Profile* profile, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& event_name, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& json_args, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time caught) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_name_(event_name), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_args_(json_args), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_(base::JSONReader::Read(json_args)), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caught_(caught) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& caught() { return caught_; } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Satisfies(const Event& other) const { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return other.SatisfiedBy(*this); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SatisfiedBy(const Event& other) const { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((profile_ != other.profile_) || 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event_name_ != other.event_name_)) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (((event_name_ == downloads::OnDeterminingFilename::kEventName) || 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (event_name_ == downloads::OnCreated::kEventName) || 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (event_name_ == downloads::OnChanged::kEventName)) && 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu args_.get() && other.args_.get()) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* left_list = NULL; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* left_dict = NULL; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* right_list = NULL; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* right_dict = NULL; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args_->GetAsList(&left_list) || 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !other.args_->GetAsList(&right_list) || 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !left_list->GetDictionary(0, &left_dict) || 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !right_list->GetDictionary(0, &right_dict)) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*left_dict); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* right_value = NULL; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!right_dict->HasKey(iter.key()) || 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (right_dict->Get(iter.key(), &right_value) && 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.value().Equals(right_value))) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if ((event_name_ == downloads::OnErased::kEventName) && 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu args_.get() && other.args_.get()) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int my_id = -1, other_id = -1; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (args_->GetAsInteger(&my_id) && 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.args_->GetAsInteger(&other_id) && 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my_id == other_id); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return json_args_ == other.json_args_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string Debug() { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("Event(%p, %s, %s, %f)", 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_name_.c_str(), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_args_.c_str(), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caught_.ToJsTime()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_name_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_args_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> args_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time caught_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Event); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsNotificationSource; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT: { 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"), 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventRouter::Get(current_browser()->profile()) 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ->AddEventListener(downloads::OnCreated::kEventName, 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch tab->GetRenderProcessHost(), 2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetExtensionId()); 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventRouter::Get(current_browser()->profile()) 2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ->AddEventListener(downloads::OnChanged::kEventName, 2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch tab->GetRenderProcessHost(), 2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetExtensionId()); 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventRouter::Get(current_browser()->profile()) 2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ->AddEventListener(downloads::OnErased::kEventName, 2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch tab->GetRenderProcessHost(), 2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetExtensionId()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderProcessHost* AddFilenameDeterminer() { 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExtensionDownloadsEventRouter::SetDetermineFilenameTimeoutSecondsForTesting( 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_->GetResourceURL("empty.html"), 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventRouter::Get(current_browser()->profile()) 3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ->AddEventListener(downloads::OnDeterminingFilename::kEventName, 3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tab->GetRenderProcessHost(), 3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetExtensionId()); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tab->GetRenderProcessHost(); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveFilenameDeterminer(content::RenderProcessHost* host) { 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventRouter::Get(current_browser()->profile())->RemoveEventListener( 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) downloads::OnDeterminingFilename::kEventName, host, GetExtensionId()); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() { return current_browser_; } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InProcessBrowserTest 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionApiTest::SetUpOnMainThread(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::SetUpOnMainThread(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateAndSetDownloadsDirectory(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOnRecordManager()->RemoveAllDownloads(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events_listener_.reset(new DownloadsEventsListener()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable file chooser for current profile. 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadTestFileActivityObserver observer(current_browser()->profile()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.EnableFileChooser(false); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoOnTheRecord() { current_browser_ = browser(); } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoOffTheRecord() { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!incognito_browser_) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_browser_ = CreateIncognitoBrowser(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOffRecordManager()->RemoveAllDownloads(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable file chooser for incognito profile. 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadTestFileActivityObserver observer(incognito_browser_->profile()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.EnableFileChooser(false); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser_ = incognito_browser_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitFor(const std::string& event_name, const std::string& json_args) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events_listener_->WaitFor( 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile(), event_name, json_args); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool WaitForInterruption( 351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadItem* item, 352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DownloadInterruptReason expected_error, 353558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string& on_created_event) { 3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!WaitFor(downloads::OnCreated::kEventName, on_created_event)) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, onCreated is always fired before interruption. 3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return WaitFor( 3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::OnChanged::kEventName, 3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"error\": {\"current\": \"%s\"}," 3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"interrupted\"}}]", 3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId(), 3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::DownloadInterruptReasonToString(expected_error).c_str())); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearEvents() { 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) events_listener_->ClearEvents(); 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetExtensionURL() { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_->url().spec(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetExtensionId() { 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extension_->id(); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetFilename(const char* path) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result = 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::string::size_type next = result.find("\\"); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next != std::string::npos; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = result.find("\\", next)) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.replace(next, 1, "\\\\"); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next += 2; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetOnRecordManager() { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager(browser()->profile()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetOffRecordManager() { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager( 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetOffTheRecordProfile()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* GetCurrentManager() { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (current_browser_ == incognito_browser_) ? 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOffRecordManager() : GetOnRecordManager(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a set of history downloads based on the provided |history_info| 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // array. |count| is the number of elements in |history_info|. On success, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |items| will contain |count| DownloadItems in the order that they were 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified in |history_info|. Returns true on success and false otherwise. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector* items) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadIdComparator download_id_comparator; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time current = base::Time::Now(); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->clear(); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetOnRecordManager()->GetAllDownloads(items); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(0, static_cast<int>(items->size())); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL> url_chain; 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_chain.push_back(GURL()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetOnRecordManager()->CreateDownloadItem( 4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadItem::kInvalidId + 1 + i, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory().Append(history_info[i].filename), 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloads_directory().Append(history_info[i].filename), 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_chain, GURL(), // URL Chain, referrer 426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(), std::string(), // mime_type, original_mime_type 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current, current, // start_time, end_time 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string(), std::string(), // etag, last_modified 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 1, // received_bytes, total_bytes 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_info[i].state, // state 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); // opened 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->push_back(item); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Order by ID so that they are in the order that we created them. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(items->begin(), items->end(), download_id_comparator); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the danger type if necessary. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_info[i].danger_type != 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_info[i].danger_type); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items->at(i)->OnContentCheckCompleted(history_info[i].danger_type); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateSlowTestDownloads( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, DownloadManager::DownloadVector* items) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInProgressDownloadObserver(1)); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), slow_download_url, CURRENT_TAB, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager()->GetAllDownloads(items); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(count, items->size()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* CreateSlowTestDownload() { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInProgressDownloadObserver(1)); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* manager = GetCurrentManager(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(0, manager->NonMaliciousInProgressCount()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, manager->InProgressCount()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager->InProgressCount() != 0) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), slow_download_url, CURRENT_TAB, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetAllDownloads(&items); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* new_item = NULL; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != items.end(); ++iter) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be only one IN_PROGRESS item. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, new_item); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_item = *iter; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_item; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FinishPendingSlowDownloads() { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateDownloadObserver(1)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), finish_url, NEW_FOREGROUND_TAB, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateDownloadObserver(size_t download_count) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverTerminal( 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager(), download_count, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateInProgressDownloadObserver( 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t download_count) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverInProgress( 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager(), download_count); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RunFunction(UIThreadExtensionFunction* function, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& args) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> delete_function(function); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpExtensionFunction(function); 528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool result = extension_function_test_utils::RunFunction( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function, args, browser(), GetFlags()); 530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!result) { 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(ERROR) << function->GetError(); 532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::RunFunctionFlags GetFlags() { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_browser()->profile()->IsOffTheRecord() ? 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::INCLUDE_INCOGNITO : 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_test_utils::NONE; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension_function_test_utils::RunFunction*() only uses browser for its 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile(), so pass it the on-record browser so that it always uses the 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on-record profile to match real-life behavior. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* RunFunctionAndReturnResult( 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args) { 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_function_test_utils::RunFunctionAndReturnSingleResult( 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function.get(), args, browser(), GetFlags()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string RunFunctionAndReturnError( 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_function_test_utils::RunFunctionAndReturnError( 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function.get(), args, browser(), GetFlags()); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool RunFunctionAndReturnString( 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> function, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& args, 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* result_string) { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUpExtensionFunction(function.get()); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args)); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.get()); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.get() && result->GetAsString(result_string); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string DownloadItemIdAsArgList(const DownloadItem* download_item) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("[%d]", download_item->GetId()); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& downloads_directory() { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return downloads_directory_.path(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadsEventsListener* events_listener() { return events_listener_.get(); } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUpExtensionFunction(UIThreadExtensionFunction* function) { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate the tab each time for insulation. 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = chrome::AddSelectedTabWithURL( 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_->GetResourceURL("empty.html"), 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension_); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function->SetRenderViewHost(tab->GetRenderViewHost()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateAndSetDownloadsDirectory() { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir()); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetFilePath( 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDownloadDefaultDirectory, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir downloads_directory_; 603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension_; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* incognito_browser_; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser_; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadsEventsListener> events_listener_; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockIconExtractorImpl : public DownloadFileIconExtractor { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockIconExtractorImpl(const base::FilePath& path, 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconLoader::IconSize icon_size, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : expected_path_(path), 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_icon_size_(icon_size), 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_(response) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockIconExtractorImpl() {} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ExtractIconURLForPath(const base::FilePath& path, 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float scale, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize icon_size, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconURLCallback callback) OVERRIDE { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(expected_path_.value().c_str(), path.value().c_str()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_icon_size_, icon_size); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_path_ == path && 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_icon_size_ == icon_size) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockIconExtractorImpl::RunCallback, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunCallback() { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(response_); 644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Drop the reference on extension function to avoid memory leaks. 645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_ = IconURLCallback(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_path_; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize expected_icon_size_; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string response_; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconURLCallback callback_; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ItemNotInProgress(DownloadItem* item) { 65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return item->GetState() != DownloadItem::IN_PROGRESS; 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels the underlying DownloadItem when the ScopedCancellingItem goes out of 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scope. Like a scoped_ptr, but for DownloadItems. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedCancellingItem { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedCancellingItem(DownloadItem* item) : item_(item) {} 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedCancellingItem() { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item_->Cancel(true); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadUpdatedObserver observer( 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_, base::Bind(&ItemNotInProgress)); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForEvent(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* get() { return item_; } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item_; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedCancellingItem); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels all the underlying DownloadItems when the ScopedItemVectorCanceller 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes out of scope. Generalization of ScopedCancellingItem to many 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadItems. 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedItemVectorCanceller { 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedItemVectorCanceller(DownloadManager::DownloadVector* items) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : items_(items) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedItemVectorCanceller() { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::const_iterator item = items_->begin(); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item != items_->end(); ++item) { 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if ((*item)->GetState() == DownloadItem::IN_PROGRESS) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*item)->Cancel(true); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadUpdatedObserver observer( 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*item), base::Bind(&ItemNotInProgress)); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForEvent(); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector* items_; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes an HTML5 file so that it can be downloaded. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTML5FileWriter { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 70203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static bool CreateFileForTesting(storage::FileSystemContext* context, 70303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& path, 70403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const char* data, 705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int length) { 706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create a temp file. 707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath temp_file; 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!base::CreateTemporaryFile(&temp_file) || 709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile(temp_file, data, length) != length) { 710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoke the fileapi to copy it into the sandboxed filesystem. 713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool result = false; 714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent done_event(true, false); 715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::PostTask( 716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CreateFileForTestingOnIOThread, 718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(context), 719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) path, temp_file, 720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(&result), 721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(&done_event))); 722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Wait for that to finish. 723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) done_event.Wait(); 724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DeleteFile(temp_file, false); 725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void CopyInCompletion(bool* result, 730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* done_event, 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error) { 732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::IO); 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *result = error == base::File::FILE_OK; 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) done_event->Signal(); 735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void CreateFileForTestingOnIOThread( 73803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* context, 73903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& path, 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& temp_file, 741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool* result, 742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* done_event) { 743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::IO); 744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context->operation_runner()->CopyInForeignFile( 745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) temp_file, path, 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CopyInCompletion, 747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(result), 748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(done_event))); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Merge this with the other TestObservers. 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class JustInProgressDownloadObserver 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public content::DownloadTestObserverInProgress { 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JustInProgressDownloadObserver( 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager* download_manager, size_t wait_count) 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : content::DownloadTestObserverInProgress(download_manager, wait_count) { 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~JustInProgressDownloadObserver() {} 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE { 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return item->GetState() == DownloadItem::IN_PROGRESS; 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver); 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ItemIsInterrupted(DownloadItem* item) { 77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return item->GetState() == DownloadItem::INTERRUPTED; 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 775558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochcontent::DownloadInterruptReason InterruptReasonExtensionToContent( 7765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::InterruptReason error) { 777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (error) { 7785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case downloads::INTERRUPT_REASON_NONE: 779558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_NONE; 7805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value) \ 7815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case downloads::INTERRUPT_REASON_##name: \ 7825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return content::DOWNLOAD_INTERRUPT_REASON_##name; 783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return content::DOWNLOAD_INTERRUPT_REASON_NONE; 788558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liudownloads::InterruptReason InterruptReasonContentToExtension( 791558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DownloadInterruptReason error) { 792558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (error) { 793558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case content::DOWNLOAD_INTERRUPT_REASON_NONE: 7945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return downloads::INTERRUPT_REASON_NONE; 7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value) \ 7965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case content::DOWNLOAD_INTERRUPT_REASON_##name: \ 7975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return downloads::INTERRUPT_REASON_##name; 798558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 799558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 800558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 801558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 8025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return downloads::INTERRUPT_REASON_NONE; 803558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 804558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_CHROMEOS) 8085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396510 8095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Open DISABLED_DownloadExtensionTest_Open 8105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 8115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Open DownloadExtensionTest_Open 8125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MAYBE_DownloadExtensionTest_Open) { 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 81623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DownloadsOpenFunction* open_function = new DownloadsOpenFunction(); 81723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function->set_user_gesture(true); 818558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunFunctionAndReturnError( 82023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function, 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[-42]").c_str()); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_item); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpenWhenComplete()); 8275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 8285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 8295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 8305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 8315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"application/octet-stream\"," 8325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 8335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 8345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_item->GetURL().spec().c_str()))); 83523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function = new DownloadsOpenFunction(); 83623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function->set_user_gesture(true); 837558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotComplete, 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunFunctionAndReturnError( 83923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function, 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemIdAsArgList(download_item)).c_str()); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishPendingSlowDownloads(); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 84423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 84523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function = new DownloadsOpenFunction(); 84623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_STREQ(errors::kUserGesture, 84723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RunFunctionAndReturnError( 84823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function, 84923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DownloadItemIdAsArgList(download_item)).c_str()); 85023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_FALSE(download_item->GetOpened()); 85123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 85223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function = new DownloadsOpenFunction(); 85323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_function->set_user_gesture(true); 85423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(RunFunction(open_function, 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(download_item->GetOpened()); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_PauseResumeCancelErase) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string error; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call pause(). It should succeed and the download should be paused on 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return. 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling removeFile on a non-active download yields kNotComplete 872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and should not crash. http://crbug.com/319984 873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsRemoveFileFunction(), 874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItemIdAsArgList(download_item)); 875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_STREQ(errors::kNotComplete, error.c_str()); 876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling pause() twice shouldn't be an error. 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try resuming this download. It should succeed. 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resume again. Resuming a download that wasn't paused is not an error. 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pause again. 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And now cancel. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel again. Shouldn't have any effect. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemIdAsArgList(download_item))); 90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling paused on a non-active download yields kNotInProgress. 908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = RunFunctionAndReturnError( 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item)); 910558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling resume on a non-active download yields kNotResumable 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item)); 915558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling pause on a non-existent download yields kInvalidId. 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsPauseFunction(), "[-42]"); 920558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, error.c_str()); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Calling resume on a non-existent download yields kInvalidId 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsResumeFunction(), "[-42]"); 925558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, error.c_str()); 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Calling removeFile on a non-existent download yields kInvalidId. 928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = RunFunctionAndReturnError( 929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new DownloadsRemoveFileFunction(), "[-42]"); 930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_STREQ(errors::kInvalidId, error.c_str()); 931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = download_item->GetId(); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsEraseFunction(), 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("[{\"id\": %d}]", id))); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManager::DownloadVector items; 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetCurrentManager()->GetAllDownloads(&items); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0UL, items.size()); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item = NULL; 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* result_list = NULL; 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int element = -1; 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result_list->GetInteger(0, &element)); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(id, element); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<UIThreadExtensionFunction> MockedGetFileIconFunction( 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& expected_path, 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconLoader::IconSize icon_size, 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DownloadsGetFileIconFunction> function( 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsGetFileIconFunction()); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->SetIconExtractorForTesting(new MockIconExtractorImpl( 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_path, icon_size, response)); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return function; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download items. 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_FileIcon_Active) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string args32(base::StringPrintf("[%d, {\"size\": 32}]", 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetId())); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the icon for the in-progress download. This call should succeed even 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the file type isn't registered. 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test whether the correct path is being pased into the icon extractor. 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", download_item->GetId()), &result_string)); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try a 16x16 icon. 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::SMALL, "foo"), 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {\"size\": 16}]", download_item->GetId()), 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly asking for 32x32 should give us a 32x32 icon. 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finish the download and try again. 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishPendingSlowDownloads(); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DownloadItem::COMPLETE, download_item->GetState()); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the path passed to the icon extractor post-completion. 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, &result_string)); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now create another download. 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item = CreateSlowTestDownload(); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_item); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args32 = base::StringPrintf("[%d, {\"size\": 32}]", download_item->GetId()); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the download. As long as the download has a target path, we should 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be able to query the file icon. 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->Cancel(true); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let cleanup complete on the FILE thread. 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(BrowserThread::FILE); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the path passed to the icon extractor post-cancellation. 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32, 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an error during icon load by invoking the mock with an empty 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result string. 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = RunFunctionAndReturnError( 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockedGetFileIconFunction(download_item->GetTargetFilePath(), 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IconLoader::NORMAL, 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()), 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args32); 1026558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kIconNotFound, error.c_str()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1028558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Once the download item is deleted, we should return kInvalidId. 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = download_item->GetId(); 1030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) download_item->Remove(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_item = NULL; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<DownloadItem*>(NULL), 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentManager()->GetDownload(id)); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args32); 1035558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can acquire file icons for history downloads regardless of 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether they exist or not. If the file doesn't exist we should receive a 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generic icon from the OS/toolkit that may or may not be specific to the file 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type. 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_FileIcon_History) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("real.txt"), 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("fake.txt"), 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector all_downloads; 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &all_downloads)); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1057b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath real_path = all_downloads[0]->GetTargetFilePath(); 1058b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath fake_path = all_downloads[1]->GetTargetFilePath(); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, base::WriteFile(real_path, "", 0)); 10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(real_path)); 10627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(fake_path)); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = all_downloads.begin(); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != all_downloads.end(); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter) { 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a MockIconExtractorImpl to test if the correct path is being passed 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the DownloadFileIconExtractor. 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 1071b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->GetTargetFilePath(), IconLoader::NORMAL, "hello"), 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {\"size\": 32}]", (*iter)->GetId()), 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result_string)); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("hello", result_string.c_str()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test passing the empty query to search(). 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchEmptyQuery) { 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem item(CreateSlowTestDownload()); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item.get()); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |filenameRegex| parameter for search(). 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchFilenameRegex) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("foobar"), 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector all_downloads; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &all_downloads)); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]")); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id = -1; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetInteger("id", &item_id)); 11177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(all_downloads[0]->GetId(), static_cast<uint32>(item_id)); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |id| parameter for search(). 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchId) { 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 11277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new DownloadsSearchFunction(), base::StringPrintf( 11287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "[{\"id\": %u}]", items[0]->GetId()))); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_id = -1; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetInteger("id", &item_id)); 11377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(items[0]->GetId(), static_cast<uint32>(item_id)); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying both the |id| and |filename| parameters for search(). 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchIdAndFilename) { 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"id\": 0, \"filename\": \"foobar\"}]")); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0UL, result_list->GetSize()); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a single |orderBy| parameter for search(). 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchOrderBy) { 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": [\"filename\"]}]")); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item0_value = NULL; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item1_value = NULL; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item0_value)); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &item1_value)); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item0_name, item1_name; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item0_value->GetString("filename", &item0_name)); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item1_value->GetString("filename", &item1_name)); 1184b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_GT(items[0]->GetTargetFilePath().value(), 1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) items[1]->GetTargetFilePath().value()); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(item0_name, item1_name); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying an empty |orderBy| parameter for search(). 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchOrderByEmpty) { 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": []}]")); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item0_value = NULL; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item1_value = NULL; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item0_value)); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &item1_value)); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item0_name, item1_name; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item0_value->GetString("filename", &item0_name)); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item1_value->GetString("filename", &item1_name)); 1217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_GT(items[0]->GetTargetFilePath().value(), 1218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) items[1]->GetTargetFilePath().value()); 12190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // The order of results when orderBy is empty is unspecified. When there are 12200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // no sorters, DownloadQuery does not call sort(), so the order of the results 12210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // depends on the order of the items in base::hash_map<uint32,...> 12220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // DownloadManagerImpl::downloads_, which is unspecified and differs between 12230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // libc++ and libstdc++. http://crbug.com/365334 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |danger| option for search(). 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchDanger) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]")); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |state| option for search(). 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchState) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items[0]->Cancel(true); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]")); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |limit| option for search(). 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchLimit) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSlowTestDownloads(2, &items); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedItemVectorCanceller delete_items(&items); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"limit\": 1}]")); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test invalid search parameters. 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchInvalid) { 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = RunFunctionAndReturnError( 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"filenameRegex\": \"(\"}]"); 1286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilter, 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 1289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsSearchFunction(), "[{\"orderBy\": [\"goat\"]}]"); 1290558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidOrderBy, 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{\"limit\": -1}]"); 1294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidQueryLimit, 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test searching using multiple conditions through multiple downloads. 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchPlural) { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryDownloadInfo kHistoryInfo[] = { 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("aaa"), 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::CANCELLED, 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("zzz"), 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FILE_PATH_LITERAL("baz"), 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE, 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager::DownloadVector items; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &items)); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{" 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"state\": \"complete\", " 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"danger\": \"content\", " 1320558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "\"orderBy\": [\"filename\"], " 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"limit\": 1}]")); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsList(&result_list)); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item_value = NULL; 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType item_name; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item_value->GetString("filename", &item_name)); 1330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that incognito downloads are only visible in incognito contexts, and 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that on-record downloads are visible in both incognito and on-record 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contexts, for DownloadsSearchFunction, DownloadsPauseFunction, 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadsResumeFunction, and DownloadsCancelFunction. 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_SearchPauseResumeCancelGetFileIconIncognito) { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result_value; 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* result_list = NULL; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* result_dict = NULL; 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType filename; 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_incognito = false; 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string on_item_arg; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string off_item_arg; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result_string; 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up one on-record item and one off-record item. 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the off-record item first because otherwise there are mysteriously 3 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items total instead of 2. 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(benjhayden): Figure out where the third item comes from. 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* off_item = CreateSlowTestDownload(); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(off_item); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg = DownloadItemIdAsArgList(off_item); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* on_item = CreateSlowTestDownload(); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(on_item); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_item_arg = DownloadItemIdAsArgList(on_item); 1362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(on_item->GetTargetFilePath() != off_item->GetTargetFilePath()); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions running in the incognito window should have access to both 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items because the Test extension is in spanning mode. 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_value.reset(RunFunctionAndReturnResult( 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value.get()); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value->GetAsList(&result_list)); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2UL, result_list->GetSize()); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 1375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename)); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(is_incognito); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(1, &result_dict)); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 1380b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename)); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(is_incognito); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions running in the on-record window should have access only to the 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on-record item. 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_value.reset(RunFunctionAndReturnResult( 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsSearchFunction(), "[{}]")); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value.get()); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_value->GetAsList(&result_list)); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1UL, result_list->GetSize()); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetString("filename", &filename)); 1393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename)); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(is_incognito); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pausing/Resuming the off-record item while on the record should return an 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error. Cancelling "non-existent" downloads is not an error. 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg); 1400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg); 1404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError( 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsGetFileIconFunction(), 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", off_item->GetId())); 1409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidId, 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.c_str()); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the FileIcon test for both the on- and off-items while off the record. 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE(benjhayden): This does not include the FileIcon test from history, 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just active downloads. This shouldn't be a problem. 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string)); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction( 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"), 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%d, {}]", off_item->GetId()), &result_string)); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the pause/resume/cancel test for both the on- and off-items while off 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the record. 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg)); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(on_item->IsPaused()); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg)); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(on_item->IsPaused()); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg)); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(on_item->IsPaused()); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg)); 143790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState()); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg)); 143990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState()); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsPauseFunction(), on_item_arg); 1441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), on_item_arg); 1443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg)); 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(off_item->IsPaused()); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg)); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(off_item->IsPaused()); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg)); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(off_item->IsPaused()); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg)); 145590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState()); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg)); 145790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState()); 1458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg); 1459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotInProgress, error.c_str()); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = RunFunctionAndReturnError(new DownloadsResumeFunction(), 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_item_arg); 1462558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kNotResumable, error.c_str()); 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download and that the correct sequence of events is 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fired for it. 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Basic) { 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 14885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 14895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 14915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 14925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 14975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 14985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 14995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 15005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 15015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 15035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 15045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 15055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 15065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 15075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 15085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 15095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download from an incognito context, and that the 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download knows that it's incognito. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Incognito) { 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOffTheRecord(); 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 15355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 15365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 15375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": true," 15385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 15395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 15405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 15415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 15425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 15435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 15445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\":%d," 15455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 15465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 15475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 15485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 15495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 15505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 15515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 15525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\":%d," 15535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 15545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"," 15555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"}}]", 15565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This test is very flaky on Win. http://crbug.com/248438 1561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \ 1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_DownloadExtensionTest_Download_UnsafeHeaders 1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \ 1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DownloadExtensionTest_Download_UnsafeHeaders 1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 1567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we disallow certain headers case-insensitively. 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MAYBE_DownloadExtensionTest_Download_UnsafeHeaders) { 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kUnsafeHeaders[] = { 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-chArsEt", 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "accept-eNcoding", 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNNection", 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNteNt-leNgth", 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cooKIE", 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cOOkie2", 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "coNteNt-traNsfer-eNcodiNg", 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dAtE", 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ExpEcT", 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hOsT", 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kEEp-aLivE", 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rEfErEr", 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "tE", 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trAilER", 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trANsfer-eNcodiNg", 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "upGRAde", 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "usER-agENt", 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "viA", 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pRoxY-", 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sEc-", 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pRoxY-probably-not-evil", 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sEc-probably-not-evil", 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "oRiGiN", 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Access-Control-Request-Headers", 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Access-Control-Request-Method", 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) { 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 16061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_STREQ(errors::kInvalidHeaderUnsafe, 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"unsafe-header-%d.txt\"," 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [{" 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"%s\"," 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"value\": \"unsafe\"}]}]", 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str(), 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(index), 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUnsafeHeaders[index])).c_str()); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that invalid header names and values are rejected. 16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadExtensionTest_Download_InvalidHeaders) { 16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LoadExtension("downloads_split"); 16241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(StartEmbeddedTestServer()); 16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(test_server()->Start()); 16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GoOnTheRecord(); 16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string download_url = test_server()->GetURL("slow?0").spec(); 16281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_STREQ(errors::kInvalidHeaderName, 16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf( 16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "[{\"url\": \"%s\"," 16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"filename\": \"unsafe-header-crlf.txt\"," 16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"headers\": [{" 16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"name\": \"Header\\r\\nSec-Spoof: Hey\\r\\nX-Split:X\"," 16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"value\": \"unsafe\"}]}]", 16361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download_url.c_str())).c_str()); 16371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_STREQ(errors::kInvalidHeaderValue, 16391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RunFunctionAndReturnError(new DownloadsDownloadFunction(), 16401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf( 16411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "[{\"url\": \"%s\"," 16421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"filename\": \"unsafe-header-crlf.txt\"," 16431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"headers\": [{" 16441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"name\": \"Invalid-value\"," 16451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"value\": \"hey\\r\\nSec-Spoof: Hey\"}]}]", 16461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download_url.c_str())).c_str()); 16471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 16481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1649558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) 1650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\ 1651558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISABLED_DownloadExtensionTest_Download_Subdirectory 1652558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else 1653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\ 1654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadExtensionTest_Download_Subdirectory 1655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MAYBE_DownloadExtensionTest_Download_Subdirectory) { 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 1665558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 1666558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "[{\"url\": \"%s\"," 1667558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"filename\": \"sub/dir/ect/ory.txt\"}]", 1668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 1669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(result.get()); 1670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int result_id = -1; 1671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 1672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 1673558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(item); 1674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedCancellingItem canceller(item); 1675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 1676558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 16775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 16785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 16795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 16805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 16815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 16825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 16835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 16845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 16855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 16865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 16875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 16885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 16895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 16905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 16915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 16925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("sub/dir/ect/ory.txt").c_str()))); 16935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 16945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 16955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 16965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 16975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 16985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 16995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that invalid filenames are disallowed. 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_InvalidFilename) { 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1711558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"../../../../../etc/passwd\"}]", 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str())).c_str()); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// flaky on mac: crbug.com/392288 1720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX) 1721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_InvalidURLs \ 1722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISABLED_DownloadExtensionTest_Download_InvalidURLs 1723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 1724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_InvalidURLs \ 1725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DownloadExtensionTest_Download_InvalidURLs 1726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloading invalid URLs immediately returns kInvalidURLError. 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 1730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MAYBE_DownloadExtensionTest_Download_InvalidURLs) { 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kInvalidURLs[] = { 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo bar", 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "../hello", 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/hello", 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://", 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#frag", 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo/bar.html#frag", 1741558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "google.com/", 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) { 1745558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidURL, 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunFunctionAndReturnError(new DownloadsDownloadFunction(), 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 174858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str()) 174958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch << kInvalidURLs[index]; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 175158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STREQ("NETWORK_INVALID_REQUEST", RunFunctionAndReturnError( 1753bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1754bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str()); 17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STREQ("NETWORK_INVALID_REQUEST", RunFunctionAndReturnError( 1756bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1757bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"javascript:return false;\"}]").c_str()); 17585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STREQ("NETWORK_FAILED", RunFunctionAndReturnError( 1759bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new DownloadsDownloadFunction(), 1760bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str()); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions, test downloading from ftp. 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid URLs plus fragments are still valid URLs. 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_URLFragment) { 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0#fragment").spec(); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 17875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 17885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 17895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 17905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 17915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 17925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 17935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 17945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 17955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 17965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 17975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 17985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 17995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 18005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 18015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 18025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 18035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 18055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 18065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 18075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 18085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// conflictAction may be specified without filename. 18120529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 18130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadExtensionTest_Download_ConflictAction) { 18140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static char kFilename[] = "download.txt"; 18150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LoadExtension("downloads_split"); 18160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string download_url = "data:text/plain,hello"; 18170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GoOnTheRecord(); 18180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 18190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 18200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 18210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "[{\"url\": \"%s\"}]", download_url.c_str()))); 18220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result.get()); 18230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int result_id = -1; 18240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 18250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 18260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(item); 18270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScopedCancellingItem canceller(item); 18280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 18305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 18315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 18335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 18345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 18355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 18365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 18375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 18385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 18395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 18415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 18425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 18435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 18445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 18455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename(kFilename).c_str()))); 18465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 18475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 18495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 18505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 18515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 18525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 18530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 18540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result.reset(RunFunctionAndReturnResult( 18550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 18560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "[{\"url\": \"%s\", \"conflictAction\": \"overwrite\"}]", 18570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch download_url.c_str()))); 18580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result.get()); 18590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = -1; 18600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 18610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch item = GetCurrentManager()->GetDownload(result_id); 18620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(item); 18630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScopedCancellingItem canceller2(item); 18640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 18650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 18665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 18675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 18695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 18705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 18715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 18725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 18735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 18745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 18755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 18775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 18785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 18795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 18805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 18815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename(kFilename).c_str()))); 18825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 18835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 18845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 18855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 18865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 18875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 18885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 18890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 18900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid data URLs are valid URLs. 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_DataURL) { 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = "data:text/plain,hello"; 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"data.txt\"}]", download_url.c_str()))); 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 19115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 19125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 19135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 19145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 19155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 19165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 19175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 19185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 19195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 19205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 19215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 19225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 19235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 19245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 19255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("data.txt").c_str()))); 19265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 19275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 19285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 19295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 19305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 19315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 19325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid file URLs are valid URLs. 19365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to crbug.com/175711 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \ 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_DownloadExtensionTest_Download_File 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \ 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_Download_File 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_DownloadExtensionTest_Download_File) { 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = "file:///"; 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url += "C:/"; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"file.txt\"}]", download_url.c_str()))); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 19665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 19675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/html\"," 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 19735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 19745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 19755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 1977b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("file.txt").c_str()))); 19815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 19825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 19835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that auth-basic-succeed would fail if the resource requires the 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authorization header and chrome fails to propagate it back to the server. 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests both that testserver.py does not succeed when it should fail as 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well as how the downloads extension API exposes the failure to extensions. 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_AuthBasic_Fail) { 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 1997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("auth-basic").spec(); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"auth-basic-fail.txt\"}]", 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2016558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 20175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED, 2018558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2019558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2020558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"text/html\"," 2021558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2022558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2023558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates |headers| to the URLRequest. 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Headers) { 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/downloads/" 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec(); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"headers-succeed.txt\"," 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [" 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\"name\": \"Foo\", \"value\": \"bar\"}," 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\"name\": \"Qx\", \"value\":\"yo\"}]}]", 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 20535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 20545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 20555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 20565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"application/octet-stream\"," 20575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 20585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 20595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 20605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 20615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 20625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 20635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 20645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 20655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 20665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 20675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("headers-succeed.txt").c_str()))); 20685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 20695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 20705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 20715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 20725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 20735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 20745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that headers-succeed would fail if the resource requires the headers and 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome fails to propagate them back to the server. This tests both that 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testserver.py does not succeed when it should fail as well as how the 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloads extension api exposes the failure to extensions. 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Headers_Fail) { 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/downloads/" 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec(); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"headers-fail.txt\"}]", 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 21085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"bytesReceived\": 0.0," 21095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"fileSize\": 0.0," 2110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the Authorization header 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly. 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_AuthBasic) { 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("auth-basic").spec(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is just base64 of 'username:secret'. 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0"; 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"auth-basic-succeed.txt\"," 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"headers\": [{" 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"Authorization\"," 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"value\": \"Basic %s\"}]}]", 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str(), kAuthorization))); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 21455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 21465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 21475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 21485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"bytesReceived\": 0.0," 21495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"fileSize\": 0.0," 21505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/html\"," 21515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 21525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 21535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 21545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 21555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 21565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 21575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 21585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 21595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 21605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the |method| and |body| 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters to the URLRequest. 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post) { 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-succeed.txt\"," 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"method\": \"POST\"," 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"body\": \"BODY\"}]", 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 21905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 21915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 21925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 21935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"application/octet-stream\"," 21945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 21955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 21965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 21975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 21985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 21995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 22005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 22015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 22025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 22035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 22045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("post-succeed.txt").c_str()))); 22055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 22065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 22075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 22085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 22095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 22105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 22115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |method| parameter back to the 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post_Get) { 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"body\": \"BODY\"," 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-get.txt\"}]", 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2243558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2244558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2245558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2247558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2248558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2249558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"id\": %d," 2250558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2251558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 2252558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |body| parameter back to the 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Post_NoBody) { 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL("files/post/downloads/" 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip?expected_body=BODY").spec(); 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"," 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"method\": \"POST\"," 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": \"post-nobody.txt\"}]", 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(WaitForInterruption( 2284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch item, 2285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::StringPrintf("[{\"danger\": \"safe\"," 2287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"incognito\": false," 2288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"mime\": \"\"," 2289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"paused\": false," 2290558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"id\": %d," 2291558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"url\": \"%s\"}]", 2292558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result_id, 2293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch download_url.c_str()))); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cancel()ing an in-progress download causes its state to transition 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to interrupted, and test that that state transition is detectable by an 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// onChanged event listener. TODO(benjhayden): Test other sources of 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interruptions such as server death. 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadExtensionTest_Download_Cancel) { 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 2303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string download_url = test_server()->GetURL( 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "download-known-size").spec(); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 23215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 23225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"application/octet-stream\"," 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"id\": %d," 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->Cancel(true); 23315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 23325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 23335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 2334558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch " \"error\": {\"current\":\"USER_CANCELED\"}," 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"state\": {" 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"previous\": \"in_progress\"," 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"current\": \"interrupted\"}}]", 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id))); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// flaky on mac: crbug.com/392288 2342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX) 2343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_FileSystemURL \ 2344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISABLED_DownloadExtensionTest_Download_FileSystemURL 2345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 2346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_FileSystemURL \ 2347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DownloadExtensionTest_Download_FileSystemURL 2348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 2349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloading filesystem: URLs. 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: chrome disallows creating HTML5 FileSystem Files in incognito. 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 2353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MAYBE_DownloadExtensionTest_Download_FileSystemURL) { 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kPayloadData = "on the record\ndata"; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoOnTheRecord(); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("downloads_split"); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string download_url = "filesystem:" + GetExtensionURL() + 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "temporary/on_record.txt"; 2360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Setup a file in the filesystem which we can download. 2362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(HTML5FileWriter::CreateFileForTesting( 236303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(browser()->profile()) 236403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->GetFileSystemContext(), 236503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL::CreateForTest(GURL(download_url)), 236603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) kPayloadData, 236703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) strlen(kPayloadData))); 2368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now download it. 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.get()); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_id = -1; 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(item); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCancellingItem canceller(item); 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 23835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 23845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"incognito\": false," 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mime\": \"text/plain\"," 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"paused\": false," 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"url\": \"%s\"}]", 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_url.c_str()))); 23905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 23915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 23925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"filename\": {" 2394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_id, 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFilename("on_record.txt").c_str()))); 23985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 23995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 24005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string disk_data; 240658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(item->GetTargetFilePath(), &disk_data)); 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(kPayloadData, disk_data.c_str()); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 2411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_NoChange) { 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 24325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 24335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 24345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 24425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 24435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 24445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 24455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 24465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 244890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 24585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 24635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 24645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 24655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 24665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 24675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 24685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 24695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 24705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 24715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 24725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 24735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 24745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 24755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 24765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 24775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Disabled due to cross-platform flakes; http://crbug.com/370531. 2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DownloadExtensionTest, 2483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_Timeout) { 2484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GoOnTheRecord(); 2485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LoadExtension("downloads_split"); 2486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddFilenameDeterminer(); 2487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(StartEmbeddedTestServer()); 2488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 2489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExtensionDownloadsEventRouter::SetDetermineFilenameTimeoutSecondsForTesting( 2492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 2493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Start downloading a file. 2495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(result.get()); 2499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int result_id = -1; 2500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(item); 2503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedCancellingItem canceller(item); 2504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 2507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 2508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"incognito\": false," 2510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"id\": %d," 2511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"mime\": \"text/plain\"," 2512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"paused\": false," 2513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"url\": \"%s\"}]", 2514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id, 2515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) download_url.c_str()))); 2516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor( 2517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) downloads::OnDeterminingFilename::kEventName, 2518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id))); 2521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 2522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 2523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Do not respond to the onDeterminingFilename. 2525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The download should complete successfully. 2527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 2528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"filename\": {" 2530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"previous\": \"\"," 2531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"current\": \"%s\"}}]", 2532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id, 2533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 2535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"state\": {" 2537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"previous\": \"in_progress\"," 2538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"current\": \"complete\"}}]", 2539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id))); 2540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 2543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_Twice) { 2544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GoOnTheRecord(); 2545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LoadExtension("downloads_split"); 2546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddFilenameDeterminer(); 2547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(StartEmbeddedTestServer()); 2548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 2549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Start downloading a file. 2552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(result.get()); 2556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int result_id = -1; 2557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(item); 2560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedCancellingItem canceller(item); 2561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 2562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 2564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 2565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"danger\": \"safe\"," 2566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"incognito\": false," 2567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"id\": %d," 2568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"mime\": \"text/plain\"," 2569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"paused\": false," 2570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"url\": \"%s\"}]", 2571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id, 2572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) download_url.c_str()))); 2573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor( 2574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) downloads::OnDeterminingFilename::kEventName, 2575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"filename\":\"slow.txt\"}]", 2577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id))); 2578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 2579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 2580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Respond to the onDeterminingFilename. 2582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string error; 2583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 2584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) browser()->profile(), 2585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) false, 2586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetExtensionId(), 2587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id, 2588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath(), 2589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 2590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &error)); 2591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ("", error); 2592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Calling DetermineFilename again should return an error instead of calling 2594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // DownloadTargetDeterminer. 2595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 2596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) browser()->profile(), 2597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) false, 2598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetExtensionId(), 2599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id, 2600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("different")), 2601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, 2602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &error)); 2603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(errors::kTooManyListeners, error); 2604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The download should complete successfully. 2606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 2607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"filename\": {" 2609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"previous\": \"\"," 2610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"current\": \"%s\"}}]", 2611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id, 2612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 2613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 2614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("[{\"id\": %d," 2615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"state\": {" 2616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"previous\": \"in_progress\"," 2617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"current\": \"complete\"}}]", 2618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_id))); 2619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) { 26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 26342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 26352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 26445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 26455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 26535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 26545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 26555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 26565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 26575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 265990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("overridden.swf")), 26695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 26745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 26755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 26765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"danger\": {" 26775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\":\"safe\"," 26785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\":\"file\"}}]", 26795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item->ValidateDangerousDownload(); 26825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 26835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 26845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 26855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"danger\": {" 26865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\":\"file\"," 26875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\":\"accepted\"}}]", 26885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 26895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 26905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 26915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"state\": {" 26932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"previous\": \"in_progress\"," 26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"current\": \"complete\"}}]", 2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(downloads_directory().AppendASCII("overridden.swf"), 2697b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) item->GetTargetFilePath()); 26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ReferencesParentInvalid) { 27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 27052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 27092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 27235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 27245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 27325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 27335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 27345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 27355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 27365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 273890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 27462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("sneaky/../../sneaky.txt")), 27485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 27492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2750558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 27515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 27525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 27535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\": {" 2755b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 2756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 27595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 27605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 27615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 2762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 2763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 2764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 2765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 27692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IllegalFilename) { 27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 27915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 27925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 27992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 28005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 28015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 28035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 28045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 280690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 28132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 28142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("<")), 28165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2818558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 28195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 28205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 28225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 28235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 28245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 28255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 28265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 28275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 28285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 28305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 28315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 28325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 28335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 2838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IllegalFilenameExtension) { 28392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 28452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 28472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 28492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 28595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 28685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 28695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 28715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 28725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 287490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 28782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 2884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}/foo")), 28855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2887558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 28885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 28895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 28915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 28925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 28935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 28945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 28955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 28965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 28975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 28985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 28995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 29005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 29015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 29025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) 29054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\ 29064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename 29074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 29084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\ 29094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ReservedFilename 29104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 29134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename) { 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 29162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 2917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 29222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 29242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 29252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 29345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 29355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 29422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 29435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 29445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 29455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 29465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 29475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 294990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 2958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("con.foo")), 29595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 2961558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 29625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 29635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 29645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 29655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 29665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 29675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 29685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 29695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 29705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 29715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 29725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 29735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 29745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 29755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 29765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 2977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 2980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 2981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_CurDirInvalid) { 2982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 2983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 2985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 2987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 2988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 2990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 2991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 2992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 2993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 2994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 2995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 2996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 2998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 2999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 3000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 30025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 30035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 3004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 3005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 3006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 3009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 30115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 30125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 30135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 30145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 30155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 3016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 301790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 3020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 3021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 3022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 3024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 3025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL(".")), 30275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 3028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 3029558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 30305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 30315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 30325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 30335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 30345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 30355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 30365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 30375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 30385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 30395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 30405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 30415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 30425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 30435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 30445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 3045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 3048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 3049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_ParentDirInvalid) { 3050eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3051eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 3052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 3053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 3054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 3055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 3056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 3058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 3060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 3061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 3062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 3063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 3064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 3065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 3066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 3067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 3068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 30705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 30715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 3072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"incognito\": false," 3073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": %d," 3074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"mime\": \"text/plain\"," 3075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"paused\": false," 3076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": \"%s\"}]", 30772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 3078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_url.c_str()))); 30795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 30805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 30815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 30825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 30835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 3084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 308590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 3086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. 3088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 3089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 3090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 3091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 3092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 3093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("..")), 30955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 3096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 3097558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 30985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 30995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 31005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 31015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 31025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 31035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 31045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 31055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 31065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 31075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 31085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 31095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 31105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 31115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 31125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 3117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_AbsPathInvalid) { 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 31192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 31202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 3121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 31262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 31352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 31385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 31395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 31475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 31485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 31495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 31505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 31515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 315390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. Absolute paths should be rejected. 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 31612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 3162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) downloads_directory().Append(FILE_PATH_LITERAL("sneaky.txt")), 31635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 3165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 31662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 31685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 31695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"filename\": {" 3171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " \"previous\": \"\"," 3172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"%s\"}}]", 31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFilename("slow.txt").c_str()))); 31755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 31765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 31775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 3178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"state\": {" 3179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"previous\": \"in_progress\"," 3180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"current\": \"complete\"}}]", 3181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id))); 31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 31852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 3186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_EmptyBasenameInvalid) { 31872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 31882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 31892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 3190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 31932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 3205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 32075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 32085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 32092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 32102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 32112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 32122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 32132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 32142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 32165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 32175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 32185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 32195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 32205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 322290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 32232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Respond to the onDeterminingFilename. Empty basenames should be rejected. 3225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 3226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename( 3227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 3228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 3229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionId(), 3230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_id, 3231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("foo/")), 32325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 3233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error)); 3234558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_STREQ(errors::kInvalidFilename, error.c_str()); 3235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 32375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 32385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 32395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 32405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 32415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 32425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 32435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 32445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 32455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 32465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 32475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 32485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 32495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 32505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 32510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 32520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 32530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// conflictAction may be specified without filename. 32540529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F( 32550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadExtensionTest, 32560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadExtensionTest_OnDeterminingFilename_Overwrite) { 32570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GoOnTheRecord(); 32580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LoadExtension("downloads_split"); 32590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddFilenameDeterminer(); 32600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 32610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(test_server()->Start()); 32620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string download_url = test_server()->GetURL("slow?0").spec(); 32630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 32640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Start downloading a file. 32650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 32660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 32670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "[{\"url\": \"%s\"}]", download_url.c_str()))); 32680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result.get()); 32690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int result_id = -1; 32700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 32710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 32720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(item); 32730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScopedCancellingItem canceller(item); 32740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 32755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 32765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 32775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 32785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 32795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 32805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 32815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 32825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 32835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 32845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 32855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 32865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 32875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 32885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 32895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 32900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(item->GetTargetFilePath().empty()); 32910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 32920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 32930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Respond to the onDeterminingFilename. 32940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string error; 32950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 32960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch browser()->profile(), 32970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false, 32980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetExtensionId(), 32990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id, 33000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::FilePath(), 33015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 33020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &error)); 33030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ("", error); 33040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 33055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 33065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 33075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 33085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 33095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 33105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 33115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 33125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 33135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 33145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 33155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 33165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 33175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 33185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 33195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 33200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 33210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Start downloading a file. 33220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result.reset(RunFunctionAndReturnResult( 33230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new DownloadsDownloadFunction(), base::StringPrintf( 33240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "[{\"url\": \"%s\"}]", download_url.c_str()))); 33250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result.get()); 33260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = -1; 33270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(result->GetAsInteger(&result_id)); 33280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch item = GetCurrentManager()->GetDownload(result_id); 33290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(item); 33300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScopedCancellingItem canceller2(item); 33310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 33320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 33335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 33345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 33355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 33365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 33375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 33385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 33395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 33405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 33415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 33425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 33435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 33445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 33455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 33465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 33475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 33480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(item->GetTargetFilePath().empty()); 33490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 33500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 33510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Respond to the onDeterminingFilename. 33520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Also test that DetermineFilename allows (chrome) extensions to set 33530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // filenames without (filename) extensions. (Don't ask about v8 extensions or 33540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // python extensions or kernel extensions or firefox extensions...) 33550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch error = ""; 33560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 33570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch browser()->profile(), 33580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false, 33590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetExtensionId(), 33600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id, 33610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::FilePath(), 33625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, 33630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &error)); 33640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ("", error); 33650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 33665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 33675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 33685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 33695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 33705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 33715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 33725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 33735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 33745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 33755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 33765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 33775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 33785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 33795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 33805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 3381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest, 3385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_Override) { 3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoOnTheRecord(); 3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadExtension("downloads_split"); 3388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddFilenameDeterminer(); 3389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 3391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 3392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start downloading a file. 3394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 3395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 3396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 3397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result.get()); 3398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int result_id = -1; 3399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 3400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 3401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 3402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCancellingItem canceller(item); 3403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 34045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 34055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 34075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 34085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 34095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 34105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 34115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 34125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 34135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 34145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 34155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 34175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 34185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 3419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 342090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 3421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 34232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 34252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 34262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 34272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 34282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 34292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 34305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 34312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 34332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 34355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 34375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 34385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 34395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 34405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 34415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("slow.txt").c_str()))); 34425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 34435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 34455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 34465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 34475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 34485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 34492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 34532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 34542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 34552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 34572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 34582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 34635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 34655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 34665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 34675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 34685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 34695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 34705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 34715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 34725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 34735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 34755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 34765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 347890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 34792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 34812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also test that DetermineFilename allows (chrome) extensions to set 34822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // filenames without (filename) extensions. (Don't ask about v8 extensions or 34832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // python extensions or kernel extensions or firefox extensions...) 34842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile(), 34872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 34882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 34892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("foo")), 34915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, 34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 34932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 34942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 34965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 34975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 34985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 34995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 35005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 35015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 35025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("foo").c_str()))); 35035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 35045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 35055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 35065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 35075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 35085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 35095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO test precedence rules: install_time 35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX) 3515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer \ 3516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISABLED_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer 3517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 3518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer \ 3519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer 3520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 3523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MAYBE_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer) { 3524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 35262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 35272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 35282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderProcessHost* host = AddFilenameDeterminer(); 35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 35302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file. 35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 35332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 35342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 35352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 35362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 35372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 35382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 35392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 35402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 35412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 35422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 35445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 35455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 35462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 35472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 35482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 35492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 35512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 35535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 35545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 35555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 35565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 35575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 355990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove a determiner while waiting for it. 35622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveFilenameDeterminer(host); 35632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 35655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 35665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 35675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 35685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 35695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 35705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 35712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 35752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IncognitoSplit) { 35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 3577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 35792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 35802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 35822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 35832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an on-record download. 35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 36015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 36025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 36082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 36092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 36115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 36125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 36145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 36155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 36165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 36172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 361890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 36192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename events. 36212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 36222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 36232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 36242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 36252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 36262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 36272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 36285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 36292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 36302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 36312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 36335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 36345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 36365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 36375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 36385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 36395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 36405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("42.txt").c_str()))); 36415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 36425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 36445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 36455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 36465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 36475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 36482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an incognito download for comparison. 36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 36512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 36522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 36532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 36542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 36552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 36562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 36572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 36582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 36592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 36602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 36612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 36635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 36655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": true," 36665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 36675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 36685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 36695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 36705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 36715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 36722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On-Record renderers should not see events for off-record items. 36735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 36745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 36765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": true," 36775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 36785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 36792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 368090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 36812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 36832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 36842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 36852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 36862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 36872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 36882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 36892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("5.txt")), 36905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 36912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 36922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 36932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 36955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 36965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 36975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 36985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 36995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 37005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 37015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 37025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("5.txt").c_str()))); 37035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 37045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 37055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 37065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 37075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 37085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 37095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 37102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 37112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 37132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 37142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_IncognitoSpanning) { 37152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_spanning"); 3716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 37182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string download_url = test_server()->GetURL("slow?0").spec(); 37192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 37212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddFilenameDeterminer(); 37222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There is a single extension renderer that sees both on-record and 37242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // off-record events. The extension functions see the on-record profile with 37252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // include_incognito=true. 37262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an on-record download. 37282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 37292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 37302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 37312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 37322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 37332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result_id = -1; 37342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 37352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 37362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 37372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 37382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 37392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename events. 37415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 37425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 37435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 37442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"incognito\": false," 37452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": %d," 37462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"mime\": \"text/plain\"," 37472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"paused\": false," 37482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": \"%s\"}]", 37492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 37502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_url.c_str()))); 37515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 37525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 37535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 37545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 37555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 37565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 37572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 375890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename events. 37612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 37622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 37632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 37642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 37652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 37662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 37672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 37685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 37692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 37702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 37712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 37735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 37745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 37755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 37765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 37775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 37785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 37795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 37805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("42.txt").c_str()))); 37815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 37825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 37835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 37845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 37855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 37865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 37875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 37882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start an incognito download for comparison. 37902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOffTheRecord(); 37912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.reset(RunFunctionAndReturnResult( 37922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadsDownloadFunction(), base::StringPrintf( 37932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[{\"url\": \"%s\"}]", download_url.c_str()))); 37942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result.get()); 37952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id = -1; 37962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 37972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = GetCurrentManager()->GetDownload(result_id); 37982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 37992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller2(item); 38002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); 38012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 38035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 38045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 38055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": true," 38065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 38075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"text/plain\"," 38085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false," 38095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"url\": \"%s\"}]", 38105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 38115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu download_url.c_str()))); 38125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 38135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 38145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 38155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": true," 38165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"slow.txt\"}]", 38175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 38182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 381990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 38202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Respond to the onDeterminingFilename. 38222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = ""; 38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 38242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 38252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 38262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 38272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_id, 38282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 38295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 38302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error)); 38312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 38322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 38345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 38355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 38365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 38375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 38385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 38395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 38405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id, 38415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("42 (1).txt").c_str()))); 38425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 38435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 38445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 38455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 38465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 38475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 38485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 38492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 38502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38515e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#if defined(OS_WIN) 38525e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)// This test is very flaky on Win XP and Aura. http://crbug.com/248438 38535e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \ 38545e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume 38555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#else 38565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \ 38575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DownloadExtensionTest_OnDeterminingFilename_InterruptedResume 38585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#endif 38595e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 3860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test download interruption while extensions determining filename. Should not 3861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// re-dispatch onDeterminingFilename. 38622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 38632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadExtensionTest, 38645e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) { 3865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 3866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switches::kEnableDownloadResumption); 38672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadExtension("downloads_split"); 3868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server()->Start()); 38702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoOnTheRecord(); 3871a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::RenderProcessHost* host = AddFilenameDeterminer(); 38722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start a download. 3874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* item = NULL; 3875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 3876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager* manager = GetCurrentManager(); 3877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 3878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new JustInProgressDownloadObserver(manager, 1)); 3879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0, manager->InProgressCount()); 38808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(0, manager->NonMaliciousInProgressCount()); 3881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tabs created just for a download are automatically closed, invalidating 3882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the download's WebContents. Downloads without WebContents cannot be 3883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // resumed. http://crbug.com/225901 3884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 3886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl), 3887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CURRENT_TAB, 3888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 3889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer->WaitForFinished(); 3890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 3891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadManager::DownloadVector items; 3892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager->GetAllDownloads(&items); 3893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 3894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != items.end(); ++iter) { 3895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 3896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // There should be only one IN_PROGRESS item. 3897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, item); 3898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item = *iter; 3899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(item); 3902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 39032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedCancellingItem canceller(item); 39042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the onCreated and onDeterminingFilename event. 39065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, 39075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 39085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"danger\": \"safe\"," 39095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 39105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"id\": %d," 39115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"mime\": \"application/octet-stream\"," 39125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"paused\": false}]", 39135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId()))); 39145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, 39155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 39165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 39175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"incognito\": false," 39185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\":\"download-unknown-size\"}]", 39195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId()))); 39202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item->GetTargetFilePath().empty()); 392190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 39222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser(), 3926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl), 3927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NEW_BACKGROUND_TAB, 3928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 39292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Errors caught before filename determination are delayed until after 3931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // filename determination. 39322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 39332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename( 39342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile(), 39352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 39362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionId(), 3937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item->GetId(), 39382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("42.txt")), 39395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY, 39405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &error)) 39415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu << error; 39422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 39435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 39445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 39455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 39465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"filename\": {" 39475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"\"," 39485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"%s\"}}]", 39495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId(), 39505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFilename("42.txt").c_str()))); 39512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadUpdatedObserver interrupted(item, base::Bind( 3953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ItemIsInterrupted)); 3954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(interrupted.WaitForEvent()); 39555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 39565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 39575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 39585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"error\":{\"current\":\"NETWORK_FAILED\"}," 39595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\":{" 39605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\":\"in_progress\"," 39615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\":\"interrupted\"}}]", 39625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId()))); 3963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3965a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Downloads that are restarted on resumption trigger another download target 3966a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // determination. 3967a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RemoveFilenameDeterminer(host); 3968a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) item->Resume(); 3969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Errors caught before filename determination is complete are delayed until 3971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // after filename determination so that, on resumption, filename determination 3972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // does not need to be re-done. So, there will not be a second 3973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onDeterminingFilename event. 3974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 39765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 39775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 39785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"error\":{\"previous\":\"NETWORK_FAILED\"}," 39795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\":{" 39805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\":\"interrupted\"," 39815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\":\"in_progress\"}}]", 39825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId()))); 3983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearEvents(); 3985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FinishPendingSlowDownloads(); 3986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download should complete successfully. 39885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 39895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 39905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d," 39915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"state\": {" 39925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"in_progress\"," 39935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"complete\"}}]", 39945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item->GetId()))); 39952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 39962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3997a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 3998a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadExtensionTest_SetShelfEnabled) { 3999a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoadExtension("downloads_split"); 4000a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[false]")); 4001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(DownloadServiceFactory::GetForBrowserContext( 4002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser()->profile())->IsShelfEnabled()); 4003a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[true]")); 4004a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(DownloadServiceFactory::GetForBrowserContext( 4005a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser()->profile())->IsShelfEnabled()); 4006a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test that existing shelves are hidden. 4007a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test multiple extensions. 4008a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test disabling extensions. 4009a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test that browsers associated with other profiles are not 4010a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // affected. 4011a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(benjhayden) Test incognito. 4012a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 4013a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 40142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benjhayden) Figure out why DisableExtension() does not fire 40152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnListenerRemoved. 4016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Test that the shelf is shown for download() both with and 4018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// without a WebContents. 4019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4020424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OnDangerPromptCreated(DownloadDangerPrompt* prompt) { 4021424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) prompt->InvokeActionForTesting(DownloadDangerPrompt::ACCEPT); 4022424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 4023424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 40245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 40255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Flakily triggers and assert on Mac. 40265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// http://crbug.com/180759 40275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_AcceptDanger DownloadExtensionTest_AcceptDanger 40285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 40295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_AcceptDanger DISABLED_DownloadExtensionTest_AcceptDanger 40305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4031424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, 40325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MAYBE_DownloadExtensionTest_AcceptDanger) { 4033424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Download a file that will be marked dangerous; click the browser action 4034424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // button; the browser action poup will call acceptDanger(); when the 4035424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // DownloadDangerPrompt is created, pretend that the user clicks the Accept 4036424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // button; wait until the download completes. 4037424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LoadExtension("downloads_split"); 4038424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<base::Value> result(RunFunctionAndReturnResult( 4039424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new DownloadsDownloadFunction(), 4040424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "[{\"url\": \"data:,\", \"filename\": \"dangerous.swf\"}]")); 4041424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(result.get()); 4042424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int result_id = -1; 4043424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(result->GetAsInteger(&result_id)); 4044424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadItem* item = GetCurrentManager()->GetDownload(result_id); 4045424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(item); 40465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, 40475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringPrintf( 40485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "[{\"id\": %d, " 40495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"danger\": {" 40505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"previous\": \"safe\"," 40515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu " \"current\": \"file\"}}]", 40525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result_id))); 4053424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(item->IsDangerous()); 4054424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ScopedCancellingItem canceller(item); 4055424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 4056424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new content::DownloadTestObserverTerminal( 4057424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetCurrentManager(), 1, 4058424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE)); 4059424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadsAcceptDangerFunction::OnPromptCreatedCallback callback = 4060424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(&OnDangerPromptCreated); 4061424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadsAcceptDangerFunction::OnPromptCreatedForTesting( 4062424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &callback); 4063424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 4064424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) observer->WaitForFinished(); 4065424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 4066424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadsApiTest : public ExtensionApiTest { 4068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 4069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadsApiTest() {} 4070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DownloadsApiTest() {} 4071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 4072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadsApiTest); 4073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 4074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) { 4077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("downloads")) << message_; 4078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4079558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4080558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST(DownloadInterruptReasonEnumsSynced, 4081558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DownloadInterruptReasonEnumsSynced) { 40825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value) \ 40835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(InterruptReasonContentToExtension( \ 40845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::DOWNLOAD_INTERRUPT_REASON_##name), \ 40855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::INTERRUPT_REASON_##name); \ 40865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ( \ 40875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InterruptReasonExtensionToContent(downloads::INTERRUPT_REASON_##name), \ 4088558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_##name); 4089558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h" 4090558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON 4091558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 4092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4093ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(ExtensionDetermineDownloadFilenameInternal, 4094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDetermineDownloadFilenameInternal) { 4095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string winner_id; 4096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath filename; 40975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FilenameConflictAction conflict_action = 40985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY; 40991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WarningSet warnings; 4100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Empty incumbent determiner 4102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.clear(); 4103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 4104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath(FILE_PATH_LITERAL("a")), 41055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, 4106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "suggester", 4107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now(), 4108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "", 4109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time(), 4110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &winner_id, 4111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &filename, 4112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &conflict_action, 4113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &warnings); 4114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("suggester", winner_id); 4115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value()); 41165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action); 4117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(warnings.empty()); 4118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Incumbent wins 4120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.clear(); 4121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 4122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath(FILE_PATH_LITERAL("b")), 41235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_PROMPT, 4124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "suggester", 4125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - base::TimeDelta::FromDays(1), 4126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "incumbent", 4127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now(), 4128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &winner_id, 4129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &filename, 4130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &conflict_action, 4131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &warnings); 4132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("incumbent", winner_id); 4133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value()); 41345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action); 4135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(warnings.empty()); 41361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(Warning::kDownloadFilenameConflict, 4137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.begin()->warning_type()); 4138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("suggester", warnings.begin()->extension_id()); 4139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Suggester wins 4141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.clear(); 4142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtensionDownloadsEventRouter::DetermineFilenameInternal( 4143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::FilePath(FILE_PATH_LITERAL("b")), 41445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu downloads::FILENAME_CONFLICT_ACTION_PROMPT, 4145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "suggester", 4146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now(), 4147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "incumbent", 4148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - base::TimeDelta::FromDays(1), 4149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &winner_id, 4150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &filename, 4151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &conflict_action, 4152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &warnings); 4153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("suggester", winner_id); 4154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(FILE_PATH_LITERAL("b"), filename.value()); 41555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_PROMPT, conflict_action); 4156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(warnings.empty()); 41571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(Warning::kDownloadFilenameConflict, 4158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch warnings.begin()->warning_type()); 4159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("incumbent", warnings.begin()->extension_id()); 4160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 4161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace extensions 41635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // http://crbug.com/3061144 4165