downloads_api_browsertest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_file_icon_extractor.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_test_file_activity_observer.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/downloads/downloads_api.h"
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_slow_download_job.h"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/event_router.h"
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.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) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    registrar_.Add(this,
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadsEventsListener() {
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    registrar_.Remove(this,
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      content::NotificationService::AllSources());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&events_);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ClearEvents() {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    STLDeleteElements(&events_);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    events_.clear();
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Event {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Event(Profile* profile,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const std::string& event_name,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const std::string& json_args,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Time caught)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : profile_(profile),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event_name_(event_name),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        json_args_(json_args),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        args_(base::JSONReader::Read(json_args)),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        caught_(caught) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& caught() { return caught_; }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool Satisfies(const Event& other) const {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return other.SatisfiedBy(*this);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool SatisfiedBy(const Event& other) const {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((profile_ != other.profile_) ||
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (event_name_ != other.event_name_))
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (((event_name_ == downloads::OnDeterminingFilename::kEventName) ||
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu           (event_name_ == downloads::OnCreated::kEventName) ||
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu           (event_name_ == downloads::OnChanged::kEventName)) &&
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          args_.get() && other.args_.get()) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::ListValue* left_list = NULL;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::DictionaryValue* left_dict = NULL;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::ListValue* right_list = NULL;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::DictionaryValue* right_dict = NULL;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!args_->GetAsList(&left_list) ||
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            !other.args_->GetAsList(&right_list) ||
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            !left_list->GetDictionary(0, &left_dict) ||
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            !right_list->GetDictionary(0, &right_dict))
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (base::DictionaryValue::Iterator iter(*left_dict);
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             !iter.IsAtEnd(); iter.Advance()) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Value* right_value = NULL;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (!right_dict->HasKey(iter.key()) ||
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              (right_dict->Get(iter.key(), &right_value) &&
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               !iter.value().Equals(right_value))) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      } else if ((event_name_ == downloads::OnErased::kEventName) &&
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 args_.get() && other.args_.get()) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int my_id = -1, other_id = -1;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (args_->GetAsInteger(&my_id) &&
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                other.args_->GetAsInteger(&other_id) &&
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                my_id == other_id);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return json_args_ == other.json_args_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string Debug() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::StringPrintf("Event(%p, %s, %s, %f)",
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                profile_,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                event_name_.c_str(),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                json_args_.c_str(),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                caught_.ToJsTime());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string event_name_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string json_args_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Value> args_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time caught_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Event);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadsNotificationSource;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationSource& source,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT: {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadsNotificationSource* dns =
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::Source<DownloadsNotificationSource>(source).ptr();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Event* new_event = new Event(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              dns->profile,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              dns->event_name,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              *content::Details<std::string>(details).ptr(), base::Time::Now());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          events_.push_back(new_event);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (waiting_ &&
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              waiting_for_.get() &&
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              new_event->Satisfies(*waiting_for_)) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            waiting_ = false;
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            base::MessageLoopForUI::current()->Quit();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitFor(Profile* profile,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& event_name,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& json_args) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_.reset(new Event(profile, event_name, json_args, base::Time()));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::deque<Event*>::const_iterator iter = events_.begin();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != events_.end(); ++iter) {
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if ((*iter)->Satisfies(*waiting_for_.get())) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = true;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = !waiting_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Print the events that were caught since the last WaitFor() call to help
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // find the erroneous event.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(benjhayden) Fuzzy-match and highlight the erroneous event.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (std::deque<Event*>::const_iterator iter = events_.begin();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          iter != events_.end(); ++iter) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((*iter)->caught() > last_wait_) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          LOG(INFO) << "Caught " << (*iter)->Debug();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (waiting_for_.get()) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(INFO) << "Timed out waiting for " << waiting_for_->Debug();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_.reset();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_wait_ = base::Time::Now();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return success;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_wait_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Event> waiting_for_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<Event*> events_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadExtensionTest : public ExtensionApiTest {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadExtensionTest()
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : extension_(NULL),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incognito_browser_(NULL),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_browser_(NULL) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used with CreateHistoryDownloads
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct HistoryDownloadInfo {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Filename to use. CreateHistoryDownloads will append this filename to the
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // temporary downloads directory specified by downloads_directory().
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType*   filename;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // State for the download. Note that IN_PROGRESS downloads will be created
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as CANCELLED.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem::DownloadState state;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::DownloadDangerType danger_type;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadExtension(const char* name) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store the created Extension object so that we can attach it to
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ExtensionFunctions.  Also load the extension in incognito profiles for
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // testing incognito.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_ = LoadExtensionIncognito(test_data_dir_.AppendASCII(name));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(extension_);
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* tab = chrome::AddSelectedTabWithURL(
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        current_browser(),
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extension_->GetResourceURL("empty.html"),
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::PAGE_TRANSITION_LINK);
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnCreated::kEventName,
2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           tab->GetRenderProcessHost(),
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           GetExtensionId());
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnChanged::kEventName,
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           tab->GetRenderProcessHost(),
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           GetExtensionId());
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnErased::kEventName,
2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           tab->GetRenderProcessHost(),
2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           GetExtensionId());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderProcessHost* AddFilenameDeterminer() {
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ExtensionDownloadsEventRouter::SetDetermineFilenameTimeoutSecondsForTesting(
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        2);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* tab = chrome::AddSelectedTabWithURL(
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        current_browser(),
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_->GetResourceURL("empty.html"),
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::PAGE_TRANSITION_LINK);
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        ->AddEventListener(downloads::OnDeterminingFilename::kEventName,
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           tab->GetRenderProcessHost(),
3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           GetExtensionId());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return tab->GetRenderProcessHost();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveFilenameDeterminer(content::RenderProcessHost* host) {
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EventRouter::Get(current_browser()->profile())->RemoveEventListener(
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        downloads::OnDeterminingFilename::kEventName, host, GetExtensionId());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* current_browser() { return current_browser_; }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InProcessBrowserTest
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionApiTest::SetUpOnMainThread();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUpOnMainThread();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoOnTheRecord();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateAndSetDownloadsDirectory();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_browser()->profile()->GetPrefs()->SetBoolean(
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kPromptForDownload, false);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetOnRecordManager()->RemoveAllDownloads();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    events_listener_.reset(new DownloadsEventsListener());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Disable file chooser for current profile.
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadTestFileActivityObserver observer(current_browser()->profile());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.EnableFileChooser(false);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GoOnTheRecord() { current_browser_ = browser(); }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GoOffTheRecord() {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!incognito_browser_) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incognito_browser_ = CreateIncognitoBrowser();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetOffRecordManager()->RemoveAllDownloads();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Disable file chooser for incognito profile.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadTestFileActivityObserver observer(incognito_browser_->profile());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer.EnableFileChooser(false);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_browser_ = incognito_browser_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitFor(const std::string& event_name, const std::string& json_args) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return events_listener_->WaitFor(
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_browser()->profile(), event_name, json_args);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  bool WaitForInterruption(
351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      DownloadItem* item,
352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DownloadInterruptReason expected_error,
353558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      const std::string& on_created_event) {
3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!WaitFor(downloads::OnCreated::kEventName, on_created_event))
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now, onCreated is always fired before interruption.
3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return WaitFor(
3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        downloads::OnChanged::kEventName,
3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::StringPrintf(
3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "[{\"id\": %d,"
3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "  \"error\": {\"current\": \"%s\"},"
3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "  \"state\": {"
3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "    \"previous\": \"in_progress\","
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            "    \"current\": \"interrupted\"}}]",
3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            item->GetId(),
3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            content::DownloadInterruptReasonToString(expected_error).c_str()));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ClearEvents() {
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    events_listener_->ClearEvents();
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetExtensionURL() {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_->url().spec();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetExtensionId() {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return extension_->id();
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetFilename(const char* path) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result =
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::string::size_type next = result.find("\\");
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         next != std::string::npos;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         next = result.find("\\", next)) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.replace(next, 1, "\\\\");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next += 2;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetOnRecordManager() {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BrowserContext::GetDownloadManager(browser()->profile());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetOffRecordManager() {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BrowserContext::GetDownloadManager(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser()->profile()->GetOffTheRecordProfile());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetCurrentManager() {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (current_browser_ == incognito_browser_) ?
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetOffRecordManager() : GetOnRecordManager();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a set of history downloads based on the provided |history_info|
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // array. |count| is the number of elements in |history_info|. On success,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |items| will contain |count| DownloadItems in the order that they were
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified in |history_info|. Returns true on success and false otherwise.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t count,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DownloadManager::DownloadVector* items) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadIdComparator download_id_comparator;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time current = base::Time::Now();
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items->clear();
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetOnRecordManager()->GetAllDownloads(items);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK_EQ(0, static_cast<int>(items->size()));
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<GURL> url_chain;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    url_chain.push_back(GURL());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < count; ++i) {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem* item = GetOnRecordManager()->CreateDownloadItem(
4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          content::DownloadItem::kInvalidId + 1 + i,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          downloads_directory().Append(history_info[i].filename),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          downloads_directory().Append(history_info[i].filename),
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url_chain, GURL(),    // URL Chain, referrer
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          std::string(), std::string(), // mime_type, original_mime_type
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          current, current,  // start_time, end_time
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::string(), std::string(), // etag, last_modified
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          1, 1,              // received_bytes, total_bytes
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          history_info[i].state,  // state
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::DOWNLOAD_INTERRUPT_REASON_NONE,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);                 // opened
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      items->push_back(item);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Order by ID so that they are in the order that we created them.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::sort(items->begin(), items->end(), download_id_comparator);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set the danger type if necessary.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < count; ++i) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (history_info[i].danger_type !=
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  history_info[i].danger_type);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        items->at(i)->OnContentCheckCompleted(history_info[i].danger_type);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateSlowTestDownloads(
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t count, DownloadManager::DownloadVector* items) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < count; ++i) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<content::DownloadTestObserver> observer(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CreateInProgressDownloadObserver(1));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::NavigateToURLWithDisposition(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          current_browser(), slow_download_url, CURRENT_TAB,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer->WaitForFinished();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCurrentManager()->GetAllDownloads(items);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(count, items->size());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* CreateSlowTestDownload() {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<content::DownloadTestObserver> observer(
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateInProgressDownloadObserver(1));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager = GetCurrentManager();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(0, manager->NonMaliciousInProgressCount());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, manager->InProgressCount());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager->InProgressCount() != 0)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_browser(), slow_download_url, CURRENT_TAB,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->WaitForFinished();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager::DownloadVector items;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* new_item = NULL;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DownloadManager::DownloadVector::iterator iter = items.begin();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != items.end(); ++iter) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // There should be only one IN_PROGRESS item.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(NULL, new_item);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_item = *iter;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new_item;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishPendingSlowDownloads() {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<content::DownloadTestObserver> observer(
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateDownloadObserver(1));
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_browser(), finish_url, NEW_FOREGROUND_TAB,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->WaitForFinished();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadTestObserver* CreateDownloadObserver(size_t download_count) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new content::DownloadTestObserverTerminal(
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetCurrentManager(), download_count,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadTestObserver* CreateInProgressDownloadObserver(
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t download_count) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new content::DownloadTestObserverInProgress(
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetCurrentManager(), download_count);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RunFunction(UIThreadExtensionFunction* function,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& args) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<UIThreadExtensionFunction> delete_function(function);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetUpExtensionFunction(function);
528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool result = extension_function_test_utils::RunFunction(
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function, args, browser(), GetFlags());
530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!result) {
531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      LOG(ERROR) << function->GetError();
532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return result;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_function_test_utils::RunFunctionFlags GetFlags() {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_browser()->profile()->IsOffTheRecord() ?
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           extension_function_test_utils::INCLUDE_INCOGNITO :
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           extension_function_test_utils::NONE;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension_function_test_utils::RunFunction*() only uses browser for its
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile(), so pass it the on-record browser so that it always uses the
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on-record profile to match real-life behavior.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Value* RunFunctionAndReturnResult(
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<UIThreadExtensionFunction> function,
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& args) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetUpExtensionFunction(function.get());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_function_test_utils::RunFunctionAndReturnSingleResult(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        function.get(), args, browser(), GetFlags());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string RunFunctionAndReturnError(
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<UIThreadExtensionFunction> function,
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& args) {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetUpExtensionFunction(function.get());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_function_test_utils::RunFunctionAndReturnError(
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        function.get(), args, browser(), GetFlags());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool RunFunctionAndReturnString(
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<UIThreadExtensionFunction> function,
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& args,
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string* result_string) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetUpExtensionFunction(function.get());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(result.get());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result.get() && result->GetAsString(result_string);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string DownloadItemIdAsArgList(const DownloadItem* download_item) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPrintf("[%d]", download_item->GetId());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& downloads_directory() {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return downloads_directory_.path();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadsEventsListener* events_listener() { return events_listener_.get(); }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpExtensionFunction(UIThreadExtensionFunction* function) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Recreate the tab each time for insulation.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents* tab = chrome::AddSelectedTabWithURL(
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          current_browser(),
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_->GetResourceURL("empty.html"),
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_LINK);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function->set_extension(extension_);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      function->SetRenderViewHost(tab->GetRenderViewHost());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateAndSetDownloadsDirectory() {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_browser()->profile()->GetPrefs()->SetFilePath(
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        downloads_directory_.path());
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir downloads_directory_;
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const Extension* extension_;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito_browser_;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* current_browser_;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadsEventsListener> events_listener_;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockIconExtractorImpl : public DownloadFileIconExtractor {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockIconExtractorImpl(const base::FilePath& path,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        IconLoader::IconSize icon_size,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& response)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : expected_path_(path),
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_icon_size_(icon_size),
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        response_(response) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockIconExtractorImpl() {}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ExtractIconURLForPath(const base::FilePath& path,
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     float scale,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     IconLoader::IconSize icon_size,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     IconURLCallback callback) OVERRIDE {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(expected_path_.value().c_str(), path.value().c_str());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_icon_size_, icon_size);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_path_ == path &&
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_icon_size_ == icon_size) {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_ = callback;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::UI, FROM_HERE,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&MockIconExtractorImpl::RunCallback,
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this)));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunCallback() {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_.Run(response_);
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Drop the reference on extension function to avoid memory leaks.
645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    callback_ = IconURLCallback();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath             expected_path_;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconLoader::IconSize expected_icon_size_;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string          response_;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconURLCallback      callback_;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ItemNotInProgress(DownloadItem* item) {
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return item->GetState() != DownloadItem::IN_PROGRESS;
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels the underlying DownloadItem when the ScopedCancellingItem goes out of
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scope. Like a scoped_ptr, but for DownloadItems.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedCancellingItem {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedCancellingItem(DownloadItem* item) : item_(item) {}
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedCancellingItem() {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item_->Cancel(true);
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::DownloadUpdatedObserver observer(
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        item_, base::Bind(&ItemNotInProgress));
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer.WaitForEvent();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* get() { return item_; }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item_;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedCancellingItem);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels all the underlying DownloadItems when the ScopedItemVectorCanceller
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes out of scope. Generalization of ScopedCancellingItem to many
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadItems.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedItemVectorCanceller {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedItemVectorCanceller(DownloadManager::DownloadVector* items)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : items_(items) {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedItemVectorCanceller() {
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DownloadManager::DownloadVector::const_iterator item = items_->begin();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         item != items_->end(); ++item) {
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if ((*item)->GetState() == DownloadItem::IN_PROGRESS)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*item)->Cancel(true);
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadUpdatedObserver observer(
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (*item), base::Bind(&ItemNotInProgress));
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      observer.WaitForEvent();
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector* items_;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes an HTML5 file so that it can be downloaded.
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTML5FileWriter {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
70203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  static bool CreateFileForTesting(storage::FileSystemContext* context,
70303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   const storage::FileSystemURL& path,
70403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   const char* data,
705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   int length) {
706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Create a temp file.
707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::FilePath temp_file;
708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!base::CreateTemporaryFile(&temp_file) ||
709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::WriteFile(temp_file, data, length) != length) {
710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Invoke the fileapi to copy it into the sandboxed filesystem.
713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool result = false;
714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::WaitableEvent done_event(true, false);
715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    BrowserThread::PostTask(
716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&CreateFileForTestingOnIOThread,
718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(context),
719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   path, temp_file,
720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(&result),
721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(&done_event)));
722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Wait for that to finish.
723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    done_event.Wait();
724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::DeleteFile(temp_file, false);
725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return result;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void CopyInCompletion(bool* result,
730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                               base::WaitableEvent* done_event,
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               base::File::Error error) {
732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK_CURRENTLY_ON(BrowserThread::IO);
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *result = error == base::File::FILE_OK;
734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    done_event->Signal();
735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void CreateFileForTestingOnIOThread(
73803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemContext* context,
73903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemURL& path,
740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const base::FilePath& temp_file,
741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      bool* result,
742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::WaitableEvent* done_event) {
743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK_CURRENTLY_ON(BrowserThread::IO);
744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    context->operation_runner()->CopyInForeignFile(
745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        temp_file, path,
746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&CopyInCompletion,
747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(result),
748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   base::Unretained(done_event)));
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Merge this with the other TestObservers.
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class JustInProgressDownloadObserver
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public content::DownloadTestObserverInProgress {
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JustInProgressDownloadObserver(
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DownloadManager* download_manager, size_t wait_count)
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : content::DownloadTestObserverInProgress(download_manager, wait_count) {
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~JustInProgressDownloadObserver() {}
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE {
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return item->GetState() == DownloadItem::IN_PROGRESS;
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver);
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ItemIsInterrupted(DownloadItem* item) {
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return item->GetState() == DownloadItem::INTERRUPTED;
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
775558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochcontent::DownloadInterruptReason InterruptReasonExtensionToContent(
7765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    downloads::InterruptReason error) {
777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (error) {
7785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case downloads::INTERRUPT_REASON_NONE:
779558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return content::DOWNLOAD_INTERRUPT_REASON_NONE;
7805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value)      \
7815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  case downloads::INTERRUPT_REASON_##name: \
7825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return content::DOWNLOAD_INTERRUPT_REASON_##name;
783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h"
784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON
785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  NOTREACHED();
787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return content::DOWNLOAD_INTERRUPT_REASON_NONE;
788558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liudownloads::InterruptReason InterruptReasonContentToExtension(
791558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    content::DownloadInterruptReason error) {
792558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (error) {
793558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case content::DOWNLOAD_INTERRUPT_REASON_NONE:
7945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return downloads::INTERRUPT_REASON_NONE;
7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value)             \
7965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  case content::DOWNLOAD_INTERRUPT_REASON_##name: \
7975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return downloads::INTERRUPT_REASON_##name;
798558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h"
799558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON
800558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
801558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  NOTREACHED();
8025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return downloads::INTERRUPT_REASON_NONE;
803558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
804558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_CHROMEOS)
8085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396510
8095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Open DISABLED_DownloadExtensionTest_Open
8105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
8115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Open DownloadExtensionTest_Open
8125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       MAYBE_DownloadExtensionTest_Open) {
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
81623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DownloadsOpenFunction* open_function = new DownloadsOpenFunction();
81723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function->set_user_gesture(true);
818558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               RunFunctionAndReturnError(
82023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                   open_function,
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   "[-42]").c_str());
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* download_item = CreateSlowTestDownload();
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(download_item);
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpened());
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpenWhenComplete());
8275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
8285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
8295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
8305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
8315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
8325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
8335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
8345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_item->GetURL().spec().c_str())));
83523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function = new DownloadsOpenFunction();
83623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function->set_user_gesture(true);
837558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotComplete,
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               RunFunctionAndReturnError(
83923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                   open_function,
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   DownloadItemIdAsArgList(download_item)).c_str());
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FinishPendingSlowDownloads();
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpened());
84423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
84523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function = new DownloadsOpenFunction();
84623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_STREQ(errors::kUserGesture,
84723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               RunFunctionAndReturnError(
84823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                  open_function,
84923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                  DownloadItemIdAsArgList(download_item)).c_str());
85023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(download_item->GetOpened());
85123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
85223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function = new DownloadsOpenFunction();
85323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  open_function->set_user_gesture(true);
85423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(RunFunction(open_function,
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(download_item->GetOpened());
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DownloadExtensionTest_PauseResumeCancelErase) {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* download_item = CreateSlowTestDownload();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(download_item);
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string error;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call pause().  It should succeed and the download should be paused on
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_item->IsPaused());
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling removeFile on a non-active download yields kNotComplete
872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and should not crash. http://crbug.com/319984
873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsRemoveFileFunction(),
874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    DownloadItemIdAsArgList(download_item));
875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_STREQ(errors::kNotComplete, error.c_str());
876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling pause() twice shouldn't be an error.
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_item->IsPaused());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try resuming this download.  It should succeed.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(),
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(download_item->IsPaused());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resume again.  Resuming a download that wasn't paused is not an error.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(),
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(download_item->IsPaused());
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pause again.
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(),
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_item->IsPaused());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And now cancel.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(),
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel again.  Shouldn't have any effect.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(),
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          DownloadItemIdAsArgList(download_item)));
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling paused on a non-active download yields kNotInProgress.
908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  error = RunFunctionAndReturnError(
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item));
910558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotInProgress, error.c_str());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling resume on a non-active download yields kNotResumable
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item));
915558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotResumable, error.c_str());
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling pause on a non-existent download yields kInvalidId.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsPauseFunction(), "[-42]");
920558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId, error.c_str());
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Calling resume on a non-existent download yields kInvalidId
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsResumeFunction(), "[-42]");
925558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId, error.c_str());
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Calling removeFile on a non-existent download yields kInvalidId.
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  error = RunFunctionAndReturnError(
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new DownloadsRemoveFileFunction(), "[-42]");
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_STREQ(errors::kInvalidId, error.c_str());
931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int id = download_item->GetId();
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsEraseFunction(),
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d}]", id)));
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager::DownloadVector items;
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetCurrentManager()->GetAllDownloads(&items);
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0UL, items.size());
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result);
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item = NULL;
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* result_list = NULL;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int element = -1;
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result_list->GetInteger(0, &element));
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(id, element);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<UIThreadExtensionFunction> MockedGetFileIconFunction(
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_path,
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IconLoader::IconSize icon_size,
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& response) {
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DownloadsGetFileIconFunction> function(
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsGetFileIconFunction());
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function->SetIconExtractorForTesting(new MockIconExtractorImpl(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_path, icon_size, response));
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return function;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download items.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_FileIcon_Active) {
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* download_item = CreateSlowTestDownload();
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(download_item);
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(download_item->GetTargetFilePath().empty());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string args32(base::StringPrintf("[%d, {\"size\": 32}]",
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     download_item->GetId()));
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result_string;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the icon for the in-progress download.  This call should succeed even
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the file type isn't registered.
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test whether the correct path is being pased into the icon extractor.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", download_item->GetId()), &result_string));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try a 16x16 icon.
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::SMALL, "foo"),
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {\"size\": 16}]", download_item->GetId()),
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result_string));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly asking for 32x32 should give us a 32x32 icon.
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32, &result_string));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the download and try again.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishPendingSlowDownloads();
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DownloadItem::COMPLETE, download_item->GetState());
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32, &result_string));
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the path passed to the icon extractor post-completion.
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32, &result_string));
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now create another download.
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_item = CreateSlowTestDownload();
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(download_item);
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(download_item->GetTargetFilePath().empty());
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  args32 = base::StringPrintf("[%d, {\"size\": 32}]", download_item->GetId());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the download. As long as the download has a target path, we should
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be able to query the file icon.
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_item->Cancel(true);
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(download_item->GetTargetFilePath().empty());
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let cleanup complete on the FILE thread.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop(BrowserThread::FILE);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the path passed to the icon extractor post-cancellation.
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32,
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result_string));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate an error during icon load by invoking the mock with an empty
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result string.
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error = RunFunctionAndReturnError(
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MockedGetFileIconFunction(download_item->GetTargetFilePath(),
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                IconLoader::NORMAL,
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::string()),
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args32);
1026558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kIconNotFound, error.c_str());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1028558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Once the download item is deleted, we should return kInvalidId.
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = download_item->GetId();
1030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  download_item->Remove();
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_item = NULL;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<DownloadItem*>(NULL),
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetCurrentManager()->GetDownload(id));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args32);
1035558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can acquire file icons for history downloads regardless of
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether they exist or not.  If the file doesn't exist we should receive a
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generic icon from the OS/toolkit that may or may not be specific to the file
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type.
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_FileIcon_History) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("real.txt"),
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("fake.txt"),
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector all_downloads;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &all_downloads));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1057b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath real_path = all_downloads[0]->GetTargetFilePath();
1058b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath fake_path = all_downloads[1]->GetTargetFilePath();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, base::WriteFile(real_path, "", 0));
10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(real_path));
10627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(fake_path));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DownloadManager::DownloadVector::iterator iter = all_downloads.begin();
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != all_downloads.end();
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result_string;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use a MockIconExtractorImpl to test if the correct path is being passed
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // into the DownloadFileIconExtractor.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
1071b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            (*iter)->GetTargetFilePath(), IconLoader::NORMAL, "hello"),
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::StringPrintf("[%d, {\"size\": 32}]", (*iter)->GetId()),
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &result_string));
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ("hello", result_string.c_str());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test passing the empty query to search().
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_SearchEmptyQuery) {
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem item(CreateSlowTestDownload());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item.get());
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{}]"));
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |filenameRegex| parameter for search().
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchFilenameRegex) {
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("foobar"),
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector all_downloads;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &all_downloads));
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]"));
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item_value = NULL;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int item_id = -1;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item_value->GetInteger("id", &item_id));
11177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(all_downloads[0]->GetId(), static_cast<uint32>(item_id));
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |id| parameter for search().
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchId) {
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
11277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new DownloadsSearchFunction(), base::StringPrintf(
11287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          "[{\"id\": %u}]", items[0]->GetId())));
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item_value = NULL;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int item_id = -1;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item_value->GetInteger("id", &item_id));
11377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(items[0]->GetId(), static_cast<uint32>(item_id));
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying both the |id| and |filename| parameters for search().
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchIdAndFilename) {
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(),
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"id\": 0, \"filename\": \"foobar\"}]"));
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0UL, result_list->GetSize());
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a single |orderBy| parameter for search().
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchOrderBy) {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
1172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsSearchFunction(), "[{\"orderBy\": [\"filename\"]}]"));
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, result_list->GetSize());
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item0_value = NULL;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item1_value = NULL;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item0_value));
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(1, &item1_value));
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string item0_name, item1_name;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item0_value->GetString("filename", &item0_name));
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item1_value->GetString("filename", &item1_name));
1184b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_GT(items[0]->GetTargetFilePath().value(),
1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            items[1]->GetTargetFilePath().value());
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(item0_name, item1_name);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test specifying an empty |orderBy| parameter for search().
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchOrderByEmpty) {
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
1205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsSearchFunction(), "[{\"orderBy\": []}]"));
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, result_list->GetSize());
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item0_value = NULL;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item1_value = NULL;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item0_value));
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(1, &item1_value));
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string item0_name, item1_name;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item0_value->GetString("filename", &item0_name));
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item1_value->GetString("filename", &item1_name));
1217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_GT(items[0]->GetTargetFilePath().value(),
1218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            items[1]->GetTargetFilePath().value());
12190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The order of results when orderBy is empty is unspecified. When there are
12200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // no sorters, DownloadQuery does not call sort(), so the order of the results
12210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // depends on the order of the items in base::hash_map<uint32,...>
12220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // DownloadManagerImpl::downloads_, which is unspecified and differs between
12230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // libc++ and libstdc++. http://crbug.com/365334
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |danger| option for search().
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchDanger) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]"));
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |state| option for search().
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchState) {
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]"));
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the |limit| option for search().
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_SearchLimit) {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSlowTestDownloads(2, &items);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedItemVectorCanceller delete_items(&items);
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"limit\": 1}]"));
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test invalid search parameters.
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchInvalid) {
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error = RunFunctionAndReturnError(
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"filenameRegex\": \"(\"}]");
1286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilter,
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error.c_str());
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
1289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsSearchFunction(), "[{\"orderBy\": [\"goat\"]}]");
1290558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidOrderBy,
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error.c_str());
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{\"limit\": -1}]");
1294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidQueryLimit,
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error.c_str());
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test searching using multiple conditions through multiple downloads.
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchPlural) {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HistoryDownloadInfo kHistoryInfo[] = {
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("aaa"),
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::CANCELLED,
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS },
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("zzz"),
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FILE_PATH_LITERAL("baz"),
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::COMPLETE,
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT },
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager::DownloadVector items;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo),
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &items));
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{"
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"state\": \"complete\", "
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"danger\": \"content\", "
1320558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      "\"orderBy\": [\"filename\"], "
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"limit\": 1}]"));
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsList(&result_list));
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* item_value = NULL;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType item_name;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item_value->GetString("filename", &item_name));
1330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name);
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that incognito downloads are only visible in incognito contexts, and
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that on-record downloads are visible in both incognito and on-record
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contexts, for DownloadsSearchFunction, DownloadsPauseFunction,
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadsResumeFunction, and DownloadsCancelFunction.
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadExtensionTest_SearchPauseResumeCancelGetFileIconIncognito) {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result_value;
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* result_list = NULL;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* result_dict = NULL;
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType filename;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_incognito = false;
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string on_item_arg;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string off_item_arg;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result_string;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up one on-record item and one off-record item.
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the off-record item first because otherwise there are mysteriously 3
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // items total instead of 2.
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(benjhayden): Figure out where the third item comes from.
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* off_item = CreateSlowTestDownload();
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(off_item);
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  off_item_arg = DownloadItemIdAsArgList(off_item);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* on_item = CreateSlowTestDownload();
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(on_item);
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  on_item_arg = DownloadItemIdAsArgList(on_item);
1362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(on_item->GetTargetFilePath() != off_item->GetTargetFilePath());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions running in the incognito window should have access to both
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // items because the Test extension is in spanning mode.
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_value.reset(RunFunctionAndReturnResult(
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{}]"));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value.get());
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value->GetAsList(&result_list));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, result_list->GetSize());
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetString("filename", &filename));
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
1375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_incognito);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(1, &result_dict));
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetString("filename", &filename));
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
1380b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_incognito);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions running in the on-record window should have access only to the
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on-record item.
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_value.reset(RunFunctionAndReturnResult(
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsSearchFunction(), "[{}]"));
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value.get());
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_value->GetAsList(&result_list));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, result_list->GetSize());
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetString("filename", &filename));
1393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_incognito);
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pausing/Resuming the off-record item while on the record should return an
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error. Cancelling "non-existent" downloads is not an error.
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg);
1400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsResumeFunction(),
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    off_item_arg);
1404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsGetFileIconFunction(),
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", off_item->GetId()));
1409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidId,
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               error.c_str());
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the FileIcon test for both the on- and off-items while off the record.
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE(benjhayden): This does not include the FileIcon test from history,
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // just active downloads. This shouldn't be a problem.
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          on_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunctionAndReturnString(MockedGetFileIconFunction(
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          off_item->GetTargetFilePath(), IconLoader::NORMAL, "foo"),
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("[%d, {}]", off_item->GetId()), &result_string));
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the pause/resume/cancel test for both the on- and off-items while off
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the record.
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(on_item->IsPaused());
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(on_item->IsPaused());
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg));
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(on_item->IsPaused());
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), on_item_arg));
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(on_item->IsPaused());
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), on_item_arg));
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(on_item->IsPaused());
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg));
143790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState());
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), on_item_arg));
143990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, on_item->GetState());
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsPauseFunction(), on_item_arg);
1441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotInProgress, error.c_str());
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsResumeFunction(), on_item_arg);
1443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotResumable, error.c_str());
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(off_item->IsPaused());
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(off_item->IsPaused());
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg));
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(off_item->IsPaused());
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsResumeFunction(), off_item_arg));
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(off_item->IsPaused());
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), off_item_arg));
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(off_item->IsPaused());
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg));
145590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState());
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsCancelFunction(), off_item_arg));
145790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, off_item->GetState());
1458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  error = RunFunctionAndReturnError(new DownloadsPauseFunction(), off_item_arg);
1459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotInProgress, error.c_str());
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = RunFunctionAndReturnError(new DownloadsResumeFunction(),
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    off_item_arg);
1462558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kNotResumable, error.c_str());
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download and that the correct sequence of events is
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fired for it.
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Basic) {
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
14885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
14895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
14915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
14925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
14975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
14985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
14995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
15005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
15015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
15035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
15045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
15065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
15075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
15085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
15095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can start a download from an incognito context, and that the
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download knows that it's incognito.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Incognito) {
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOffTheRecord();
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
15355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
15375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
15385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
15395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
15405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
15415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
15425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
15435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\":%d,"
15455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
15465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
15475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
15485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
15495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
15505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
15515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
15525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\":%d,"
15535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
15545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\","
15555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\"}}]",
15565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This test is very flaky on Win. http://crbug.com/248438
1561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \
1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DISABLED_DownloadExtensionTest_Download_UnsafeHeaders
1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_UnsafeHeaders \
1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DownloadExtensionTest_Download_UnsafeHeaders
1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
1567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we disallow certain headers case-insensitively.
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
1570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       MAYBE_DownloadExtensionTest_Download_UnsafeHeaders) {
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kUnsafeHeaders[] = {
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept-chArsEt",
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "accept-eNcoding",
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "coNNection",
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "coNteNt-leNgth",
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "cooKIE",
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "cOOkie2",
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "coNteNt-traNsfer-eNcodiNg",
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dAtE",
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ExpEcT",
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "hOsT",
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "kEEp-aLivE",
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rEfErEr",
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "tE",
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "trAilER",
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "trANsfer-eNcodiNg",
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "upGRAde",
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "usER-agENt",
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "viA",
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "pRoxY-",
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "sEc-",
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "pRoxY-probably-not-evil",
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "sEc-probably-not-evil",
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "oRiGiN",
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Access-Control-Request-Headers",
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Access-Control-Request-Method",
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) {
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string download_url = test_server()->GetURL("slow?0").spec();
1606558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_STREQ(errors::kInvalidHeader,
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  RunFunctionAndReturnError(new DownloadsDownloadFunction(),
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            base::StringPrintf(
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "[{\"url\": \"%s\","
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  \"filename\": \"unsafe-header-%d.txt\","
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  \"headers\": [{"
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"name\": \"%s\","
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"value\": \"unsafe\"}]}]",
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        download_url.c_str(),
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<int>(index),
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUnsafeHeaders[index])).c_str());
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN)
1621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\
1622558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        DISABLED_DownloadExtensionTest_Download_Subdirectory
1623558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else
1624558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_Subdirectory\
1625558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        DownloadExtensionTest_Download_Subdirectory
1626558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
1628558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       MAYBE_DownloadExtensionTest_Download_Subdirectory) {
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
1636558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
1637558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          "[{\"url\": \"%s\","
1638558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          "  \"filename\": \"sub/dir/ect/ory.txt\"}]",
1639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          download_url.c_str())));
1640558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(result.get());
1641558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int result_id = -1;
1642558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
1643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
1644558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(item);
1645558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ScopedCancellingItem canceller(item);
1646558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
1647558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
16485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
16495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
16505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
16515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
16525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
16535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
16545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
16555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
16565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
16575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
16585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
16595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
16605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
16615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
16625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
16635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("sub/dir/ect/ory.txt").c_str())));
16645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
16655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
16665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
16675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
16685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
16695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
16705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that invalid filenames are disallowed.
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_InvalidFilename) {
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename,
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RunFunctionAndReturnError(new DownloadsDownloadFunction(),
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          base::StringPrintf(
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"../../../../../etc/passwd\"}]",
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())).c_str());
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// flaky on mac: crbug.com/392288
1691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
1692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_InvalidURLs \
1693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        DISABLED_DownloadExtensionTest_Download_InvalidURLs
1694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_InvalidURLs \
1696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        DownloadExtensionTest_Download_InvalidURLs
1697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloading invalid URLs immediately returns kInvalidURLError.
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
1701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       MAYBE_DownloadExtensionTest_Download_InvalidURLs) {
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kInvalidURLs[] = {
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo bar",
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "../hello",
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "/hello",
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://",
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "#frag",
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo/bar.html#frag",
1712558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    "google.com/",
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) {
1716558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_STREQ(errors::kInvalidURL,
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  RunFunctionAndReturnError(new DownloadsDownloadFunction(),
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            base::StringPrintf(
171958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch        "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str())
172058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      << kInvalidURLs[index];
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
172258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
17235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_STREQ("NETWORK_INVALID_REQUEST", RunFunctionAndReturnError(
1724bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new DownloadsDownloadFunction(),
1725bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str());
17265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_STREQ("NETWORK_INVALID_REQUEST", RunFunctionAndReturnError(
1727bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new DownloadsDownloadFunction(),
1728bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      "[{\"url\": \"javascript:return false;\"}]").c_str());
17295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_STREQ("NETWORK_FAILED", RunFunctionAndReturnError(
1730bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new DownloadsDownloadFunction(),
1731bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str());
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions, test downloading from ftp.
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid URLs plus fragments are still valid URLs.
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_URLFragment) {
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0#fragment").spec();
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
17585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
17605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
17615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
17625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
17635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
17645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
17655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
17665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
17685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
17695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
17705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
17715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
17725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
17735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
17745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
17755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
17765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
17775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
17785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
17795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// conflictAction may be specified without filename.
17830529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
17840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       DownloadExtensionTest_Download_ConflictAction) {
17850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static char kFilename[] = "download.txt";
17860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LoadExtension("downloads_split");
17870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string download_url = "data:text/plain,hello";
17880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GoOnTheRecord();
17890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
17900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
17910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
17920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      "[{\"url\": \"%s\"}]", download_url.c_str())));
17930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
17940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int result_id = -1;
17950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
17960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
17970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
17980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller(item);
17990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
18000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
18025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
18045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
18055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
18065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
18075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
18085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
18095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
18135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
18145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
18155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
18165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename(kFilename).c_str())));
18175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
18215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
18225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
18235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
18240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result.reset(RunFunctionAndReturnResult(
18260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
18270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          "[{\"url\": \"%s\",  \"conflictAction\": \"overwrite\"}]",
18280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          download_url.c_str())));
18290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
18300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result_id = -1;
18310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
18320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  item = GetCurrentManager()->GetDownload(result_id);
18330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
18340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller2(item);
18350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
18360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
18385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
18405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
18415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
18425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
18435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
18445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
18455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
18495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
18505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
18515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
18525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename(kFilename).c_str())));
18535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
18575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
18585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
18595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
18600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
18610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid data URLs are valid URLs.
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_DataURL) {
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = "data:text/plain,hello";
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"data.txt\"}]", download_url.c_str())));
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
18825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
18845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
18855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
18865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
18875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
18885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
18895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
18925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
18935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
18945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
18955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
18965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("data.txt").c_str())));
18975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
18985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
18995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
19005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
19015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
19025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
19035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Valid file URLs are valid URLs.
19075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to crbug.com/175711
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DISABLED_DownloadExtensionTest_Download_File
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_Download_File \
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DownloadExtensionTest_Download_File
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_DownloadExtensionTest_Download_File) {
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = "file:///";
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_url += "C:/";
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"file.txt\"}]", download_url.c_str())));
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
19375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
19385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"incognito\": false,"
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"mime\": \"text/html\","
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"paused\": false,"
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"url\": \"%s\"}]",
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          download_url.c_str())));
19445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
19455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
19465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"filename\": {"
1948b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id,
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetFilename("file.txt").c_str())));
19525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
19535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
19545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that auth-basic-succeed would fail if the resource requires the
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authorization header and chrome fails to propagate it back to the server.
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests both that testserver.py does not succeed when it should fail as
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well as how the downloads extension API exposes the failure to extensions.
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_AuthBasic_Fail) {
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
1968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("auth-basic").spec();
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"auth-basic-fail.txt\"}]",
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1986558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
1987558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
19885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED,
1989558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
1990558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
1991558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"text/html\","
1992558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
1993558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
1994558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates |headers| to the URLRequest.
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Headers) {
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/downloads/"
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec();
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"headers-succeed.txt\","
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"headers\": ["
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\"name\": \"Foo\", \"value\": \"bar\"},"
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\"name\": \"Qx\", \"value\":\"yo\"}]}]",
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
20245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
20255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
20265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
20275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
20285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
20295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
20305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
20315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
20325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
20335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
20345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
20355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
20365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
20375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
20385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("headers-succeed.txt").c_str())));
20395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
20405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
20415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
20425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
20435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
20445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
20455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that headers-succeed would fail if the resource requires the headers and
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome fails to propagate them back to the server.  This tests both that
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testserver.py does not succeed when it should fail as well as how the
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloads extension api exposes the failure to extensions.
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Headers_Fail) {
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/downloads/"
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_headers=Foo:bar&expected_headers=Qx:yo").spec();
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"headers-fail.txt\"}]",
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2074558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
2075558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
2076558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
2077558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
2078558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         "  \"bytesReceived\": 0.0,"
20805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         "  \"fileSize\": 0.0,"
2081558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"\","
2082558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
2083558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
2084558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the Authorization header
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly.
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_AuthBasic) {
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("auth-basic").spec();
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is just base64 of 'username:secret'.
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0";
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"auth-basic-succeed.txt\","
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"headers\": [{"
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"name\": \"Authorization\","
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"value\": \"Basic %s\"}]}]",
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str(), kAuthorization)));
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
21165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
21185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
21195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"bytesReceived\": 0.0,"
21205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"fileSize\": 0.0,"
21215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/html\","
21225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
21235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
21245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
21255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
21265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
21285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
21295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
21305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
21315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that DownloadsDownloadFunction propagates the |method| and |body|
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters to the URLRequest.
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Post) {
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/post/downloads/"
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_body=BODY").spec();
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"post-succeed.txt\","
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"method\": \"POST\","
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"body\": \"BODY\"}]",
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
21615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
21635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
21645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
21655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
21665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
21675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
21685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
21695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
21715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
21725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
21735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
21745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
21755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("post-succeed.txt").c_str())));
21765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
21775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
21785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
21795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
21805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
21815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
21825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |method| parameter back to the
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions.
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Post_Get) {
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/post/downloads/"
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_body=BODY").spec();
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DownloadsDownloadFunction(), base::StringPrintf(
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"body\": \"BODY\","
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"post-get.txt\"}]",
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2213558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
2214558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
2215558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
2216558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
2217558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
2218558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"\","
2219558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
2220558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"id\": %d,"
2221558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
2222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         result_id,
2223558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that downloadPostSuccess would fail if the resource requires the POST
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method, and chrome fails to propagate the |body| parameter back to the
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server. This tests both that testserver.py does not succeed when it should
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail, and this tests how the downloads extension api exposes the failure to
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions.
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Post_NoBody) {
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL("files/post/downloads/"
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a_zip_file.zip?expected_body=BODY").spec();
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[{\"url\": \"%s\","
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"method\": \"POST\","
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"filename\": \"post-nobody.txt\"}]",
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_url.c_str())));
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2254558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(WaitForInterruption(
2255558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      item,
2256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
2257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::StringPrintf("[{\"danger\": \"safe\","
2258558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"incognito\": false,"
2259558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"mime\": \"\","
2260558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"paused\": false,"
2261558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"id\": %d,"
2262558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         "  \"url\": \"%s\"}]",
2263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         result_id,
2264558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                         download_url.c_str())));
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cancel()ing an in-progress download causes its state to transition
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to interrupted, and test that that state transition is detectable by an
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// onChanged event listener.  TODO(benjhayden): Test other sources of
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interruptions such as server death.
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadExtensionTest_Download_Cancel) {
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
2274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string download_url = test_server()->GetURL(
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "download-known-size").spec();
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
22925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
22935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"incognito\": false,"
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"mime\": \"application/octet-stream\","
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"paused\": false,"
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"id\": %d,"
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"url\": \"%s\"}]",
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id,
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          download_url.c_str())));
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item->Cancel(true);
23025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
23035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
2305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                          "  \"error\": {\"current\":\"USER_CANCELED\"},"
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"state\": {"
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "    \"previous\": \"in_progress\","
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "    \"current\": \"interrupted\"}}]",
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id)));
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// flaky on mac: crbug.com/392288
2313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
2314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_FileSystemURL \
2315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        DISABLED_DownloadExtensionTest_Download_FileSystemURL
2316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_Download_FileSystemURL \
2318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        DownloadExtensionTest_Download_FileSystemURL
2319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test downloading filesystem: URLs.
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: chrome disallows creating HTML5 FileSystem Files in incognito.
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
2324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       MAYBE_DownloadExtensionTest_Download_FileSystemURL) {
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kPayloadData = "on the record\ndata";
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoOnTheRecord();
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("downloads_split");
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string download_url = "filesystem:" + GetExtensionURL() +
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "temporary/on_record.txt";
2331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Setup a file in the filesystem which we can download.
2333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(HTML5FileWriter::CreateFileForTesting(
233403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      BrowserContext::GetDefaultStoragePartition(browser()->profile())
233503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ->GetFileSystemContext(),
233603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemURL::CreateForTest(GURL(download_url)),
233703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      kPayloadData,
233803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      strlen(kPayloadData)));
2339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Now download it.
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result.get());
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_id = -1;
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(item);
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCancellingItem canceller(item);
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
23545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"incognito\": false,"
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"mime\": \"text/plain\","
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"paused\": false,"
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"url\": \"%s\"}]",
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          download_url.c_str())));
23615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
23625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "  \"filename\": {"
2365b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          result_id,
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetFilename("on_record.txt").c_str())));
23695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
23705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
23715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
2375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string disk_data;
237758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(base::ReadFileToString(item->GetTargetFilePath(), &disk_data));
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(kPayloadData, disk_data.c_str());
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
2382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       DownloadExtensionTest_OnDeterminingFilename_NoChange) {
23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
24035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
24045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
24055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
24135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
24145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
24155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
24165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
24175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
241990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
24295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
24345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
24355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
24365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
24375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
24385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
24395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
24405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
24415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
24425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
24435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
24445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
24455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
24465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
24475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
24485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Disabled due to cross-platform flakes; http://crbug.com/370531.
2452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
2453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DownloadExtensionTest,
2454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DISABLED_DownloadExtensionTest_OnDeterminingFilename_Timeout) {
2455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GoOnTheRecord();
2456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadExtension("downloads_split");
2457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddFilenameDeterminer();
2458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
2459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
2460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
2461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ExtensionDownloadsEventRouter::SetDetermineFilenameTimeoutSecondsForTesting(
2463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      0);
2464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Start downloading a file.
2466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
2467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
2468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
2469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result.get());
2470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int result_id = -1;
2471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
2472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
2473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item);
2474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedCancellingItem canceller(item);
2475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
2476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
2478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
2479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"danger\": \"safe\","
2480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"incognito\": false,"
2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"id\": %d,"
2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
2483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"paused\": false,"
2484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
2485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          result_id,
2486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          download_url.c_str())));
2487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(
2488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::OnDeterminingFilename::kEventName,
2489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\":\"slow.txt\"}]",
2491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
2493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
2494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Do not respond to the onDeterminingFilename.
2496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The download should complete successfully.
2498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\": {"
2501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"\","
2502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"%s\"}}]",
2503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id,
2504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GetFilename("slow.txt").c_str())));
2505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"state\": {"
2508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"in_progress\","
2509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"complete\"}}]",
2510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
2514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       DownloadExtensionTest_OnDeterminingFilename_Twice) {
2515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GoOnTheRecord();
2516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadExtension("downloads_split");
2517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddFilenameDeterminer();
2518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
2519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
2520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
2521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Start downloading a file.
2523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
2525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
2526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result.get());
2527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int result_id = -1;
2528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
2529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
2530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item);
2531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedCancellingItem canceller(item);
2532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
2533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
2535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
2536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"danger\": \"safe\","
2537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"incognito\": false,"
2538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"id\": %d,"
2539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
2540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"paused\": false,"
2541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
2542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          result_id,
2543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          download_url.c_str())));
2544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(
2545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::OnDeterminingFilename::kEventName,
2546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\":\"slow.txt\"}]",
2548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
2551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Respond to the onDeterminingFilename.
2553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string error;
2554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
2555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      browser()->profile(),
2556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      false,
2557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetExtensionId(),
2558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      result_id,
2559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FilePath(),
2560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
2561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &error));
2562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ("", error);
2563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Calling DetermineFilename again should return an error instead of calling
2565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // DownloadTargetDeterminer.
2566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
2567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      browser()->profile(),
2568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      false,
2569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetExtensionId(),
2570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      result_id,
2571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("different")),
2572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
2573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &error));
2574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(errors::kTooManyListeners, error);
2575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The download should complete successfully.
2577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"filename\": {"
2580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"\","
2581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"%s\"}}]",
2582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id,
2583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GetFilename("slow.txt").c_str())));
2584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
2585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringPrintf("[{\"id\": %d,"
2586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "  \"state\": {"
2587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"previous\": \"in_progress\","
2588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         "    \"current\": \"complete\"}}]",
2589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         result_id)));
2590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) {
25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
26132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
26155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
26182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
26192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
26202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
26245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
26255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
26285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
263090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
26342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
26352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("overridden.swf")),
26405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"danger\": {"
26485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"safe\","
26495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"file\"}}]",
26505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  item->ValidateDangerousDownload();
26535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"danger\": {"
26575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"file\","
26585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"accepted\"}}]",
26595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
26605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
26615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"state\": {"
26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
2667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(downloads_directory().AppendASCII("overridden.swf"),
2668b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            item->GetTargetFilePath());
26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
26732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_ReferencesParentInvalid) {
26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
26792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
26822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
26842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
26902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
26945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
26955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
26972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
27035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
27045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
27075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
270990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("sneaky/../../sneaky.txt")),
27195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2721558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
27225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"filename\": {"
2726b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
2727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GetFilename("slow.txt").c_str())));
27305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
2733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
2734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
2736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
2741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IllegalFilename) {
27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
27472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
27552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
27625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
27692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
27715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
27725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
27755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
277790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
2786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("<")),
27875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
27905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
27925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
27935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
27945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
27955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
27965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
27975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
27985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
27995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
28025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
28035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
28045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
2809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IllegalFilenameExtension) {
28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
28162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
28305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
28395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
28405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
28435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
284590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
28462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
28492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
2854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL(
2855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}/foo")),
28565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2858558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
28595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
28605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
28635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
28645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
28655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
28665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
28675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
28685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
28695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
28705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
28715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
28725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
28735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
28764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\
28774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISABLED_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename
28784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
28794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename\
28804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DownloadExtensionTest_OnDeterminingFilename_ReservedFilename
28814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
28844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MAYBE_DownloadExtensionTest_OnDeterminingFilename_ReservedFilename) {
28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
2888eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2889eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
28902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
28912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
28952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
28962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
28982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
28992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
29002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
29012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
29022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
29055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
29145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
29155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
29185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
292090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
29212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename.
29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
29242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
29252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
2929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("con.foo")),
29305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
2932558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
29335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
29345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
29375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
29385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
29395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
29405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
29415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
29425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
29455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
29465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
29475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
2948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
2951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest,
2952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_CurDirInvalid) {
2953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GoOnTheRecord();
2954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
2955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddFilenameDeterminer();
2956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
2958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
2959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start downloading a file.
2961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
2962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
2963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
2964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result.get());
2965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result_id = -1;
2966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
2967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
2968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item);
2969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedCancellingItem canceller(item);
2970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
2971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
29735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
2975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"incognito\": false,"
2976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"id\": %d,"
2977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
2978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"paused\": false,"
2979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
2980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id,
2981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          download_url.c_str())));
29825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
29835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
29845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
29855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
29865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
2987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
298890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename.
2991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
2992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
2993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(),
2994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
2995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetExtensionId(),
2996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_id,
2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL(".")),
29985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
2999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &error));
3000558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
30015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
30025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
30055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
30065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
30075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
30085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
30095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
30105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
30135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
30145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
30155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
3019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest,
3020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_ParentDirInvalid) {
3021eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3022eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GoOnTheRecord();
3024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
3025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddFilenameDeterminer();
3026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
3027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start downloading a file.
3029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
3030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
3031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
3032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result.get());
3033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result_id = -1;
3034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
3036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item);
3037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedCancellingItem canceller(item);
3038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
3039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
30415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
3043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"incognito\": false,"
3044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"id\": %d,"
3045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
3046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"paused\": false,"
3047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
3049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          download_url.c_str())));
30505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
30515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
30545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
305690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
3057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename.
3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
3060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
3061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(),
3062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
3063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetExtensionId(),
3064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_id,
3065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("..")),
30665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
3067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &error));
3068558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
30695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
30705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
30735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
30745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
30755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
30765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
30775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
30785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
30795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
30805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
30815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
30825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
30835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
30842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
30872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
3088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_AbsPathInvalid) {
30892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
30912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
3092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
30942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
30972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
30982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
30992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
31002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
31095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
31122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
31185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
31195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
31225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
312490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename. Absolute paths should be rejected.
31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
3133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      downloads_directory().Append(FILE_PATH_LITERAL("sneaky.txt")),
31345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
31352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
3136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
31395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"filename\": {"
3142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          "    \"previous\": \"\","
3143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"%s\"}}]",
31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GetFilename("slow.txt").c_str())));
31465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
31475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
3149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "  \"state\": {"
3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"previous\": \"in_progress\","
3151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "    \"current\": \"complete\"}}]",
3152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          result_id)));
31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
3157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_EmptyBasenameInvalid) {
31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
3161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
31662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
31672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
31682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
31692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
31712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
3176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
31785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
31852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
31862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
31875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
31885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
31895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
31905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
31915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
319390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Respond to the onDeterminingFilename. Empty basenames should be rejected.
3196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
3197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(ExtensionDownloadsEventRouter::DetermineFilename(
3198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(),
3199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
3200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetExtensionId(),
3201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_id,
3202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("foo/")),
32035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
3204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &error));
3205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_STREQ(errors::kInvalidFilename, error.c_str());
3206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
32085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
32115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
32125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
32135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
32145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
32155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
32165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
32195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
32205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
32215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
32220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
32230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// conflictAction may be specified without filename.
32250529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(
32260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DownloadExtensionTest,
32270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DownloadExtensionTest_OnDeterminingFilename_Overwrite) {
32280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GoOnTheRecord();
32290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LoadExtension("downloads_split");
32300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  AddFilenameDeterminer();
32310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
32320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(test_server()->Start());
32330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string download_url = test_server()->GetURL("slow?0").spec();
32340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Start downloading a file.
32360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
32370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
32380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          "[{\"url\": \"%s\"}]", download_url.c_str())));
32390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
32400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int result_id = -1;
32410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
32420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
32430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
32440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller(item);
32450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
32465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
32475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
32495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
32505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
32515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
32525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
32535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
32545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
32555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
32565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
32575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
32605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
32610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item->GetTargetFilePath().empty());
32620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
32630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Respond to the onDeterminingFilename.
32650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string error;
32660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
32670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      browser()->profile(),
32680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false,
32690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetExtensionId(),
32700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id,
32710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::FilePath(),
32725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
32730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      &error));
32740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ("", error);
32750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
32775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
32805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
32815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
32825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
32835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
32845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
32855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
32865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
32875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
32885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
32895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
32905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
32910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Start downloading a file.
32930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result.reset(RunFunctionAndReturnResult(
32940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new DownloadsDownloadFunction(), base::StringPrintf(
32950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          "[{\"url\": \"%s\"}]", download_url.c_str())));
32960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result.get());
32970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  result_id = -1;
32980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(result->GetAsInteger(&result_id));
32990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  item = GetCurrentManager()->GetDownload(result_id);
33000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item);
33010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedCancellingItem canceller2(item);
33020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
33030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
33045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
33055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
33075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
33085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
33095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
33105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
33115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
33125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
33135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
33145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
33155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
33185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
33190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(item->GetTargetFilePath().empty());
33200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
33210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
33220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Respond to the onDeterminingFilename.
33230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Also test that DetermineFilename allows (chrome) extensions to set
33240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // filenames without (filename) extensions. (Don't ask about v8 extensions or
33250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // python extensions or kernel extensions or firefox extensions...)
33260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  error = "";
33270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
33280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      browser()->profile(),
33290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false,
33300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetExtensionId(),
33310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id,
33320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::FilePath(),
33335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
33340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      &error));
33350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ("", error);
33360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
33375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
33385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
33415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
33425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
33435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
33445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
33455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
33465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
33495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
33505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
33515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
3355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest,
3356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_Override) {
3357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GoOnTheRecord();
3358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadExtension("downloads_split");
3359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddFilenameDeterminer();
3360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
3362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start downloading a file.
3365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
3366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
3367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
3368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result.get());
3369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result_id = -1;
3370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
3371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
3372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item);
3373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedCancellingItem canceller(item);
3374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
33755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
33765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
33785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
33795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
33805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
33815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
33825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
33835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
33845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
33855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
33865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
33875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
33885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
33895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
3390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
339190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
3392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
33972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
33982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
33992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
34002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
34015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
34022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
34032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
34042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
34065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
34095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
34105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
34115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
34125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("slow.txt").c_str())));
34135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
34145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
34175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
34185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
34195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
34202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
34222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reset(RunFunctionAndReturnResult(
34232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
34252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
34262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_id = -1;
34272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
34282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item = GetCurrentManager()->GetDownload(result_id);
34292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
34302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller2(item);
34312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
34345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
34365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
34375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
34385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
34395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
34405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
34415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
34425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
34435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
34445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
34475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
34482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
344990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
34502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also test that DetermineFilename allows (chrome) extensions to set
34532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // filenames without (filename) extensions. (Don't ask about v8 extensions or
34542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // python extensions or kernel extensions or firefox extensions...)
34552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error = "";
34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
34572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile(),
34582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("foo")),
34625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
34632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
34675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
34705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
34715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
34725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
34735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("foo").c_str())));
34745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
34755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
34765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
34775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
34785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
34795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
34805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
34812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
34822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO test precedence rules: install_time
34842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
3486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer \
3487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISABLED_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer
3488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
3489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer \
3490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer
3491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
34932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
3494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MAYBE_DownloadExtensionTest_OnDeterminingFilename_RemoveFilenameDeterminer) {
3495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderProcessHost* host = AddFilenameDeterminer();
35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start downloading a file.
35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
35072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
35155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
35232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
35245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
35255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
35285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
353090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove a determiner while waiting for it.
35332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveFilenameDeterminer(host);
35342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
35365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
35395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
35405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
35415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
35422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
35452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
35462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IncognitoSplit) {
35472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
3548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
35512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
35532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOffTheRecord();
35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
35572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an on-record download.
35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
35622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
35632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
35642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
35652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
35662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
35672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
35725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
35735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
35752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
35772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
35782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
35792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
35802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
35825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
35835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
35845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
35855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
35865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
35875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
358990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename events.
35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
35995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
36045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
36055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
36085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
36095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
36105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
36115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42.txt").c_str())));
36125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
36135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
36165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
36175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
36185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
36192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an incognito download for comparison.
36212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOffTheRecord();
36222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reset(RunFunctionAndReturnResult(
36232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
36242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
36252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
36262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_id = -1;
36272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
36282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item = GetCurrentManager()->GetDownload(result_id);
36292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
36302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller2(item);
36312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
36322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
36345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
36365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
36375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
36385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
36395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
36405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
36415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
36425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
36432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // On-Record renderers should not see events for off-record items.
36445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
36455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
36485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
36495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
365190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
36522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
36542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error = "";
36552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
36562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
36572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
36582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
36592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
36602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("5.txt")),
36615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
36622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
36632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
36642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
36665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
36675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
36705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
36715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
36725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
36735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("5.txt").c_str())));
36745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
36755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
36765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
36775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
36785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
36795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
36805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
36812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
36822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
36842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
36852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_IncognitoSpanning) {
36862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_spanning");
3687eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3688eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
36892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string download_url = test_server()->GetURL("slow?0").spec();
36902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
36922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddFilenameDeterminer();
36932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There is a single extension renderer that sees both on-record and
36952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // off-record events. The extension functions see the on-record profile with
36962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // include_incognito=true.
36972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an on-record download.
36992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
37002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
37012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
37022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
37032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
37042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int result_id = -1;
37052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
37062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
37072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
37082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
37092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
37102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename events.
37125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
37135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
37152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"incognito\": false,"
37162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"id\": %d,"
37172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"mime\": \"text/plain\","
37182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"paused\": false,"
37192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "  \"url\": \"%s\"}]",
37202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          result_id,
37212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          download_url.c_str())));
37225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
37235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
37265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
37275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
37282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
372990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
37302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename events.
37322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
37332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
37342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
37352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true,
37362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
37372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
37382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
37395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
37402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
37412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
37422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
37445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
37455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
37485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
37495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
37505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
37515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42.txt").c_str())));
37525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
37535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
37565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
37575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
37585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start an incognito download for comparison.
37612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOffTheRecord();
37622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reset(RunFunctionAndReturnResult(
37632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new DownloadsDownloadFunction(), base::StringPrintf(
37642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "[{\"url\": \"%s\"}]", download_url.c_str())));
37652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result.get());
37662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_id = -1;
37672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
37682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item = GetCurrentManager()->GetDownload(result_id);
37692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item);
37702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller2(item);
37712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
37722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
37745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
37765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
37775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
37785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"text/plain\","
37795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false,"
37805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"url\": \"%s\"}]",
37815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
37825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          download_url.c_str())));
37835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
37845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
37855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
37865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": true,"
37875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"slow.txt\"}]",
37885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
37892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
379090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
37912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Respond to the onDeterminingFilename.
37932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error = "";
37942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
37952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
37962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true,
37972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
37982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_id,
37992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
38005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
38012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &error));
38022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
38032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
38055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
38065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
38085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
38095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
38105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
38115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id,
38125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42 (1).txt").c_str())));
38135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
38145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
38165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
38175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
38185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
38195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
38202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
38212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38225e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#if defined(OS_WIN)
38235e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)// This test is very flaky on Win XP and Aura. http://crbug.com/248438
38245e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
38255e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
38265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#else
38275e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
38285e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
38295e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#endif
38305e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
3831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test download interruption while extensions determining filename. Should not
3832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// re-dispatch onDeterminingFilename.
38332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
38342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadExtensionTest,
38355e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) {
3836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
3837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      switches::kEnableDownloadResumption);
38382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadExtension("downloads_split");
3839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server()->Start());
38412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GoOnTheRecord();
3842a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::RenderProcessHost* host = AddFilenameDeterminer();
38432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start a download.
3845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadItem* item = NULL;
3846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
3847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadManager* manager = GetCurrentManager();
3848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<content::DownloadTestObserver> observer(
3849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new JustInProgressDownloadObserver(manager, 1));
3850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(0, manager->InProgressCount());
38518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_EQ(0, manager->NonMaliciousInProgressCount());
3852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Tabs created just for a download are automatically closed, invalidating
3853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the download's WebContents. Downloads without WebContents cannot be
3854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // resumed. http://crbug.com/225901
3855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
3856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        current_browser(),
3857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl),
3858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CURRENT_TAB,
3859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ui_test_utils::BROWSER_TEST_NONE);
3860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer->WaitForFinished();
3861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
3862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DownloadManager::DownloadVector items;
3863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    manager->GetAllDownloads(&items);
3864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (DownloadManager::DownloadVector::iterator iter = items.begin();
3865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          iter != items.end(); ++iter) {
3866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
3867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // There should be only one IN_PROGRESS item.
3868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(NULL, item);
3869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        item = *iter;
3870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
3871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
3872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(item);
3873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
38742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedCancellingItem canceller(item);
38752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the onCreated and onDeterminingFilename event.
38775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName,
38785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"danger\": \"safe\","
38805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
38815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"id\": %d,"
38825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"mime\": \"application/octet-stream\","
38835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"paused\": false}]",
38845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
38855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName,
38865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
38875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
38885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"incognito\": false,"
38895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\":\"download-unknown-size\"}]",
38905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
38912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(item->GetTargetFilePath().empty());
389290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
38932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearEvents();
3895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
3896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      current_browser(),
3897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl),
3898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NEW_BACKGROUND_TAB,
3899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
39002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Errors caught before filename determination are delayed until after
3902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // filename determination.
39032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
39042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
39052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_browser()->profile(),
39062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
39072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExtensionId(),
3908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      item->GetId(),
39092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("42.txt")),
39105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY,
39115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &error))
39125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      << error;
39132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error);
39145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
39175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"filename\": {"
39185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"\","
39195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"%s\"}}]",
39205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId(),
39215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          GetFilename("42.txt").c_str())));
39222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::DownloadUpdatedObserver interrupted(item, base::Bind(
3924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ItemIsInterrupted));
3925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(interrupted.WaitForEvent());
39265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
39295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"error\":{\"current\":\"NETWORK_FAILED\"},"
39305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\":{"
39315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"in_progress\","
39325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"interrupted\"}}]",
39335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
3934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearEvents();
3936a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Downloads that are restarted on resumption trigger another download target
3937a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // determination.
3938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RemoveFilenameDeterminer(host);
3939a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  item->Resume();
3940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Errors caught before filename determination is complete are delayed until
3942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // after filename determination so that, on resumption, filename determination
3943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // does not need to be re-done. So, there will not be a second
3944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onDeterminingFilename event.
3945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
39495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"error\":{\"previous\":\"NETWORK_FAILED\"},"
39505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\":{"
39515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\":\"interrupted\","
39525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\":\"in_progress\"}}]",
39535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
3954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearEvents();
3956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FinishPendingSlowDownloads();
3957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The download should complete successfully.
39595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
39605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
39615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d,"
39625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"state\": {"
39635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"in_progress\","
39645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"complete\"}}]",
39655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          item->GetId())));
39662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
39672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
3969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                       DownloadExtensionTest_SetShelfEnabled) {
3970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  LoadExtension("downloads_split");
3971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[false]"));
3972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(DownloadServiceFactory::GetForBrowserContext(
3973a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      browser()->profile())->IsShelfEnabled());
3974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(RunFunction(new DownloadsSetShelfEnabledFunction(), "[true]"));
3975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(DownloadServiceFactory::GetForBrowserContext(
3976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      browser()->profile())->IsShelfEnabled());
3977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test that existing shelves are hidden.
3978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test multiple extensions.
3979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test disabling extensions.
3980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test that browsers associated with other profiles are not
3981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // affected.
3982a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(benjhayden) Test incognito.
3983a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3984a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benjhayden) Figure out why DisableExtension() does not fire
39862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnListenerRemoved.
3987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(benjhayden) Test that the shelf is shown for download() both with and
3989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// without a WebContents.
3990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3991424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OnDangerPromptCreated(DownloadDangerPrompt* prompt) {
3992424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  prompt->InvokeActionForTesting(DownloadDangerPrompt::ACCEPT);
3993424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
3994424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
39955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
39965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Flakily triggers and assert on Mac.
39975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// http://crbug.com/180759
39985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_AcceptDanger DownloadExtensionTest_AcceptDanger
39995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
40005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_DownloadExtensionTest_AcceptDanger DISABLED_DownloadExtensionTest_AcceptDanger
40015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4002424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
40035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       MAYBE_DownloadExtensionTest_AcceptDanger) {
4004424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Download a file that will be marked dangerous; click the browser action
4005424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // button; the browser action poup will call acceptDanger(); when the
4006424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // DownloadDangerPrompt is created, pretend that the user clicks the Accept
4007424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // button; wait until the download completes.
4008424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LoadExtension("downloads_split");
4009424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
4010424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      new DownloadsDownloadFunction(),
4011424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[{\"url\": \"data:,\", \"filename\": \"dangerous.swf\"}]"));
4012424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(result.get());
4013424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int result_id = -1;
4014424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(result->GetAsInteger(&result_id));
4015424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
4016424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(item);
40175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
40185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      base::StringPrintf(
40195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "[{\"id\": %d, "
40205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "  \"danger\": {"
40215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"previous\": \"safe\","
40225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          "    \"current\": \"file\"}}]",
40235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          result_id)));
4024424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(item->IsDangerous());
4025424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ScopedCancellingItem canceller(item);
4026424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<content::DownloadTestObserver> observer(
4027424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      new content::DownloadTestObserverTerminal(
4028424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          GetCurrentManager(), 1,
4029424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE));
4030424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DownloadsAcceptDangerFunction::OnPromptCreatedCallback callback =
4031424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&OnDangerPromptCreated);
4032424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DownloadsAcceptDangerFunction::OnPromptCreatedForTesting(
4033424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      &callback);
4034424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  BrowserActionTestUtil(browser()).Press(0);
4035424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  observer->WaitForFinished();
4036424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
4037424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadsApiTest : public ExtensionApiTest {
4039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
4040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadsApiTest() {}
4041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~DownloadsApiTest() {}
4042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
4043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadsApiTest);
4044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
4045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) {
4048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("downloads")) << message_;
4049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4050558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4051558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST(DownloadInterruptReasonEnumsSynced,
4052558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch     DownloadInterruptReasonEnumsSynced) {
40535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define INTERRUPT_REASON(name, value)                                        \
40545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(InterruptReasonContentToExtension(                               \
40555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                content::DOWNLOAD_INTERRUPT_REASON_##name),                  \
40565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            downloads::INTERRUPT_REASON_##name);                             \
40575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(                                                                 \
40585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      InterruptReasonExtensionToContent(downloads::INTERRUPT_REASON_##name), \
4059558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content::DOWNLOAD_INTERRUPT_REASON_##name);
4060558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/download_interrupt_reason_values.h"
4061558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#undef INTERRUPT_REASON
4062558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
4063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(ExtensionDetermineDownloadFilenameInternal,
4065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch     ExtensionDetermineDownloadFilenameInternal) {
4066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string winner_id;
4067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::FilePath filename;
40685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  downloads::FilenameConflictAction conflict_action =
40695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY;
4070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionWarningSet warnings;
4071ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4072ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Empty incumbent determiner
4073ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  warnings.clear();
4074ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExtensionDownloadsEventRouter::DetermineFilenameInternal(
4075ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("a")),
40765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_OVERWRITE,
4077ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "suggester",
4078ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now(),
4079ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "",
4080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time(),
4081ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &winner_id,
4082ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &filename,
4083ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &conflict_action,
4084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &warnings);
4085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("suggester", winner_id);
4086ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value());
40875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action);
4088ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(warnings.empty());
4089ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4090ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Incumbent wins
4091ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  warnings.clear();
4092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExtensionDownloadsEventRouter::DetermineFilenameInternal(
4093ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("b")),
40945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_PROMPT,
4095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "suggester",
4096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - base::TimeDelta::FromDays(1),
4097ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "incumbent",
4098ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now(),
4099ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &winner_id,
4100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &filename,
4101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &conflict_action,
4102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &warnings);
4103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("incumbent", winner_id);
4104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value());
41055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action);
4106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(warnings.empty());
4107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ExtensionWarning::kDownloadFilenameConflict,
4108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            warnings.begin()->warning_type());
4109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("suggester", warnings.begin()->extension_id());
4110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Suggester wins
4112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  warnings.clear();
4113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExtensionDownloadsEventRouter::DetermineFilenameInternal(
4114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("b")),
41155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      downloads::FILENAME_CONFLICT_ACTION_PROMPT,
4116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "suggester",
4117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now(),
4118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "incumbent",
4119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - base::TimeDelta::FromDays(1),
4120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &winner_id,
4121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &filename,
4122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &conflict_action,
4123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &warnings);
4124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("suggester", winner_id);
4125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(FILE_PATH_LITERAL("b"), filename.value());
41265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_PROMPT, conflict_action);
4127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(warnings.empty());
4128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ExtensionWarning::kDownloadFilenameConflict,
4129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            warnings.begin()->warning_type());
4130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("incumbent", warnings.begin()->extension_id());
4131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
4132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
41335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace extensions
41345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // http://crbug.com/3061144
4136