downloads_api_browsertest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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/history/download_row.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_slow_download_job.h"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/event_router.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
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace extensions {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace downloads = api::downloads;
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Comparator that orders download items by their ID. Can be used with
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::sort.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DownloadIdComparator {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator() (DownloadItem* first, DownloadItem* second) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return first->GetId() < second->GetId();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadsEventsListener : public content::NotificationObserver {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadsEventsListener()
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : waiting_(false) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadsEventsListener() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Remove(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      content::NotificationService::AllSources());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&events_);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ClearEvents() {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    STLDeleteElements(&events_);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    events_.clear();
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Event {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Event(Profile* profile,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const std::string& event_name,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const std::string& json_args,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Time caught)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : profile_(profile),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event_name_(event_name),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        json_args_(json_args),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        args_(base::JSONReader::Read(json_args)),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        caught_(caught) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& caught() { return caught_; }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool Satisfies(const Event& other) const {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return other.SatisfiedBy(*this);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool SatisfiedBy(const Event& other) const {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((profile_ != other.profile_) ||
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (event_name_ != other.event_name_))
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (((event_name_ == downloads::OnDeterminingFilename::kEventName) ||
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu           (event_name_ == downloads::OnCreated::kEventName) ||
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu           (event_name_ == downloads::OnChanged::kEventName)) &&
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          args_.get() && 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;
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      } else if ((event_name_ == downloads::OnErased::kEventName) &&
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 args_.get() && other.args_.get()) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int my_id = -1, other_id = -1;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (args_->GetAsInteger(&my_id) &&
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                other.args_->GetAsInteger(&other_id) &&
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                my_id == other_id);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return json_args_ == other.json_args_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string Debug() {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::StringPrintf("Event(%p, %s, %s, %f)",
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                profile_,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                event_name_.c_str(),
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                json_args_.c_str(),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                caught_.ToJsTime());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string event_name_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string json_args_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Value> args_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time caught_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Event);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadsNotificationSource;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationSource& source,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadsNotificationSource* dns =
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::Source<DownloadsNotificationSource>(source).ptr();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Event* new_event = new Event(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              dns->profile,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              dns->event_name,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              *content::Details<std::string>(details).ptr(), base::Time::Now());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          events_.push_back(new_event);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (waiting_ &&
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              waiting_for_.get() &&
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              new_event->Satisfies(*waiting_for_)) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            waiting_ = false;
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            base::MessageLoopForUI::current()->Quit();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitFor(Profile* profile,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& event_name,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& json_args) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_.reset(new Event(profile, event_name, json_args, base::Time()));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::deque<Event*>::const_iterator iter = events_.begin();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != events_.end(); ++iter) {
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if ((*iter)->Satisfies(*waiting_for_.get())) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = true;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = !waiting_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Print the events that were caught since the last WaitFor() call to help
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // find the erroneous event.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(benjhayden) Fuzzy-match and highlight the erroneous event.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (std::deque<Event*>::const_iterator iter = events_.begin();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          iter != events_.end(); ++iter) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((*iter)->caught() > last_wait_) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          LOG(INFO) << "Caught " << (*iter)->Debug();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (waiting_for_.get()) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(INFO) << "Timed out waiting for " << waiting_for_->Debug();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_.reset();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_wait_ = base::Time::Now();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return success;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_wait_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Event> waiting_for_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<Event*> events_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadExtensionTest : public ExtensionApiTest {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadExtensionTest()
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : extension_(NULL),
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incognito_browser_(NULL),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_browser_(NULL) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used with CreateHistoryDownloads
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct HistoryDownloadInfo {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Filename to use. CreateHistoryDownloads will append this filename to the
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // temporary downloads directory specified by downloads_directory().
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType*   filename;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // State for the download. Note that IN_PROGRESS downloads will be created
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as CANCELLED.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem::DownloadState state;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::DownloadDangerType danger_type;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadExtension(const char* name) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store the created Extension object so that we can attach it to
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ExtensionFunctions.  Also load the extension in incognito profiles for
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // testing incognito.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_ = LoadExtensionIncognito(test_data_dir_.AppendASCII(name));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(extension_);
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* tab = chrome::AddSelectedTabWithURL(
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        current_browser(),
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extension_->GetResourceURL("empty.html"),
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::PAGE_TRANSITION_LINK);
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnCreated::kEventName,
2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           tab->GetRenderProcessHost(),
2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           GetExtensionId());
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnChanged::kEventName,
2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           tab->GetRenderProcessHost(),
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           GetExtensionId());
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnErased::kEventName,
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           tab->GetRenderProcessHost(),
2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           GetExtensionId());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderProcessHost* AddFilenameDeterminer() {
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ExtensionDownloadsEventRouter::SetDetermineFilenameTimeoutSecondsForTesting(
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        2);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* tab = chrome::AddSelectedTabWithURL(
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        current_browser(),
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_->GetResourceURL("empty.html"),
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::PAGE_TRANSITION_LINK);
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnDeterminingFilename::kEventName,
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           tab->GetRenderProcessHost(),
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           GetExtensionId());
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return tab->GetRenderProcessHost();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveFilenameDeterminer(content::RenderProcessHost* host) {
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())->RemoveEventListener(
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        downloads::OnDeterminingFilename::kEventName, host, GetExtensionId());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* current_browser() { return current_browser_; }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InProcessBrowserTest
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionApiTest::SetUpOnMainThread();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUpOnMainThread();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoOnTheRecord();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateAndSetDownloadsDirectory();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_browser()->profile()->GetPrefs()->SetBoolean(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kPromptForDownload, false);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetOnRecordManager()->RemoveAllDownloads();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    events_listener_.reset(new DownloadsEventsListener());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Disable file chooser for current profile.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadTestFileActivityObserver observer(current_browser()->profile());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.EnableFileChooser(false);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GoOnTheRecord() { current_browser_ = browser(); }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GoOffTheRecord() {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!incognito_browser_) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incognito_browser_ = CreateIncognitoBrowser();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetOffRecordManager()->RemoveAllDownloads();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Disable file chooser for incognito profile.
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadTestFileActivityObserver observer(incognito_browser_->profile());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer.EnableFileChooser(false);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_browser_ = incognito_browser_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitFor(const std::string& event_name, const std::string& json_args) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return events_listener_->WaitFor(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_browser()->profile(), event_name, json_args);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
349558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  bool WaitForInterruption(
350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      DownloadItem* item,
351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DownloadInterruptReason expected_error,
352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      const std::string& on_created_event) {
3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!WaitFor(downloads::OnCreated::kEventName, on_created_event))
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now, onCreated is always fired before interruption.
3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return WaitFor(
3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        downloads::OnChanged::kEventName,
3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::StringPrintf(
3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "[{\"id\": %d,"
3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "  \"error\": {\"current\": \"%s\"},"
3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "  \"state\": {"
3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "    \"previous\": \"in_progress\","
3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "    \"current\": \"interrupted\"}}]",
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            item->GetId(),
3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            content::DownloadInterruptReasonToString(expected_error).c_str()));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ClearEvents() {
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    events_listener_->ClearEvents();
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetExtensionURL() {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_->url().spec();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetExtensionId() {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return extension_->id();
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetFilename(const char* path) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result =
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::string::size_type next = result.find("\\");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         next != std::string::npos;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         next = result.find("\\", next)) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.replace(next, 1, "\\\\");
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next += 2;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetOnRecordManager() {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BrowserContext::GetDownloadManager(browser()->profile());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetOffRecordManager() {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BrowserContext::GetDownloadManager(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser()->profile()->GetOffTheRecordProfile());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetCurrentManager() {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (current_browser_ == incognito_browser_) ?
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetOffRecordManager() : GetOnRecordManager();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a set of history downloads based on the provided |history_info|
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // array. |count| is the number of elements in |history_info|. On success,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |items| will contain |count| DownloadItems in the order that they were
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified in |history_info|. Returns true on success and false otherwise.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t count,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DownloadManager::DownloadVector* items) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadIdComparator download_id_comparator;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time current = base::Time::Now();
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items->clear();
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetOnRecordManager()->GetAllDownloads(items);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK_EQ(0, static_cast<int>(items->size()));
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<GURL> url_chain;
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    url_chain.push_back(GURL());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < count; ++i) {
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem* item = GetOnRecordManager()->CreateDownloadItem(
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          content::DownloadItem::kInvalidId + 1 + i,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          downloads_directory().Append(history_info[i].filename),
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          downloads_directory().Append(history_info[i].filename),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url_chain, GURL(),    // URL Chain, referrer
425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          std::string(), std::string(), // mime_type, original_mime_type
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          current, current,  // start_time, end_time
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::string(), std::string(), // etag, last_modified
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          1, 1,              // received_bytes, total_bytes
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          history_info[i].state,  // state
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::DOWNLOAD_INTERRUPT_REASON_NONE,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);                 // opened
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      items->push_back(item);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Order by ID so that they are in the order that we created them.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::sort(items->begin(), items->end(), download_id_comparator);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set the danger type if necessary.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < count; ++i) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (history_info[i].danger_type !=
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  history_info[i].danger_type);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        items->at(i)->OnContentCheckCompleted(history_info[i].danger_type);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateSlowTestDownloads(
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t count, DownloadManager::DownloadVector* items) {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < count; ++i) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<content::DownloadTestObserver> observer(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CreateInProgressDownloadObserver(1));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::NavigateToURLWithDisposition(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          current_browser(), slow_download_url, CURRENT_TAB,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer->WaitForFinished();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCurrentManager()->GetAllDownloads(items);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(count, items->size());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* CreateSlowTestDownload() {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<content::DownloadTestObserver> observer(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateInProgressDownloadObserver(1));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager = GetCurrentManager();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(0, manager->NonMaliciousInProgressCount());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, manager->InProgressCount());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager->InProgressCount() != 0)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_browser(), slow_download_url, CURRENT_TAB,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->WaitForFinished();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager::DownloadVector items;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* new_item = NULL;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DownloadManager::DownloadVector::iterator iter = items.begin();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != items.end(); ++iter) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // There should be only one IN_PROGRESS item.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(NULL, new_item);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_item = *iter;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new_item;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishPendingSlowDownloads() {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<content::DownloadTestObserver> observer(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateDownloadObserver(1));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_browser(), finish_url, NEW_FOREGROUND_TAB,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->WaitForFinished();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadTestObserver* CreateDownloadObserver(size_t download_count) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new content::DownloadTestObserverTerminal(
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetCurrentManager(), download_count,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadTestObserver* CreateInProgressDownloadObserver(
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t download_count) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new content::DownloadTestObserverInProgress(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetCurrentManager(), download_count);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RunFunction(UIThreadExtensionFunction* function,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& args) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<UIThreadExtensionFunction> delete_function(function);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetUpExtensionFunction(function);
527a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool result = extension_function_test_utils::RunFunction(
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function, args, browser(), GetFlags());
529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!result) {
530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      LOG(ERROR) << function->GetError();
531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return result;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_function_test_utils::RunFunctionFlags GetFlags() {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_browser()->profile()->IsOffTheRecord() ?
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           extension_function_test_utils::INCLUDE_INCOGNITO :
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           extension_function_test_utils::NONE;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension_function_test_utils::RunFunction*() only uses browser for its
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile(), so pass it the on-record browser so that it always uses the
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on-record profile to match real-life behavior.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Value* RunFunctionAndReturnResult(
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<UIThreadExtensionFunction> function,
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& args) {
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetUpExtensionFunction(function.get());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_function_test_utils::RunFunctionAndReturnSingleResult(
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        function.get(), args, browser(), GetFlags());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string RunFunctionAndReturnError(
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<UIThreadExtensionFunction> function,
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& args) {
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetUpExtensionFunction(function.get());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_function_test_utils::RunFunctionAndReturnError(
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        function.get(), args, browser(), GetFlags());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool RunFunctionAndReturnString(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<UIThreadExtensionFunction> function,
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& args,
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string* result_string) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetUpExtensionFunction(function.get());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(result.get());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result.get() && result->GetAsString(result_string);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string DownloadItemIdAsArgList(const DownloadItem* download_item) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPrintf("[%d]", download_item->GetId());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& downloads_directory() {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return downloads_directory_.path();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadsEventsListener* events_listener() { return events_listener_.get(); }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpExtensionFunction(UIThreadExtensionFunction* function) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Recreate the tab each time for insulation.
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents* tab = chrome::AddSelectedTabWithURL(
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          current_browser(),
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_->GetResourceURL("empty.html"),
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_LINK);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function->set_extension(extension_);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      function->SetRenderViewHost(tab->GetRenderViewHost());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateAndSetDownloadsDirectory() {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_browser()->profile()->GetPrefs()->SetFilePath(
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        downloads_directory_.path());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir downloads_directory_;
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const Extension* extension_;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito_browser_;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* current_browser_;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadsEventsListener> events_listener_;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockIconExtractorImpl : public DownloadFileIconExtractor {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockIconExtractorImpl(const base::FilePath& path,
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        IconLoader::IconSize icon_size,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& response)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : expected_path_(path),
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_icon_size_(icon_size),
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        response_(response) {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockIconExtractorImpl() {}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ExtractIconURLForPath(const base::FilePath& path,
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     float scale,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     IconLoader::IconSize icon_size,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     IconURLCallback callback) OVERRIDE {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(expected_path_.value().c_str(), path.value().c_str());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_icon_size_, icon_size);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_path_ == path &&
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_icon_size_ == icon_size) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_ = callback;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::UI, FROM_HERE,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&MockIconExtractorImpl::RunCallback,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this)));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunCallback() {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_.Run(response_);
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Drop the reference on extension function to avoid memory leaks.
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    callback_ = IconURLCallback();
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath             expected_path_;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconLoader::IconSize expected_icon_size_;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string          response_;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconURLCallback      callback_;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ItemNotInProgress(DownloadItem* item) {
65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return item->GetState() != DownloadItem::IN_PROGRESS;
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels the underlying DownloadItem when the ScopedCancellingItem goes out of
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scope. Like a scoped_ptr, but for DownloadItems.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedCancellingItem {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedCancellingItem(DownloadItem* item) : item_(item) {}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedCancellingItem() {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item_->Cancel(true);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::DownloadUpdatedObserver observer(
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        item_, base::Bind(&ItemNotInProgress));
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer.WaitForEvent();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* get() { return item_; }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item_;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedCancellingItem);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels all the underlying DownloadItems when the ScopedItemVectorCanceller
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes out of scope. Generalization of ScopedCancellingItem to many
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadItems.
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedItemVectorCanceller {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedItemVectorCanceller(DownloadManager::DownloadVector* items)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : items_(items) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedItemVectorCanceller() {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DownloadManager::DownloadVector::const_iterator item = items_->begin();
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         item != items_->end(); ++item) {
68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if ((*item)->GetState() == DownloadItem::IN_PROGRESS)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*item)->Cancel(true);
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadUpdatedObserver observer(
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (*item), base::Bind(&ItemNotInProgress));
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      observer.WaitForEvent();
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector* items_;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes an HTML5 file so that it can be downloaded.
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTML5FileWriter {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
701a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static bool CreateFileForTesting(fileapi::FileSystemContext* context,
702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   const fileapi::FileSystemURL& path,
703a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   const char*data,
704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   int length) {
705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Create a temp file.
706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::FilePath temp_file;
707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!base::CreateTemporaryFile(&temp_file) ||
708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::WriteFile(temp_file, data, length) != length) {
709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Invoke the fileapi to copy it into the sandboxed filesystem.
712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool result = false;
713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::WaitableEvent done_event(true, false);
714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    BrowserThread::PostTask(
715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&CreateFileForTestingOnIOThread,
717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(context),
718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   path, temp_file,
719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(&result),
720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(&done_event)));
721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Wait for that to finish.
722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    done_event.Wait();
723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::DeleteFile(temp_file, false);
724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return result;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
728a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void CopyInCompletion(bool* result,
729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                               base::WaitableEvent* done_event,
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               base::File::Error error) {
731effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK_CURRENTLY_ON(BrowserThread::IO);
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *result = error == base::File::FILE_OK;
733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    done_event->Signal();
734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void CreateFileForTestingOnIOThread(
737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      fileapi::FileSystemContext* context,
738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const fileapi::FileSystemURL& path,
739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const base::FilePath& temp_file,
740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      bool* result,
741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::WaitableEvent* done_event) {
742effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK_CURRENTLY_ON(BrowserThread::IO);
743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    context->operation_runner()->CopyInForeignFile(
744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        temp_file, path,
745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&CopyInCompletion,
746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(result),
747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(done_event)));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Merge this with the other TestObservers.
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class JustInProgressDownloadObserver
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public content::DownloadTestObserverInProgress {
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JustInProgressDownloadObserver(
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DownloadManager* download_manager, size_t wait_count)
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : content::DownloadTestObserverInProgress(download_manager, wait_count) {
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~JustInProgressDownloadObserver() {}
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE {
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return item->GetState() == DownloadItem::IN_PROGRESS;
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver);
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ItemIsInterrupted(DownloadItem* item) {
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return item->GetState() == DownloadItem::INTERRUPTED;
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
774558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochcontent::DownloadInterruptReason InterruptReasonExtensionToContent(
7755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    downloads::InterruptReason error) {
776558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (error) {
7775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case downloads::INTERRUPT_REASON_NONE:
778558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return content::DOWNLOAD_INTERRUPT_REASON_NONE;
7795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value)      \
7805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  case downloads::INTERRUPT_REASON_##name: \
7815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return content::DOWNLOAD_INTERRUPT_REASON_##name;
782558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h"
783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON
784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  NOTREACHED();
786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return content::DOWNLOAD_INTERRUPT_REASON_NONE;
787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
788558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liudownloads::InterruptReason InterruptReasonContentToExtension(
790558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    content::DownloadInterruptReason error) {
791558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (error) {
792558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case content::DOWNLOAD_INTERRUPT_REASON_NONE:
7935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return downloads::INTERRUPT_REASON_NONE;
7945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value)             \
7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  case content::DOWNLOAD_INTERRUPT_REASON_##name: \
7965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return downloads::INTERRUPT_REASON_##name;
797558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h"
798558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON
799558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
800558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  NOTREACHED();
8015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return downloads::INTERRUPT_REASON_NONE;
802558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
803558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DownloadExtensionTest_Open) {
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
80923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DownloadsOpenFunction* open_function = new DownloadsOpenFunction();
81023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function->set_user_gesture(true);
811558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               RunFunctionAndReturnError(
81323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                   open_function,
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   "[-42]").c_str());
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* download_item = CreateSlowTestDownload();
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(download_item);
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpened());
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpenWhenComplete());
8205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
8215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
8225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
8235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
8245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
8255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
8265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
8275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_item->GetURL().spec().c_str())));
82823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function = new DownloadsOpenFunction();
82923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function->set_user_gesture(true);
830558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotComplete,
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               RunFunctionAndReturnError(
83223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                   open_function,
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   DownloadItemIdAsArgList(download_item)).c_str());
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FinishPendingSlowDownloads();
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpened());
83723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
83823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function = new DownloadsOpenFunction();
83923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_STREQ(errors::kUserGesture,
84023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               RunFunctionAndReturnError(
84123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                  open_function,
84223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                  DownloadItemIdAsArgList(download_item)).c_str());
84323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpened());
84423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
84523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function = new DownloadsOpenFunction();
84623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function->set_user_gesture(true);
84723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(RunFunction(open_function,
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(download_item->GetOpened());
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DownloadExtensionTest_PauseResumeCancelErase) {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* download_item = CreateSlowTestDownload();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(download_item);
856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string error;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call pause().  It should succeed and the download should be paused on
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return.
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_item->IsPaused());
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling removeFile on a non-active download yields kNotComplete
865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and should not crash. http://crbug.com/319984
866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsRemoveFileFunction(),
867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    DownloadItemIdAsArgList(download_item));
868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_STREQ(errors::kNotComplete, error.c_str());
869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling pause() twice shouldn't be an error.
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_item->IsPaused());
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try resuming this download.  It should succeed.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(),
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(download_item->IsPaused());
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resume again.  Resuming a download that wasn't paused is not an error.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(),
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(download_item->IsPaused());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pause again.
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_item->IsPaused());
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And now cancel.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(),
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel again.  Shouldn't have any effect.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(),
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling paused on a non-active download yields kNotInProgress.
901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  error = RunFunctionAndReturnError(
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item));
903558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotInProgress, error.c_str());
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling resume on a non-active download yields kNotResumable
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item));
908558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotResumable, error.c_str());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling pause on a non-existent download yields kInvalidId.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsPauseFunction(), "[-42]");
913558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId, error.c_str());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Calling resume on a non-existent download yields kInvalidId
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsResumeFunction(), "[-42]");
918558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId, error.c_str());
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling removeFile on a non-existent download yields kInvalidId.
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  error = RunFunctionAndReturnError(
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new DownloadsRemoveFileFunction(), "[-42]");
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_STREQ(errors::kInvalidId, error.c_str());
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int id = download_item->GetId();
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsEraseFunction(),
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d}]", id)));
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager::DownloadVector items;
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetCurrentManager()->GetAllDownloads(&items);
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0UL, items.size());
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result);
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item = NULL;
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* result_list = NULL;
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int element = -1;
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result_list->GetInteger(0, &element));
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(id, element);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<UIThreadExtensionFunction> MockedGetFileIconFunction(
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_path,
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IconLoader::IconSize icon_size,
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& response) {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DownloadsGetFileIconFunction> function(
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsGetFileIconFunction());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function->SetIconExtractorForTesting(new MockIconExtractorImpl(
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_path, icon_size, response));
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return function;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download items.
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_FileIcon_Active) {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* download_item = CreateSlowTestDownload();
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(download_item);
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(download_item->GetTargetFilePath().empty());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string args32(base::StringPrintf("[%d, {\"size\": 32}]",
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     download_item->GetId()));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result_string;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the icon for the in-progress download.  This call should succeed even
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the file type isn't registered.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test whether the correct path is being pased into the icon extractor.
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", download_item->GetId()), &result_string));
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try a 16x16 icon.
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::SMALL, "foo"),
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {\"size\": 16}]", download_item->GetId()),
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result_string));
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly asking for 32x32 should give us a 32x32 icon.
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)  // Finish the download and try again.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishPendingSlowDownloads();
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DownloadItem::COMPLETE, download_item->GetState());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32, &result_string));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the path passed to the icon extractor post-completion.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32, &result_string));
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now create another download.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_item = CreateSlowTestDownload();
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(download_item);
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(download_item->GetTargetFilePath().empty());
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  args32 = base::StringPrintf("[%d, {\"size\": 32}]", download_item->GetId());
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the download. As long as the download has a target path, we should
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be able to query the file icon.
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_item->Cancel(true);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(download_item->GetTargetFilePath().empty());
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let cleanup complete on the FILE thread.
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop(BrowserThread::FILE);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the path passed to the icon extractor post-cancellation.
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32,
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result_string));
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate an error during icon load by invoking the mock with an empty
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result string.
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error = RunFunctionAndReturnError(
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MockedGetFileIconFunction(download_item->GetTargetFilePath(),
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                IconLoader::NORMAL,
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::string()),
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32);
1019558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kIconNotFound, error.c_str());
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1021558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Once the download item is deleted, we should return kInvalidId.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = download_item->GetId();
1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  download_item->Remove();
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_item = NULL;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<DownloadItem*>(NULL),
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetCurrentManager()->GetDownload(id));
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args32);
1028558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can acquire file icons for history downloads regardless of
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether they exist or not.  If the file doesn't exist we should receive a
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generic icon from the OS/toolkit that may or may not be specific to the file
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type.
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_FileIcon_History) {
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("real.txt"),
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("fake.txt"),
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector all_downloads;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &all_downloads));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1050b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath real_path = all_downloads[0]->GetTargetFilePath();
1051b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath fake_path = all_downloads[1]->GetTargetFilePath();
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, base::WriteFile(real_path, "", 0));
10547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(real_path));
10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(fake_path));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DownloadManager::DownloadVector::iterator iter = all_downloads.begin();
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != all_downloads.end();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result_string;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use a MockIconExtractorImpl to test if the correct path is being passed
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // into the DownloadFileIconExtractor.
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
1064b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            (*iter)->GetTargetFilePath(), IconLoader::NORMAL, "hello"),
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::StringPrintf("[%d, {\"size\": 32}]", (*iter)->GetId()),
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &result_string));
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ("hello", result_string.c_str());
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test passing the empty query to search().
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_SearchEmptyQuery) {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem item(CreateSlowTestDownload());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item.get());
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{}]"));
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |filenameRegex| parameter for search().
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchFilenameRegex) {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("foobar"),
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector all_downloads;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &all_downloads));
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]"));
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item_value = NULL;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int item_id = -1;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item_value->GetInteger("id", &item_id));
11107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(all_downloads[0]->GetId(), static_cast<uint32>(item_id));
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |id| parameter for search().
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchId) {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
11207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new DownloadsSearchFunction(), base::StringPrintf(
11217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          "[{\"id\": %u}]", items[0]->GetId())));
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item_value = NULL;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int item_id = -1;
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item_value->GetInteger("id", &item_id));
11307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(items[0]->GetId(), static_cast<uint32>(item_id));
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying both the |id| and |filename| parameters for search().
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchIdAndFilename) {
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(),
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"id\": 0, \"filename\": \"foobar\"}]"));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0UL, result_list->GetSize());
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a single |orderBy| parameter for search().
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchOrderBy) {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
1165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsSearchFunction(), "[{\"orderBy\": [\"filename\"]}]"));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, result_list->GetSize());
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item0_value = NULL;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item1_value = NULL;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item0_value));
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(1, &item1_value));
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string item0_name, item1_name;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item0_value->GetString("filename", &item0_name));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item1_value->GetString("filename", &item1_name));
1177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_GT(items[0]->GetTargetFilePath().value(),
1178b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            items[1]->GetTargetFilePath().value());
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(item0_name, item1_name);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying an empty |orderBy| parameter for search().
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchOrderByEmpty) {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
1198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsSearchFunction(), "[{\"orderBy\": []}]"));
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, result_list->GetSize());
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item0_value = NULL;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item1_value = NULL;
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item0_value));
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(1, &item1_value));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string item0_name, item1_name;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item0_value->GetString("filename", &item0_name));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item1_value->GetString("filename", &item1_name));
1210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_GT(items[0]->GetTargetFilePath().value(),
1211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            items[1]->GetTargetFilePath().value());
12120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The order of results when orderBy is empty is unspecified. When there are
12130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // no sorters, DownloadQuery does not call sort(), so the order of the results
12140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // depends on the order of the items in base::hash_map<uint32,...>
12150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // DownloadManagerImpl::downloads_, which is unspecified and differs between
12160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // libc++ and libstdc++. http://crbug.com/365334
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |danger| option for search().
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchDanger) {
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]"));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |state| option for search().
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchState) {
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]"));
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |limit| option for search().
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_SearchLimit) {
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"limit\": 1}]"));
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test invalid search parameters.
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchInvalid) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error = RunFunctionAndReturnError(
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"filenameRegex\": \"(\"}]");
1279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilter,
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error.c_str());
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
1282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsSearchFunction(), "[{\"orderBy\": [\"goat\"]}]");
1283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidOrderBy,
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error.c_str());
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"limit\": -1}]");
1287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidQueryLimit,
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error.c_str());
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test searching using multiple conditions through multiple downloads.
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchPlural) {
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("aaa"),
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::CANCELLED,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{"
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"state\": \"complete\", "
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"danger\": \"content\", "
1313558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      "\"orderBy\": [\"filename\"], "
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"limit\": 1}]"));
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item_value = NULL;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType item_name;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item_value->GetString("filename", &item_name));
1323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that incognito downloads are only visible in incognito contexts, and
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that on-record downloads are visible in both incognito and on-record
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contexts, for DownloadsSearchFunction, DownloadsPauseFunction,
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadsResumeFunction, and DownloadsCancelFunction.
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchPauseResumeCancelGetFileIconIncognito) {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result_value;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* result_dict = NULL;
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType filename;
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_incognito = false;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string on_item_arg;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string off_item_arg;
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result_string;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up one on-record item and one off-record item.
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the off-record item first because otherwise there are mysteriously 3
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // items total instead of 2.
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(benjhayden): Figure out where the third item comes from.
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* off_item = CreateSlowTestDownload();
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(off_item);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  off_item_arg = DownloadItemIdAsArgList(off_item);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* on_item = CreateSlowTestDownload();
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(on_item);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  on_item_arg = DownloadItemIdAsArgList(on_item);
1355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(on_item->GetTargetFilePath() != off_item->GetTargetFilePath());
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions running in the incognito window should have access to both
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // items because the Test extension is in spanning mode.
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_value.reset(RunFunctionAndReturnResult(
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{}]"));
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value.get());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value->GetAsList(&result_list));
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, result_list->GetSize());
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetString("filename", &filename));
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
1368b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_incognito);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(1, &result_dict));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetString("filename", &filename));
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
1373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename));
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_incognito);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions running in the on-record window should have access only to the
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on-record item.
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_value.reset(RunFunctionAndReturnResult(
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{}]"));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value.get());
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value->GetAsList(&result_list));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetString("filename", &filename));
1386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_incognito);
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pausing/Resuming the off-record item while on the record should return an
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error. Cancelling "non-existent" downloads is not an error.
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg);
1393558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsResumeFunction(),
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    off_item_arg);
1397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsGetFileIconFunction(),
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", off_item->GetId()));
1402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the FileIcon test for both the on- and off-items while off the record.
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE(benjhayden): This does not include the FileIcon test from history,
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // just active downloads. This shouldn't be a problem.
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          on_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string));
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          off_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", off_item->GetId()), &result_string));
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the pause/resume/cancel test for both the on- and off-items while off
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the record.
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(on_item->IsPaused());
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(on_item->IsPaused());
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg));
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(on_item->IsPaused());
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg));
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(on_item->IsPaused());
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(on_item->IsPaused());
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg));
143090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState());
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg));
143290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState());
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsPauseFunction(), on_item_arg);
1434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotInProgress, error.c_str());
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsResumeFunction(), on_item_arg);
1436558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotResumable, error.c_str());
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(off_item->IsPaused());
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(off_item->IsPaused());
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg));
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(off_item->IsPaused());
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg));
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(off_item->IsPaused());
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(off_item->IsPaused());
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg));
144890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState());
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg));
145090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState());
1451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg);
1452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotInProgress, error.c_str());
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsResumeFunction(),
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    off_item_arg);
1455558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotResumable, error.c_str());
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download and that the correct sequence of events is
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fired for it.
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Basic) {
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
14815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
14825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
14835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
14845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
14855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
14865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
14885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
14895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
14915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
14925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
14975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
14985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
14995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
15005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
15015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download from an incognito context, and that the
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download knows that it's incognito.
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Incognito) {
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
15285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
15305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
15315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
15325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
15335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
15345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
15355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
15365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\":%d,"
15385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
15395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
15405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
15415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
15425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
15435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
15445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\":%d,"
15465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
15475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\","
15485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\"}}]",
15495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This test is very flaky on Win. http://crbug.com/248438
1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \
1555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DISABLED_DownloadExtensionTest_Download_UnsafeHeaders
1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \
1558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DownloadExtensionTest_Download_UnsafeHeaders
1559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
1560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we disallow certain headers case-insensitively.
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       MAYBE_DownloadExtensionTest_Download_UnsafeHeaders) {
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kUnsafeHeaders[] = {
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept-chArsEt",
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "accept-eNcoding",
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "coNNection",
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "coNteNt-leNgth",
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "cooKIE",
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "cOOkie2",
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "coNteNt-traNsfer-eNcodiNg",
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dAtE",
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ExpEcT",
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "hOsT",
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "kEEp-aLivE",
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rEfErEr",
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "tE",
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "trAilER",
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "trANsfer-eNcodiNg",
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "upGRAde",
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "usER-agENt",
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "viA",
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "pRoxY-",
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "sEc-",
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "pRoxY-probably-not-evil",
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "sEc-probably-not-evil",
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "oRiGiN",
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Access-Control-Request-Headers",
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Access-Control-Request-Method",
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) {
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string download_url = test_server()->GetURL("slow?0").spec();
1599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_STREQ(errors::kInvalidHeader,
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  RunFunctionAndReturnError(new DownloadsDownloadFunction(),
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            base::StringPrintf(
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "[{\"url\": \"%s\","
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  \"filename\": \"unsafe-header-%d.txt\","
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  \"headers\": [{"
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"name\": \"%s\","
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"value\": \"unsafe\"}]}]",
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        download_url.c_str(),
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<int>(index),
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUnsafeHeaders[index])).c_str());
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1613558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN)
1614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\
1615558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        DISABLED_DownloadExtensionTest_Download_Subdirectory
1616558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else
1617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\
1618558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        DownloadExtensionTest_Download_Subdirectory
1619558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
1621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       MAYBE_DownloadExtensionTest_Download_Subdirectory) {
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1628558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
1629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
1630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          "[{\"url\": \"%s\","
1631558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          "  \"filename\": \"sub/dir/ect/ory.txt\"}]",
1632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          download_url.c_str())));
1633558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(result.get());
1634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int result_id = -1;
1635558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
1636558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
1637558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(item);
1638558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ScopedCancellingItem canceller(item);
1639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
1640558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
16415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
16425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
16435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
16445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
16455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
16465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
16475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
16485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
16495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
16505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
16515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
16525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
16535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
16545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
16555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
16565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("sub/dir/ect/ory.txt").c_str())));
16575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
16585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
16595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
16605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
16615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
16625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
16635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that invalid filenames are disallowed.
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_InvalidFilename) {
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename,
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RunFunctionAndReturnError(new DownloadsDownloadFunction(),
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          base::StringPrintf(
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"../../../../../etc/passwd\"}]",
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())).c_str());
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloading invalid URLs immediately returns kInvalidURLError.
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_InvalidURLs) {
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kInvalidURLs[] = {
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo bar",
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "../hello",
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "/hello",
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://",
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "#frag",
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo/bar.html#frag",
1696558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    "google.com/",
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) {
1700558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_STREQ(errors::kInvalidURL,
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  RunFunctionAndReturnError(new DownloadsDownloadFunction(),
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            base::StringPrintf(
170358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch        "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str())
170458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      << kInvalidURLs[index];
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
170658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
17075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_STREQ("NETWORK_INVALID_REQUEST", RunFunctionAndReturnError(
1708bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new DownloadsDownloadFunction(),
1709bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str());
17105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_STREQ("NETWORK_INVALID_REQUEST", RunFunctionAndReturnError(
1711bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new DownloadsDownloadFunction(),
1712bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      "[{\"url\": \"javascript:return false;\"}]").c_str());
17135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_STREQ("NETWORK_FAILED", RunFunctionAndReturnError(
1714bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new DownloadsDownloadFunction(),
1715bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str());
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions, test downloading from ftp.
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid URLs plus fragments are still valid URLs.
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_URLFragment) {
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0#fragment").spec();
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
17425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
17445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
17455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
17465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
17475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
17485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
17495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
17505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
17525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
17535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
17545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
17555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
17565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
17575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
17585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
17605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
17615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
17625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
17635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// conflictAction may be specified without filename.
17670529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
17680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       DownloadExtensionTest_Download_ConflictAction) {
17690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static char kFilename[] = "download.txt";
17700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LoadExtension("downloads_split");
17710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string download_url = "data:text/plain,hello";
17720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GoOnTheRecord();
17730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
17740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
17750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
17760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      "[{\"url\": \"%s\"}]", download_url.c_str())));
17770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
17780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int result_id = -1;
17790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
17800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
17810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
17820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller(item);
17830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
17840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
17855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
17865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
17885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
17895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
17905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
17915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
17925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
17935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
17945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
17965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
17975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
17985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
17995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
18005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename(kFilename).c_str())));
18015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
18055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
18065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
18075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
18080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result.reset(RunFunctionAndReturnResult(
18100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
18110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          "[{\"url\": \"%s\",  \"conflictAction\": \"overwrite\"}]",
18120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          download_url.c_str())));
18130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
18140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result_id = -1;
18150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
18160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  item = GetCurrentManager()->GetDownload(result_id);
18170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
18180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller2(item);
18190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
18200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
18225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
18245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
18255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
18265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
18275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
18285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
18295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
18335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
18345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
18355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
18365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename(kFilename).c_str())));
18375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
18415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
18425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
18435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
18440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
18450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid data URLs are valid URLs.
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_DataURL) {
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = "data:text/plain,hello";
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"data.txt\"}]", download_url.c_str())));
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
18665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
18685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
18695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
18705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
18715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
18725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
18735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
18775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
18785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
18795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
18805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("data.txt").c_str())));
18815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
18855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
18865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
18875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid file URLs are valid URLs.
18915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to crbug.com/175711
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DISABLED_DownloadExtensionTest_Download_File
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DownloadExtensionTest_Download_File
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_DownloadExtensionTest_Download_File) {
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = "file:///";
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_url += "C:/";
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"file.txt\"}]", download_url.c_str())));
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
19215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
19225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"incognito\": false,"
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"mime\": \"text/html\","
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"paused\": false,"
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"url\": \"%s\"}]",
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          download_url.c_str())));
19285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
19295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
19305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"filename\": {"
1932b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id,
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetFilename("file.txt").c_str())));
19365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
19375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
19385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
1942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that auth-basic-succeed would fail if the resource requires the
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authorization header and chrome fails to propagate it back to the server.
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests both that testserver.py does not succeed when it should fail as
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well as how the downloads extension API exposes the failure to extensions.
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_AuthBasic_Fail) {
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("auth-basic").spec();
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"auth-basic-fail.txt\"}]",
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1970558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
1971558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
1972558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED,
1973558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
1974558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
1975558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"text/html\","
1976558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
1977558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
1978558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates |headers| to the URLRequest.
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Headers) {
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/downloads/"
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec();
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"headers-succeed.txt\","
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"headers\": ["
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\"name\": \"Foo\", \"value\": \"bar\"},"
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\"name\": \"Qx\", \"value\":\"yo\"}]}]",
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
20085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
20095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
20105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
20115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
20125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
20135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
20145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
20155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
20165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
20175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
20185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
20195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
20205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
20215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
20225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("headers-succeed.txt").c_str())));
20235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
20245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
20255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
20265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
20275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
20285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
20295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that headers-succeed would fail if the resource requires the headers and
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome fails to propagate them back to the server.  This tests both that
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testserver.py does not succeed when it should fail as well as how the
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloads extension api exposes the failure to extensions.
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Headers_Fail) {
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2039eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2040eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/downloads/"
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec();
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"headers-fail.txt\"}]",
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2058558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
2059558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
2060558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
2061558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
2062558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
20635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         "  \"bytesReceived\": 0.0,"
20645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         "  \"fileSize\": 0.0,"
2065558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"\","
2066558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
2067558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
2068558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the Authorization header
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly.
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_AuthBasic) {
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("auth-basic").spec();
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is just base64 of 'username:secret'.
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0";
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"auth-basic-succeed.txt\","
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"headers\": [{"
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"name\": \"Authorization\","
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"value\": \"Basic %s\"}]}]",
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str(), kAuthorization)));
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
21005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
21025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
21035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"bytesReceived\": 0.0,"
21045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"fileSize\": 0.0,"
21055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/html\","
21065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
21075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
21085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
21095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
21105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
21125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
21135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
21145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
21155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the |method| and |body|
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters to the URLRequest.
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Post) {
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/post/downloads/"
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_body=BODY").spec();
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"post-succeed.txt\","
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"method\": \"POST\","
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"body\": \"BODY\"}]",
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
21455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
21475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
21485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
21495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
21505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
21515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
21525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
21535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
21555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
21565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
21575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
21585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
21595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("post-succeed.txt").c_str())));
21605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
21615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
21635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
21645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
21655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
21665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |method| parameter back to the
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions.
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Post_Get) {
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/post/downloads/"
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_body=BODY").spec();
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"body\": \"BODY\","
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"post-get.txt\"}]",
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
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)
2197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
2198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
2199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
2200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
2201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
2202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"\","
2203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
2204558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"id\": %d,"
2205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
2206558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         result_id,
2207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |body| parameter back to the
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions.
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Post_NoBody) {
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/post/downloads/"
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_body=BODY").spec();
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"method\": \"POST\","
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"post-nobody.txt\"}]",
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
2239558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
2240558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
2241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
2242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
2243558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"\","
2244558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
2245558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"id\": %d,"
2246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
2247558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         result_id,
2248558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cancel()ing an in-progress download causes its state to transition
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to interrupted, and test that that state transition is detectable by an
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// onChanged event listener.  TODO(benjhayden): Test other sources of
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interruptions such as server death.
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Cancel) {
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL(
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "download-known-size").spec();
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
22765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
22775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"incognito\": false,"
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"mime\": \"application/octet-stream\","
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"paused\": false,"
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"id\": %d,"
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"url\": \"%s\"}]",
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id,
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          download_url.c_str())));
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item->Cancel(true);
22865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
22875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
22885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
2289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                          "  \"error\": {\"current\":\"USER_CANCELED\"},"
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"state\": {"
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "    \"previous\": \"in_progress\","
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "    \"current\": \"interrupted\"}}]",
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id)));
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloading filesystem: URLs.
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: chrome disallows creating HTML5 FileSystem Files in incognito.
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_FileSystemURL) {
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kPayloadData = "on the record\ndata";
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string download_url = "filesystem:" + GetExtensionURL() +
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "temporary/on_record.txt";
2306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Setup a file in the filesystem which we can download.
2308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(HTML5FileWriter::CreateFileForTesting(
2309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      BrowserContext::GetDefaultStoragePartition(browser()->profile())->
2310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          GetFileSystemContext(),
2311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      fileapi::FileSystemURL::CreateForTest(GURL(download_url)),
2312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kPayloadData, strlen(kPayloadData)));
2313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Now download it.
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
23285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"incognito\": false,"
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"mime\": \"text/plain\","
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"paused\": false,"
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"url\": \"%s\"}]",
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          download_url.c_str())));
23355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
23365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"filename\": {"
2339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
2340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id,
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetFilename("on_record.txt").c_str())));
23435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
23445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
2348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string disk_data;
235158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(base::ReadFileToString(item->GetTargetFilePath(), &disk_data));
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(kPayloadData, disk_data.c_str());
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
2356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       DownloadExtensionTest_OnDeterminingFilename_NoChange) {
23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
23775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
23785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
23875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
23885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
23905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
23915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
239390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
24035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
24085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
24095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
24105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
24115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
24125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
24135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
24145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
24155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
24165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
24175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
24185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
24195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
24205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
24215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
24225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Disabled due to cross-platform flakes; http://crbug.com/370531.
2426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
2427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DownloadExtensionTest,
2428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DISABLED_DownloadExtensionTest_OnDeterminingFilename_Timeout) {
2429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GoOnTheRecord();
2430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadExtension("downloads_split");
2431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddFilenameDeterminer();
2432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
2433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
2434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
2435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ExtensionDownloadsEventRouter::SetDetermineFilenameTimeoutSecondsForTesting(
2437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      0);
2438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Start downloading a file.
2440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
2441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
2442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
2443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result.get());
2444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int result_id = -1;
2445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
2446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
2447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item);
2448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedCancellingItem canceller(item);
2449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
2450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
2452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
2453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"danger\": \"safe\","
2454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"incognito\": false,"
2455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"id\": %d,"
2456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
2457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"paused\": false,"
2458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
2459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          result_id,
2460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          download_url.c_str())));
2461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(
2462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::OnDeterminingFilename::kEventName,
2463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\":\"slow.txt\"}]",
2465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
2467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
2468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Do not respond to the onDeterminingFilename.
2470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The download should complete successfully.
2472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\": {"
2475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"\","
2476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"%s\"}}]",
2477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id,
2478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GetFilename("slow.txt").c_str())));
2479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"state\": {"
2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"in_progress\","
2483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"complete\"}}]",
2484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
2488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       DownloadExtensionTest_OnDeterminingFilename_Twice) {
2489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GoOnTheRecord();
2490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadExtension("downloads_split");
2491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddFilenameDeterminer();
2492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
2493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
2494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
2495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Start downloading a file.
2497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
2498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
2499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
2500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result.get());
2501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int result_id = -1;
2502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
2503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
2504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item);
2505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedCancellingItem canceller(item);
2506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
2507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
2509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
2510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"danger\": \"safe\","
2511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"incognito\": false,"
2512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"id\": %d,"
2513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
2514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"paused\": false,"
2515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
2516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          result_id,
2517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          download_url.c_str())));
2518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(
2519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::OnDeterminingFilename::kEventName,
2520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\":\"slow.txt\"}]",
2522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
2525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Respond to the onDeterminingFilename.
2527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string error;
2528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
2529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      browser()->profile(),
2530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      false,
2531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetExtensionId(),
2532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      result_id,
2533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FilePath(),
2534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
2535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &error));
2536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ("", error);
2537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Calling DetermineFilename again should return an error instead of calling
2539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // DownloadTargetDeterminer.
2540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
2541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      browser()->profile(),
2542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      false,
2543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetExtensionId(),
2544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      result_id,
2545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("different")),
2546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
2547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &error));
2548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(errors::kTooManyListeners, error);
2549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The download should complete successfully.
2551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\": {"
2554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"\","
2555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"%s\"}}]",
2556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id,
2557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GetFilename("slow.txt").c_str())));
2558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"state\": {"
2561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"in_progress\","
2562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"complete\"}}]",
2563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) {
25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
25895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
25905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"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())));
25985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
25995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
26025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
260490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
26132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("overridden.swf")),
26145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"danger\": {"
26225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"safe\","
26235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"file\"}}]",
26245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  item->ValidateDangerousDownload();
26275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"danger\": {"
26315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"file\","
26325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"accepted\"}}]",
26335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"state\": {"
26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(downloads_directory().AppendASCII("overridden.swf"),
2642b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            item->GetTargetFilePath());
26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_ReferencesParentInvalid) {
26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
26542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
26592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
26685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
26732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
26775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
26785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
26815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
268390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
26842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
26902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("sneaky/../../sneaky.txt")),
26935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2695558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
26965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"filename\": {"
2700b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
2701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GetFilename("slow.txt").c_str())));
27045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
2707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
2708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
2709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
2710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IllegalFilename) {
27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
27222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
27242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
27365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
27455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
27465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
27495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
275190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
27552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
2760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("<")),
27615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2763558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
27645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
27685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
27695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
27705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
27715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
27725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
27765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
27775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
27785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IllegalFilenameExtension) {
27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
27992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
28002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
28012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
28045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
28135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
28145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
28175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
281990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
2828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL(
2829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}/foo")),
28305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
28312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2832558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
28335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
28345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
28375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
28385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
28395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
28405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
28415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
28425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
28455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
28465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
28475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
28504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\
28514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISABLED_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename
28524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
28534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\
28544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DownloadExtensionTest_OnDeterminingFilename_ReservedFilename
28554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
28584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename) {
28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
28602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
28795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
28885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
28895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
28925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
289490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
28952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename.
28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
28982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
28992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
29002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
29012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
29022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
2903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("con.foo")),
29045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
29052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2906558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
29075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
29085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
29115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
29125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
29135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
29145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
29155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
29165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
29195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
29205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
29215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
2922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
2925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest,
2926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_CurDirInvalid) {
2927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GoOnTheRecord();
2928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
2929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddFilenameDeterminer();
2930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
2932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
2933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start downloading a file.
2935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
2936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
2937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
2938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result.get());
2939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result_id = -1;
2940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
2941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
2942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item);
2943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedCancellingItem canceller(item);
2944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
2945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
29475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
2949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"incognito\": false,"
2950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"id\": %d,"
2951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
2952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"paused\": false,"
2953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
2954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id,
2955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          download_url.c_str())));
29565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
29575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
29605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
2961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
296290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename.
2965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
2966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
2967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(),
2968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
2969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetExtensionId(),
2970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_id,
2971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL(".")),
29725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
2973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &error));
2974558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
29755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
29765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
29795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
29805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
29815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
29825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
29835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
29845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
29875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
29885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
29895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
2990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
2993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest,
2994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_ParentDirInvalid) {
2995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GoOnTheRecord();
2998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
2999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddFilenameDeterminer();
3000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
3001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start downloading a file.
3003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
3004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
3005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
3006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result.get());
3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result_id = -1;
3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
3009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
3010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item);
3011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedCancellingItem canceller(item);
3012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
3013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
30155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
3017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"incognito\": false,"
3018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"id\": %d,"
3019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
3020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"paused\": false,"
3021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          download_url.c_str())));
30245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
30255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
30285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
303090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
3031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename.
3033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
3034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(),
3036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
3037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetExtensionId(),
3038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_id,
3039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("..")),
30405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
3041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &error));
3042558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
30435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
30445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
30475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
30485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
30495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
30505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
30515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
30525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
30555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
30565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
30575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
3062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_AbsPathInvalid) {
30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
3066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
30732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
30742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
30752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
30762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
30772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
30802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
30835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
30872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
30882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
30892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
30912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
30925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
30935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
30965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
30972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
309890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
30992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename. Absolute paths should be rejected.
31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
3107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      downloads_directory().Append(FILE_PATH_LITERAL("sneaky.txt")),
31085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
3110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
31135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"filename\": {"
3116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
3117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
31192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GetFilename("slow.txt").c_str())));
31205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
31215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
3123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
3124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
3125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
3126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
3131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_EmptyBasenameInvalid) {
31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
3135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
31382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
31525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
31615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
31625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
31655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
31662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
316790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
31682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename. Empty basenames should be rejected.
3170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
3171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
3172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(),
3173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
3174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetExtensionId(),
3175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_id,
3176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("foo/")),
31775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
3178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &error));
3179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
3180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
31825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
31855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
31865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
31875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
31885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
31895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
31905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
31935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
31945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
31955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
31960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
31970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
31980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// conflictAction may be specified without filename.
31990529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(
32000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DownloadExtensionTest,
32010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DownloadExtensionTest_OnDeterminingFilename_Overwrite) {
32020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GoOnTheRecord();
32030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LoadExtension("downloads_split");
32040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  AddFilenameDeterminer();
32050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
32060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(test_server()->Start());
32070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string download_url = test_server()->GetURL("slow?0").spec();
32080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Start downloading a file.
32100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
32110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
32120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          "[{\"url\": \"%s\"}]", download_url.c_str())));
32130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
32140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int result_id = -1;
32150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
32160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
32170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
32180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller(item);
32190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
32205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
32215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
32235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
32245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
32255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
32265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
32275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
32285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
32295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
32305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
32315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
32345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
32350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item->GetTargetFilePath().empty());
32360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
32370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Respond to the onDeterminingFilename.
32390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string error;
32400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
32410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      browser()->profile(),
32420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false,
32430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetExtensionId(),
32440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id,
32450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::FilePath(),
32465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
32470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      &error));
32480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ("", error);
32490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
32515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
32545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
32555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
32565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
32575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
32585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
32595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
32625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
32635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
32645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
32650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Start downloading a file.
32670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result.reset(RunFunctionAndReturnResult(
32680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
32690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          "[{\"url\": \"%s\"}]", download_url.c_str())));
32700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
32710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result_id = -1;
32720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
32730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  item = GetCurrentManager()->GetDownload(result_id);
32740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
32750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller2(item);
32760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
32770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
32795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
32815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
32825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
32835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
32845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
32855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
32865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
32875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
32885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
32895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
32925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
32930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item->GetTargetFilePath().empty());
32940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
32950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Respond to the onDeterminingFilename.
32970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Also test that DetermineFilename allows (chrome) extensions to set
32980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // filenames without (filename) extensions. (Don't ask about v8 extensions or
32990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // python extensions or kernel extensions or firefox extensions...)
33000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  error = "";
33010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
33020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      browser()->profile(),
33030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false,
33040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetExtensionId(),
33050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id,
33060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::FilePath(),
33075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
33080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      &error));
33090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ("", error);
33100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
33115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
33125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
33155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
33165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
33175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
33185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
33195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
33205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
33235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
33245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
33255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
3329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest,
3330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_Override) {
3331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GoOnTheRecord();
3332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
3333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddFilenameDeterminer();
3334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
3336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
3337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start downloading a file.
3339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
3340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
3341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
3342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result.get());
3343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result_id = -1;
3344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
3345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
3346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item);
3347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedCancellingItem canceller(item);
3348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
33495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
33505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
33525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
33535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
33545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
33555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
33565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
33575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
33585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
33595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
33605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
33635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
336590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
3366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
33702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
33712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
33722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
33732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
33742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
33755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
33762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
33782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
33805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
33835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
33845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
33855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
33865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
33875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
33885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
33915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
33925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
33935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reset(RunFunctionAndReturnResult(
33972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
33982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
33992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
34002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_id = -1;
34012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
34022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item = GetCurrentManager()->GetDownload(result_id);
34032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
34042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller2(item);
34052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
34062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
34085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
34105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
34115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
34125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
34135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
34145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
34155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
34165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
34175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
34185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
34215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
34222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
342390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
34262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also test that DetermineFilename allows (chrome) extensions to set
34272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // filenames without (filename) extensions. (Don't ask about v8 extensions or
34282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // python extensions or kernel extensions or firefox extensions...)
34292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error = "";
34302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
34312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
34332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
34342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
34352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("foo")),
34365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
34372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
34382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
34392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
34415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
34445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
34455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
34465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
34475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("foo").c_str())));
34485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
34495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
34525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
34535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
34545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
34552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO test precedence rules: install_time
34582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer) {
3462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
34662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderProcessHost* host = AddFilenameDeterminer();
34672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
34682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
34702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
34712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
34722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
34732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
34742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
34752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
34762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
34792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
34802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
34825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
34842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
34872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
34882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
34892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
34915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
34925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
34955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
349790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove a determiner while waiting for it.
35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveFilenameDeterminer(host);
35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
35035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
35065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
35075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
35085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IncognitoSplit) {
35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
3515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOffTheRecord();
35232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
35242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an on-record download.
35262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
35272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
35282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
35302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
35332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
35342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
35352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
35362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
35372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
35395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
35405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
35422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
35432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
35442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
35452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
35462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
35472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
35482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
35495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
35505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
35535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
35545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
35552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
355690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
35572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename events.
35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
35622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
35632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
35642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
35652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
35665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
35672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
35715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
35725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
35755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
35765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
35775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
35785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42.txt").c_str())));
35795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
35805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
35835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
35845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
35855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an incognito download for comparison.
35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOffTheRecord();
35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reset(RunFunctionAndReturnResult(
35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_id = -1;
35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item = GetCurrentManager()->GetDownload(result_id);
35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller2(item);
35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
36015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
36035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
36045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
36055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
36065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
36075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
36085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
36095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // On-Record renderers should not see events for off-record items.
36115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
36125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
36155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
36165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
36172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
361890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
36192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
36212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error = "";
36222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
36232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
36242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
36252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
36262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
36272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("5.txt")),
36285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
36292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
36302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
36312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
36335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
36345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
36375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
36385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
36395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
36405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("5.txt").c_str())));
36415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
36425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
36455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
36465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
36475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
36482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
36492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
36512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
36522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IncognitoSpanning) {
36532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_spanning");
3654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
36562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
36572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
36592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
36602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There is a single extension renderer that sees both on-record and
36622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // off-record events. The extension functions see the on-record profile with
36632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // include_incognito=true.
36642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an on-record download.
36662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
36672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
36682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
36692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
36702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
36712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
36722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
36732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
36742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
36752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
36762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
36772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
36795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
36805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
36822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
36832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
36842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
36852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
36862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
36872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
36882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
36895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
36905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
36935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
36945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
36952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
369690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
36972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename events.
36992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
37002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
37012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
37022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true,
37032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
37042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
37052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
37065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
37072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
37082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
37092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
37115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
37125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
37155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
37165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
37175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
37185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42.txt").c_str())));
37195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
37205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
37235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
37245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
37255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
37262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an incognito download for comparison.
37282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOffTheRecord();
37292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reset(RunFunctionAndReturnResult(
37302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
37312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
37322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
37332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_id = -1;
37342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
37352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item = GetCurrentManager()->GetDownload(result_id);
37362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
37372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller2(item);
37382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
37392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
37415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
37435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
37445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
37455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
37465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
37475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
37485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
37495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
37505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
37515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
37545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
37555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
37562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
375790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
37582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error = "";
37612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
37622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
37632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true,
37642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
37652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
37662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
37675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
37682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
37692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
37702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
37725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
37735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
37765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
37775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
37785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
37795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42 (1).txt").c_str())));
37805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
37815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
37845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
37855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
37865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
37872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
37882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37895e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#if defined(OS_WIN)
37905e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)// This test is very flaky on Win XP and Aura. http://crbug.com/248438
37915e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
37925e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
37935e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#else
37945e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
37955e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
37965e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#endif
37975e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
3798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test download interruption while extensions determining filename. Should not
3799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// re-dispatch onDeterminingFilename.
38002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
38012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
38025e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) {
3803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
3804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      switches::kEnableDownloadResumption);
38052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
3806eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
38082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
3809a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::RenderProcessHost* host = AddFilenameDeterminer();
38102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start a download.
3812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = NULL;
3813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
3814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadManager* manager = GetCurrentManager();
3815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<content::DownloadTestObserver> observer(
3816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new JustInProgressDownloadObserver(manager, 1));
3817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(0, manager->InProgressCount());
38188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_EQ(0, manager->NonMaliciousInProgressCount());
3819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Tabs created just for a download are automatically closed, invalidating
3820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the download's WebContents. Downloads without WebContents cannot be
3821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // resumed. http://crbug.com/225901
3822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
3823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        current_browser(),
3824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl),
3825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CURRENT_TAB,
3826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ui_test_utils::BROWSER_TEST_NONE);
3827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer->WaitForFinished();
3828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
3829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadManager::DownloadVector items;
3830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    manager->GetAllDownloads(&items);
3831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (DownloadManager::DownloadVector::iterator iter = items.begin();
3832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          iter != items.end(); ++iter) {
3833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
3834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // There should be only one IN_PROGRESS item.
3835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(NULL, item);
3836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        item = *iter;
3837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
3838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
3839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(item);
3840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
38412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
38422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename event.
38445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
38455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
38475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
38485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
38495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
38505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false}]",
38515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
38525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
38535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
38555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
38565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"download-unknown-size\"}]",
38575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
38582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
385990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
38602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearEvents();
3862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
3863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      current_browser(),
3864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl),
3865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NEW_BACKGROUND_TAB,
3866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
38672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Errors caught before filename determination are delayed until after
3869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // filename determination.
38702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
38712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
38722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
38732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
38742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
3875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      item->GetId(),
38762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
38775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
38785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &error))
38795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      << error;
38802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
38815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
38825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
38845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
38855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
38865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
38875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId(),
38885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42.txt").c_str())));
38892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::DownloadUpdatedObserver interrupted(item, base::Bind(
3891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ItemIsInterrupted));
3892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(interrupted.WaitForEvent());
38935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
38945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
38965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"error\":{\"current\":\"NETWORK_FAILED\"},"
38975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\":{"
38985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"in_progress\","
38995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"interrupted\"}}]",
39005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
3901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearEvents();
3903a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Downloads that are restarted on resumption trigger another download target
3904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // determination.
3905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RemoveFilenameDeterminer(host);
3906a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  item->Resume();
3907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Errors caught before filename determination is complete are delayed until
3909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // after filename determination so that, on resumption, filename determination
3910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // does not need to be re-done. So, there will not be a second
3911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onDeterminingFilename event.
3912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
39165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"error\":{\"previous\":\"NETWORK_FAILED\"},"
39175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\":{"
39185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"interrupted\","
39195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"in_progress\"}}]",
39205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
3921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearEvents();
3923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FinishPendingSlowDownloads();
3924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
39265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
39295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
39305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
39315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
39325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
39332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
39342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3935a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
3936a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                       DownloadExtensionTest_SetShelfEnabled) {
3937a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  LoadExtension("downloads_split");
3938a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[false]"));
3939a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(DownloadServiceFactory::GetForBrowserContext(
3940a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      browser()->profile())->IsShelfEnabled());
3941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[true]"));
3942a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(DownloadServiceFactory::GetForBrowserContext(
3943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      browser()->profile())->IsShelfEnabled());
3944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test that existing shelves are hidden.
3945a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test multiple extensions.
3946a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test disabling extensions.
3947a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test that browsers associated with other profiles are not
3948a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // affected.
3949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test incognito.
3950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benjhayden) Figure out why DisableExtension() does not fire
39532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnListenerRemoved.
3954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Test that the shelf is shown for download() both with and
3956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// without a WebContents.
3957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3958424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OnDangerPromptCreated(DownloadDangerPrompt* prompt) {
3959424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  prompt->InvokeActionForTesting(DownloadDangerPrompt::ACCEPT);
3960424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
3961424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
39625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
39635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Flakily triggers and assert on Mac.
39645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// http://crbug.com/180759
39655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_AcceptDanger DownloadExtensionTest_AcceptDanger
39665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
39675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_AcceptDanger DISABLED_DownloadExtensionTest_AcceptDanger
39685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
3969424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
39705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       MAYBE_DownloadExtensionTest_AcceptDanger) {
3971424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Download a file that will be marked dangerous; click the browser action
3972424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // button; the browser action poup will call acceptDanger(); when the
3973424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // DownloadDangerPrompt is created, pretend that the user clicks the Accept
3974424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // button; wait until the download completes.
3975424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LoadExtension("downloads_split");
3976424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
3977424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      new DownloadsDownloadFunction(),
3978424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[{\"url\": \"data:,\", \"filename\": \"dangerous.swf\"}]"));
3979424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(result.get());
3980424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int result_id = -1;
3981424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
3982424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
3983424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(item);
39845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d, "
39875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"danger\": {"
39885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"safe\","
39895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"file\"}}]",
39905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3991424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(item->IsDangerous());
3992424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ScopedCancellingItem canceller(item);
3993424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<content::DownloadTestObserver> observer(
3994424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      new content::DownloadTestObserverTerminal(
3995424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          GetCurrentManager(), 1,
3996424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE));
3997424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DownloadsAcceptDangerFunction::OnPromptCreatedCallback callback =
3998424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&OnDangerPromptCreated);
3999424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DownloadsAcceptDangerFunction::OnPromptCreatedForTesting(
4000424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      &callback);
4001424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  BrowserActionTestUtil(browser()).Press(0);
4002424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  observer->WaitForFinished();
4003424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
4004424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadsApiTest : public ExtensionApiTest {
4006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
4007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadsApiTest() {}
4008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~DownloadsApiTest() {}
4009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
4010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadsApiTest);
4011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
4012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) {
4015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("downloads")) << message_;
4016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4017558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4018558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST(DownloadInterruptReasonEnumsSynced,
4019558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch     DownloadInterruptReasonEnumsSynced) {
40205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value)                                        \
40215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(InterruptReasonContentToExtension(                               \
40225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                content::DOWNLOAD_INTERRUPT_REASON_##name),                  \
40235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            downloads::INTERRUPT_REASON_##name);                             \
40245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(                                                                 \
40255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      InterruptReasonExtensionToContent(downloads::INTERRUPT_REASON_##name), \
4026558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_##name);
4027558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h"
4028558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON
4029558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
4030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(ExtensionDetermineDownloadFilenameInternal,
4032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch     ExtensionDetermineDownloadFilenameInternal) {
4033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string winner_id;
4034ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::FilePath filename;
40355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  downloads::FilenameConflictAction conflict_action =
40365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY;
4037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionWarningSet warnings;
4038ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4039ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Empty incumbent determiner
4040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  warnings.clear();
4041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExtensionDownloadsEventRouter::DetermineFilenameInternal(
4042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("a")),
40435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
4044ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "suggester",
4045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now(),
4046ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "",
4047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time(),
4048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &winner_id,
4049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &filename,
4050ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &conflict_action,
4051ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &warnings);
4052ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("suggester", winner_id);
4053ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value());
40545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action);
4055ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(warnings.empty());
4056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Incumbent wins
4058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  warnings.clear();
4059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExtensionDownloadsEventRouter::DetermineFilenameInternal(
4060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("b")),
40615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_PROMPT,
4062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "suggester",
4063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - base::TimeDelta::FromDays(1),
4064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "incumbent",
4065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now(),
4066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &winner_id,
4067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &filename,
4068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &conflict_action,
4069ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &warnings);
4070ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("incumbent", winner_id);
4071ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value());
40725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action);
4073ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(warnings.empty());
4074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ExtensionWarning::kDownloadFilenameConflict,
4075ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            warnings.begin()->warning_type());
4076ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("suggester", warnings.begin()->extension_id());
4077ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4078ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Suggester wins
4079ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  warnings.clear();
4080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExtensionDownloadsEventRouter::DetermineFilenameInternal(
4081ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("b")),
40825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_PROMPT,
4083ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "suggester",
4084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now(),
4085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "incumbent",
4086ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - base::TimeDelta::FromDays(1),
4087ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &winner_id,
4088ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &filename,
4089ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &conflict_action,
4090ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &warnings);
4091ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("suggester", winner_id);
4092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(FILE_PATH_LITERAL("b"), filename.value());
40935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_PROMPT, conflict_action);
4094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(warnings.empty());
4095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ExtensionWarning::kDownloadFilenameConflict,
4096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            warnings.begin()->warning_type());
4097ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("incumbent", warnings.begin()->extension_id());
4098ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
4099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
41005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace extensions
41015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // http://crbug.com/3061144
4103