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