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