Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/json/json_reader.h" | |
| 9 #include "base/json/json_writer.h" | |
| 10 #include "base/message_loop.h" | |
| 8 #include "base/scoped_temp_dir.h" | 11 #include "base/scoped_temp_dir.h" |
| 12 #include "base/stl_util.h" | |
| 9 #include "base/stringprintf.h" | 13 #include "base/stringprintf.h" |
| 10 #include "chrome/browser/download/download_extension_api.h" | 14 #include "chrome/browser/download/download_extension_api.h" |
| 11 #include "chrome/browser/download/download_file_icon_extractor.h" | 15 #include "chrome/browser/download/download_file_icon_extractor.h" |
| 12 #include "chrome/browser/download/download_service.h" | 16 #include "chrome/browser/download/download_service.h" |
| 13 #include "chrome/browser/download/download_service_factory.h" | 17 #include "chrome/browser/download/download_service_factory.h" |
| 14 #include "chrome/browser/download/download_test_observer.h" | 18 #include "chrome/browser/download/download_test_observer.h" |
| 19 #include "chrome/browser/extensions/extension_apitest.h" | |
| 20 #include "chrome/browser/extensions/extension_event_names.h" | |
| 15 #include "chrome/browser/extensions/extension_function_test_utils.h" | 21 #include "chrome/browser/extensions/extension_function_test_utils.h" |
| 16 #include "chrome/browser/net/url_request_mock_util.h" | 22 #include "chrome/browser/net/url_request_mock_util.h" |
| 17 #include "chrome/browser/prefs/pref_service.h" | 23 #include "chrome/browser/prefs/pref_service.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/ui/browser.h" | 25 #include "chrome/browser/ui/browser.h" |
| 26 #include "chrome/browser/ui/tab_contents/tab_contents.h" | |
| 27 #include "chrome/common/chrome_notification_types.h" | |
| 20 #include "chrome/common/pref_names.h" | 28 #include "chrome/common/pref_names.h" |
| 21 #include "chrome/test/base/in_process_browser_test.h" | 29 #include "chrome/test/base/in_process_browser_test.h" |
| 22 #include "chrome/test/base/ui_test_utils.h" | 30 #include "chrome/test/base/ui_test_utils.h" |
| 31 #include "content/public/browser/browser_context.h" | |
| 23 #include "content/public/browser/browser_thread.h" | 32 #include "content/public/browser/browser_thread.h" |
| 33 #include "content/public/browser/download_item.h" | |
| 24 #include "content/public/browser/download_manager.h" | 34 #include "content/public/browser/download_manager.h" |
| 25 #include "content/public/browser/download_persistent_store_info.h" | 35 #include "content/public/browser/download_persistent_store_info.h" |
| 36 #include "content/public/browser/notification_service.h" | |
| 37 #include "content/public/browser/web_contents.h" | |
| 38 #include "content/public/common/page_transition_types.h" | |
| 26 #include "content/test/net/url_request_slow_download_job.h" | 39 #include "content/test/net/url_request_slow_download_job.h" |
| 27 #include "net/base/data_url.h" | 40 #include "net/base/data_url.h" |
| 28 #include "net/base/net_util.h" | 41 #include "net/base/net_util.h" |
| 29 #include "ui/gfx/codec/png_codec.h" | 42 #include "ui/gfx/codec/png_codec.h" |
| 43 #include "webkit/fileapi/file_system_context.h" | |
| 44 #include "webkit/fileapi/file_system_operation_interface.h" | |
| 30 | 45 |
| 31 using content::BrowserContext; | 46 using content::BrowserContext; |
| 32 using content::BrowserThread; | 47 using content::BrowserThread; |
| 33 using content::DownloadItem; | 48 using content::DownloadItem; |
| 34 using content::DownloadManager; | 49 using content::DownloadManager; |
| 35 using content::DownloadPersistentStoreInfo; | 50 using content::DownloadPersistentStoreInfo; |
| 36 | 51 |
| 37 namespace { | 52 namespace { |
| 38 | 53 |
| 39 // Comparator that orders download items by their ID. Can be used with | 54 // Comparator that orders download items by their ID. Can be used with |
| 40 // std::sort. | 55 // std::sort. |
| 41 struct DownloadIdComparator { | 56 struct DownloadIdComparator { |
| 42 bool operator() (DownloadItem* first, DownloadItem* second) { | 57 bool operator() (DownloadItem* first, DownloadItem* second) { |
| 43 return first->GetId() < second->GetId(); | 58 return first->GetId() < second->GetId(); |
| 44 } | 59 } |
| 45 }; | 60 }; |
| 46 | 61 |
| 47 class DownloadExtensionTest : public InProcessBrowserTest { | 62 class DownloadsEventsListener : public content::NotificationObserver { |
| 63 public: | |
| 64 // WaitFor() gives up after this many milliseconds, figuring that the event it | |
| 65 // wants will never happen so that a failing test doesn't take too long to | |
| 66 // fail. This may be too short on very busy machines, or too long on very fast | |
| 67 // ones. | |
| 68 static const int kTimeOutMs = -1; | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
The comment and the value (which I take to mean "i
benjhayden
2012/06/19 15:01:59
Done.
| |
| 69 | |
| 70 DownloadsEventsListener() | |
| 71 : waiting_(false) { | |
| 72 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, | |
| 73 content::NotificationService::AllSources()); | |
| 74 } | |
| 75 virtual ~DownloadsEventsListener() { | |
| 76 STLDeleteElements(&events_); | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Shouldn't this have a registrar_.Remove()?
benjhayden
2012/06/19 15:01:59
Done.
| |
| 77 } | |
| 78 | |
| 79 class Event { | |
| 80 public: | |
| 81 Event(Profile* profile, | |
| 82 const std::string& event_name, | |
| 83 const std::string& json_args, | |
| 84 base::Time caught) | |
| 85 : profile_(profile), | |
| 86 event_name_(event_name), | |
| 87 json_args_(json_args), | |
| 88 args_(base::JSONReader::Read(json_args)), | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Is there some location you can point to for the fo
benjhayden
2012/06/19 15:01:59
The structure of args_ depends on event_name. See
| |
| 89 caught_(caught) { | |
| 90 } | |
| 91 | |
| 92 const base::Time& caught() { return caught_; } | |
| 93 | |
| 94 bool Equals(const Event& other) { | |
| 95 if ((profile_ != other.profile_) || | |
| 96 (event_name_ != other.event_name_)) | |
| 97 return false; | |
| 98 if ((event_name_ == extension_event_names::kOnDownloadCreated || | |
| 99 event_name_ == extension_event_names::kOnDownloadChanged) && | |
| 100 args_.get() && | |
| 101 other.args_.get()) { | |
| 102 base::ListValue* left_list = NULL; | |
| 103 base::DictionaryValue* left_dict = NULL; | |
| 104 base::ListValue* right_list = NULL; | |
| 105 base::DictionaryValue* right_dict = NULL; | |
| 106 if (!args_->GetAsList(&left_list) || | |
| 107 !other.args_->GetAsList(&right_list) || | |
| 108 !left_list->GetDictionary(0, &left_dict) || | |
| 109 !right_list->GetDictionary(0, &right_dict)) | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Does this mean the Equals function returns false i
benjhayden
2012/06/19 15:01:59
For onCreated and onChanged events, yes.
| |
| 110 return false; | |
| 111 for (base::DictionaryValue::Iterator iter(*left_dict); | |
| 112 iter.HasNext(); iter.Advance()) { | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
nit: indent? (May be just formatting in Rietveld.
benjhayden
2012/06/19 15:01:59
Done.
| |
| 113 base::Value* right_value = NULL; | |
| 114 if (right_dict->HasKey(iter.key()) && | |
| 115 right_dict->Get(iter.key(), &right_value) && | |
| 116 !iter.value().Equals(right_value)) { | |
| 117 return false; | |
| 118 } | |
| 119 } | |
| 120 return true; | |
| 121 } else if ((event_name_ == extension_event_names::kOnDownloadErased) && | |
| 122 args_.get() && | |
| 123 other.args_.get()) { | |
| 124 int my_id = -1, other_id = -1; | |
| 125 return (args_->GetAsInteger(&my_id) && | |
| 126 other.args_->GetAsInteger(&other_id) && | |
| 127 my_id == other_id); | |
| 128 } | |
| 129 return json_args_ == other.json_args_; | |
| 130 } | |
| 131 | |
| 132 std::string Debug() { | |
| 133 return base::StringPrintf("Event(%p, %s, %s, %f)", | |
| 134 profile_, | |
| 135 event_name_.c_str(), | |
| 136 json_args_.c_str(), | |
| 137 caught_.ToJsTime()); | |
| 138 } | |
| 139 | |
| 140 private: | |
| 141 Profile* profile_; | |
| 142 std::string event_name_; | |
| 143 std::string json_args_; | |
| 144 scoped_ptr<base::Value> args_; | |
| 145 base::Time caught_; | |
| 146 | |
| 147 DISALLOW_COPY_AND_ASSIGN(Event); | |
| 148 }; | |
| 149 | |
| 150 typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource | |
| 151 DownloadsNotificationSource; | |
| 152 | |
| 153 void Observe(int type, const content::NotificationSource& source, | |
| 154 const content::NotificationDetails& details) { | |
| 155 switch (type) { | |
| 156 case chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT: | |
| 157 { | |
| 158 DownloadsNotificationSource* dns = | |
| 159 content::Source<DownloadsNotificationSource>(source).ptr(); | |
| 160 ObserveInternal(dns->profile, dns->event_name, | |
| 161 *content::Details<std::string>(details).ptr()); | |
| 162 break; | |
| 163 } | |
| 164 default: | |
| 165 NOTREACHED(); | |
| 166 } | |
| 167 } | |
| 168 | |
| 169 // This is public to accommodate the HTML5 FileSystem Files event. | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
I found this comment confusing when I first read i
benjhayden
2012/06/19 15:01:59
Done.
| |
| 170 void ObserveInternal(Profile* profile, const std::string& event_name, | |
| 171 const std::string& json_args) { | |
| 172 Event* new_event = new Event( | |
| 173 profile, event_name, json_args, base::Time::Now()); | |
| 174 events_.push_back(new_event); | |
| 175 if (waiting_ && | |
| 176 waiting_for_.get() && | |
| 177 waiting_for_->Equals(*new_event)) { | |
| 178 waiting_ = false; | |
| 179 MessageLoopForUI::current()->Quit(); | |
| 180 } | |
| 181 } | |
| 182 | |
| 183 bool WaitFor(int timeout_ms, | |
| 184 Profile* profile, | |
| 185 const std::string& event_name, | |
| 186 const std::string& json_args) { | |
| 187 waiting_for_.reset(new Event(profile, event_name, json_args, base::Time())); | |
| 188 for (std::deque<Event*>::const_iterator iter = events_.begin(); | |
| 189 iter != events_.end(); ++iter) { | |
| 190 if ((*iter)->Equals(*waiting_for_.get())) | |
| 191 return true; | |
| 192 } | |
| 193 waiting_ = true; | |
| 194 if (timeout_ms > 0) { | |
| 195 MessageLoop::current()->PostDelayedTask( | |
| 196 FROM_HERE, base::Bind( | |
| 197 &DownloadsEventsListener::TimedOut, base::Unretained(this)), | |
| 198 timeout_ms); | |
| 199 } | |
| 200 ui_test_utils::RunMessageLoop(); | |
| 201 bool success = !waiting_; | |
| 202 if (waiting_) { | |
| 203 // Print the events that were caught since the last WaitFor() call to help | |
| 204 // find the erroneous event. | |
| 205 // TODO(benjhayden) Fuzzy-match and highlight the erroneous event. | |
| 206 for (std::deque<Event*>::const_iterator iter = events_.begin(); | |
| 207 iter != events_.end(); ++iter) { | |
| 208 if ((*iter)->caught() > last_wait_) { | |
| 209 LOG(INFO) << "Caught " << (*iter)->Debug(); | |
| 210 } | |
| 211 } | |
| 212 if (waiting_for_.get()) { | |
| 213 LOG(INFO) << "Timed out waiting for " << waiting_for_->Debug(); | |
| 214 } | |
| 215 waiting_ = false; | |
| 216 } | |
| 217 waiting_for_.reset(); | |
| 218 last_wait_ = base::Time::Now(); | |
| 219 return success; | |
| 220 } | |
| 221 | |
| 222 bool WaitFor(Profile* profile, | |
| 223 const std::string& event_name, | |
| 224 const std::string& json_args) { | |
| 225 return WaitFor(kTimeOutMs, profile, event_name, json_args); | |
| 226 } | |
| 227 | |
| 228 private: | |
| 229 void TimedOut() { | |
| 230 if (!waiting_for_.get()) | |
| 231 return; | |
| 232 MessageLoopForUI::current()->Quit(); | |
| 233 } | |
| 234 | |
| 235 bool waiting_; | |
| 236 base::Time last_wait_; | |
| 237 scoped_ptr<Event> waiting_for_; | |
| 238 content::NotificationRegistrar registrar_; | |
| 239 std::deque<Event*> events_; | |
| 240 | |
| 241 DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener); | |
| 242 }; | |
| 243 | |
| 244 class DownloadExtensionTest : public ExtensionApiTest { | |
| 245 public: | |
| 246 DownloadExtensionTest() | |
| 247 : extension_(NULL), | |
| 248 incognito_browser_(NULL), | |
| 249 current_browser_(NULL) { | |
| 250 } | |
| 251 | |
| 252 void ObserveEvent(Profile* profile, const std::string& event_name, | |
| 253 const std::string& json_args) { | |
| 254 events_listener_->ObserveInternal(profile, event_name, json_args); | |
| 255 } | |
| 256 | |
| 48 protected: | 257 protected: |
| 49 // Used with CreateHistoryDownloads | 258 // Used with CreateHistoryDownloads |
| 50 struct HistoryDownloadInfo { | 259 struct HistoryDownloadInfo { |
| 51 // Filename to use. CreateHistoryDownloads will append this filename to the | 260 // Filename to use. CreateHistoryDownloads will append this filename to the |
| 52 // temporary downloads directory specified by downloads_directory(). | 261 // temporary downloads directory specified by downloads_directory(). |
| 53 const FilePath::CharType* filename; | 262 const FilePath::CharType* filename; |
| 54 | 263 |
| 55 // State for the download. Note that IN_PROGRESS downloads will be created | 264 // State for the download. Note that IN_PROGRESS downloads will be created |
| 56 // as CANCELLED. | 265 // as CANCELLED. |
| 57 DownloadItem::DownloadState state; | 266 DownloadItem::DownloadState state; |
| 58 | 267 |
| 59 // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS | 268 // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS |
| 60 // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT. | 269 // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT. |
| 61 content::DownloadDangerType danger_type; | 270 content::DownloadDangerType danger_type; |
| 62 }; | 271 }; |
| 63 | 272 |
| 64 virtual Browser* current_browser() { return browser(); } | 273 void LoadExtension(const char* name) { |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
I find this confusing; reasonable to put a comment
benjhayden
2012/06/19 15:01:59
Done.
| |
| 274 extension_ = LoadExtensionIncognito(test_data_dir_.AppendASCII(name)); | |
| 275 CHECK(extension_); | |
| 276 } | |
| 277 | |
| 278 Browser* current_browser() { return current_browser_; } | |
| 65 | 279 |
| 66 // InProcessBrowserTest | 280 // InProcessBrowserTest |
| 67 virtual void SetUpOnMainThread() OVERRIDE { | 281 virtual void SetUpOnMainThread() OVERRIDE { |
| 68 BrowserThread::PostTask( | 282 BrowserThread::PostTask( |
| 69 BrowserThread::IO, FROM_HERE, | 283 BrowserThread::IO, FROM_HERE, |
| 70 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); | 284 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); |
| 71 InProcessBrowserTest::SetUpOnMainThread(); | 285 InProcessBrowserTest::SetUpOnMainThread(); |
| 286 GoOnTheRecord(); | |
| 72 CreateAndSetDownloadsDirectory(); | 287 CreateAndSetDownloadsDirectory(); |
| 73 current_browser()->profile()->GetPrefs()->SetBoolean( | 288 current_browser()->profile()->GetPrefs()->SetBoolean( |
| 74 prefs::kPromptForDownload, false); | 289 prefs::kPromptForDownload, false); |
| 75 GetDownloadManager()->RemoveAllDownloads(); | 290 GetOnRecordManager()->RemoveAllDownloads(); |
| 291 events_listener_.reset(new DownloadsEventsListener()); | |
| 76 } | 292 } |
| 77 | 293 |
| 78 virtual DownloadManager* GetDownloadManager() { | 294 void GoOnTheRecord() { current_browser_ = browser(); } |
| 79 return BrowserContext::GetDownloadManager(current_browser()->profile()); | 295 |
| 296 void GoOffTheRecord() { | |
| 297 if (!incognito_browser_) { | |
| 298 incognito_browser_ = CreateIncognitoBrowser(); | |
| 299 GetOffRecordManager()->RemoveAllDownloads(); | |
| 300 } | |
| 301 current_browser_ = incognito_browser_; | |
| 302 } | |
| 303 | |
| 304 bool WaitFor(int timeout_ms, const std::string& event_name, | |
| 305 const std::string& json_args) { | |
| 306 return events_listener_->WaitFor( | |
| 307 timeout_ms, current_browser()->profile(), event_name, json_args); | |
| 308 } | |
| 309 | |
| 310 bool WaitFor(const std::string& event_name, const std::string& json_args) { | |
| 311 return events_listener_->WaitFor( | |
| 312 current_browser()->profile(), event_name, json_args); | |
| 313 } | |
| 314 | |
| 315 std::string GetURL(const char* path) { | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Why not test_server()->GetURL?
benjhayden
2012/06/19 15:01:59
Done.
| |
| 316 return base::StringPrintf("http://localhost:%d/%s", | |
| 317 test_server()->host_port_pair().port(), | |
| 318 path); | |
| 319 } | |
| 320 | |
| 321 std::string GetExtensionURL() { | |
| 322 return extension_->url().spec(); | |
| 323 } | |
| 324 | |
| 325 std::string GetFilename(const char* path) { | |
| 326 return downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe(); | |
| 327 } | |
| 328 | |
| 329 DownloadManager* GetOnRecordManager() { | |
| 330 return BrowserContext::GetDownloadManager(browser()->profile()); | |
| 331 } | |
| 332 DownloadManager* GetOffRecordManager() { | |
| 333 return BrowserContext::GetDownloadManager( | |
| 334 browser()->profile()->GetOffTheRecordProfile()); | |
| 335 } | |
| 336 DownloadManager* GetCurrentManager() { | |
| 337 return (current_browser_ == incognito_browser_) ? | |
| 338 GetOffRecordManager() : GetOnRecordManager(); | |
| 80 } | 339 } |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
I have mixed feelings about On/Off record state be
benjhayden
2012/06/19 15:01:59
I originally started with passing flags everywhere
| |
| 81 | 340 |
| 82 // Creates a set of history downloads based on the provided |history_info| | 341 // Creates a set of history downloads based on the provided |history_info| |
| 83 // array. |count| is the number of elements in |history_info|. On success, | 342 // array. |count| is the number of elements in |history_info|. On success, |
| 84 // |items| will contain |count| DownloadItems in the order that they were | 343 // |items| will contain |count| DownloadItems in the order that they were |
| 85 // specified in |history_info|. Returns true on success and false otherwise. | 344 // specified in |history_info|. Returns true on success and false otherwise. |
| 86 bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info, | 345 bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info, |
| 87 size_t count, | 346 size_t count, |
| 88 DownloadManager::DownloadVector* items) { | 347 DownloadManager::DownloadVector* items) { |
| 89 DownloadIdComparator download_id_comparator; | 348 DownloadIdComparator download_id_comparator; |
| 90 base::Time current = base::Time::Now(); | 349 base::Time current = base::Time::Now(); |
| 91 std::vector<DownloadPersistentStoreInfo> entries; | 350 std::vector<DownloadPersistentStoreInfo> entries; |
| 92 entries.reserve(count); | 351 entries.reserve(count); |
| 93 for (size_t i = 0; i < count; ++i) { | 352 for (size_t i = 0; i < count; ++i) { |
| 94 DownloadPersistentStoreInfo entry( | 353 DownloadPersistentStoreInfo entry( |
| 95 downloads_directory().Append(history_info[i].filename), | 354 downloads_directory().Append(history_info[i].filename), |
| 96 GURL(), GURL(), // URL, referrer | 355 GURL(), GURL(), // URL, referrer |
| 97 current, current, // start_time, end_time | 356 current, current, // start_time, end_time |
| 98 1, 1, // received_bytes, total_bytes | 357 1, 1, // received_bytes, total_bytes |
| 99 history_info[i].state, // state | 358 history_info[i].state, // state |
| 100 i + 1, // db_handle | 359 i + 1, // db_handle |
| 101 false); // opened | 360 false); // opened |
| 102 entries.push_back(entry); | 361 entries.push_back(entry); |
| 103 } | 362 } |
| 104 GetDownloadManager()->OnPersistentStoreQueryComplete(&entries); | 363 GetOnRecordManager()->OnPersistentStoreQueryComplete(&entries); |
| 105 GetDownloadManager()->GetAllDownloads(FilePath(), items); | 364 GetOnRecordManager()->GetAllDownloads(FilePath(), items); |
| 106 EXPECT_EQ(count, items->size()); | 365 EXPECT_EQ(count, items->size()); |
| 107 if (count != items->size()) | 366 if (count != items->size()) |
| 108 return false; | 367 return false; |
| 109 | 368 |
| 110 // Order by ID so that they are in the order that we created them. | 369 // Order by ID so that they are in the order that we created them. |
| 111 std::sort(items->begin(), items->end(), download_id_comparator); | 370 std::sort(items->begin(), items->end(), download_id_comparator); |
| 112 // Set the danger type if necessary. | 371 // Set the danger type if necessary. |
| 113 for (size_t i = 0; i < count; ++i) { | 372 for (size_t i = 0; i < count; ++i) { |
| 114 if (history_info[i].danger_type != | 373 if (history_info[i].danger_type != |
| 115 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) { | 374 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 129 GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); | 388 GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); |
| 130 ui_test_utils::NavigateToURLWithDisposition( | 389 ui_test_utils::NavigateToURLWithDisposition( |
| 131 current_browser(), slow_download_url, CURRENT_TAB, | 390 current_browser(), slow_download_url, CURRENT_TAB, |
| 132 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 391 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 133 observer->WaitForFinished(); | 392 observer->WaitForFinished(); |
| 134 EXPECT_EQ( | 393 EXPECT_EQ( |
| 135 1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); | 394 1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); |
| 136 // We don't expect a select file dialog. | 395 // We don't expect a select file dialog. |
| 137 ASSERT_FALSE(observer->select_file_dialog_seen()); | 396 ASSERT_FALSE(observer->select_file_dialog_seen()); |
| 138 } | 397 } |
| 139 GetDownloadManager()->GetAllDownloads(FilePath(), items); | 398 GetCurrentManager()->GetAllDownloads(FilePath(), items); |
| 140 ASSERT_EQ(count, items->size()); | 399 ASSERT_EQ(count, items->size()); |
| 141 } | 400 } |
| 142 | 401 |
| 143 DownloadItem* CreateSlowTestDownload() { | 402 DownloadItem* CreateSlowTestDownload() { |
| 144 scoped_ptr<DownloadTestObserver> observer( | 403 scoped_ptr<DownloadTestObserver> observer( |
| 145 CreateInProgressDownloadObserver(1)); | 404 CreateInProgressDownloadObserver(1)); |
| 146 GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); | 405 GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); |
| 147 DownloadManager* manager = GetDownloadManager(); | 406 DownloadManager* manager = GetCurrentManager(); |
| 148 | 407 |
| 149 EXPECT_EQ(0, manager->InProgressCount()); | 408 EXPECT_EQ(0, manager->InProgressCount()); |
| 150 if (manager->InProgressCount() != 0) | 409 if (manager->InProgressCount() != 0) |
| 151 return NULL; | 410 return NULL; |
| 152 | 411 |
| 153 ui_test_utils::NavigateToURLWithDisposition( | 412 ui_test_utils::NavigateToURLWithDisposition( |
| 154 current_browser(), slow_download_url, CURRENT_TAB, | 413 current_browser(), slow_download_url, CURRENT_TAB, |
| 155 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 414 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 156 | 415 |
| 157 observer->WaitForFinished(); | 416 observer->WaitForFinished(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 181 GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); | 440 GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); |
| 182 ui_test_utils::NavigateToURLWithDisposition( | 441 ui_test_utils::NavigateToURLWithDisposition( |
| 183 current_browser(), finish_url, NEW_FOREGROUND_TAB, | 442 current_browser(), finish_url, NEW_FOREGROUND_TAB, |
| 184 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 443 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 185 observer->WaitForFinished(); | 444 observer->WaitForFinished(); |
| 186 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); | 445 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); |
| 187 } | 446 } |
| 188 | 447 |
| 189 DownloadTestObserver* CreateDownloadObserver(size_t download_count) { | 448 DownloadTestObserver* CreateDownloadObserver(size_t download_count) { |
| 190 return new DownloadTestObserverTerminal( | 449 return new DownloadTestObserverTerminal( |
| 191 GetDownloadManager(), download_count, true, | 450 GetCurrentManager(), download_count, true, |
| 192 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); | 451 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); |
| 193 } | 452 } |
| 194 | 453 |
| 195 DownloadTestObserver* CreateInProgressDownloadObserver( | 454 DownloadTestObserver* CreateInProgressDownloadObserver( |
| 196 size_t download_count) { | 455 size_t download_count) { |
| 197 return new DownloadTestObserverInProgress(GetDownloadManager(), | 456 return new DownloadTestObserverInProgress( |
| 198 download_count, | 457 GetCurrentManager(), download_count, true); |
| 199 true); | 458 } |
| 459 | |
| 460 bool RunFunction(UIThreadExtensionFunction* function, | |
| 461 const std::string& args) { | |
| 462 scoped_refptr<UIThreadExtensionFunction> delete_function(function); | |
| 463 SetUpExtensionFunction(function); | |
| 464 return extension_function_test_utils::RunFunction( | |
| 465 function, args, browser(), GetFlags()); | |
| 200 } | 466 } |
| 201 | 467 |
| 202 extension_function_test_utils::RunFunctionFlags GetFlags() { | 468 extension_function_test_utils::RunFunctionFlags GetFlags() { |
| 203 return current_browser()->profile()->IsOffTheRecord() ? | 469 return current_browser()->profile()->IsOffTheRecord() ? |
| 204 extension_function_test_utils::INCLUDE_INCOGNITO : | 470 extension_function_test_utils::INCLUDE_INCOGNITO : |
| 205 extension_function_test_utils::NONE; | 471 extension_function_test_utils::NONE; |
| 206 } | 472 } |
| 207 | 473 |
| 208 // extension_function_test_utils::RunFunction*() only uses browser for its | 474 // extension_function_test_utils::RunFunction*() only uses browser for its |
| 209 // profile(), so pass it the on-record browser so that it always uses the | 475 // profile(), so pass it the on-record browser so that it always uses the |
| 210 // on-record profile. | 476 // on-record profile to match real-life behavior. |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Why does it match real-life behavior? Does this s
benjhayden
2012/06/19 15:01:59
Yes, ExtensionFunctions get the on-record profile
| |
| 211 | |
| 212 bool RunFunction(UIThreadExtensionFunction* function, | |
| 213 const std::string& args) { | |
| 214 // extension_function_test_utils::RunFunction() does not take | |
| 215 // ownership of |function|. | |
| 216 scoped_refptr<ExtensionFunction> function_owner(function); | |
| 217 return extension_function_test_utils::RunFunction( | |
| 218 function, args, browser(), GetFlags()); | |
| 219 } | |
| 220 | 477 |
| 221 base::Value* RunFunctionAndReturnResult(UIThreadExtensionFunction* function, | 478 base::Value* RunFunctionAndReturnResult(UIThreadExtensionFunction* function, |
| 222 const std::string& args) { | 479 const std::string& args) { |
| 480 SetUpExtensionFunction(function); | |
| 223 return extension_function_test_utils::RunFunctionAndReturnResult( | 481 return extension_function_test_utils::RunFunctionAndReturnResult( |
| 224 function, args, browser(), GetFlags()); | 482 function, args, browser(), GetFlags()); |
| 225 } | 483 } |
| 226 | 484 |
| 227 std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, | 485 std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, |
| 228 const std::string& args) { | 486 const std::string& args) { |
| 487 SetUpExtensionFunction(function); | |
| 229 return extension_function_test_utils::RunFunctionAndReturnError( | 488 return extension_function_test_utils::RunFunctionAndReturnError( |
| 230 function, args, browser(), GetFlags()); | 489 function, args, browser(), GetFlags()); |
| 231 } | 490 } |
| 232 | 491 |
| 233 bool RunFunctionAndReturnString(UIThreadExtensionFunction* function, | 492 bool RunFunctionAndReturnString(UIThreadExtensionFunction* function, |
| 234 const std::string& args, | 493 const std::string& args, |
| 235 std::string* result_string) { | 494 std::string* result_string) { |
| 495 SetUpExtensionFunction(function); | |
| 236 scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args)); | 496 scoped_ptr<base::Value> result(RunFunctionAndReturnResult(function, args)); |
| 237 EXPECT_TRUE(result.get()); | 497 EXPECT_TRUE(result.get()); |
| 238 return result.get() && result->GetAsString(result_string); | 498 return result.get() && result->GetAsString(result_string); |
| 239 } | 499 } |
| 240 | 500 |
| 241 std::string DownloadItemIdAsArgList(const DownloadItem* download_item) { | 501 std::string DownloadItemIdAsArgList(const DownloadItem* download_item) { |
| 242 return base::StringPrintf("[%d]", download_item->GetId()); | 502 return base::StringPrintf("[%d]", download_item->GetId()); |
| 243 } | 503 } |
| 244 | 504 |
| 245 // Checks if a data URL encoded image is a PNG of a given size. | 505 // Checks if a data URL encoded image is a PNG of a given size. |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 263 &width, &height)); | 523 &width, &height)); |
| 264 EXPECT_EQ(expected_size, width); | 524 EXPECT_EQ(expected_size, width); |
| 265 EXPECT_EQ(expected_size, height); | 525 EXPECT_EQ(expected_size, height); |
| 266 } | 526 } |
| 267 | 527 |
| 268 const FilePath& downloads_directory() { | 528 const FilePath& downloads_directory() { |
| 269 return downloads_directory_.path(); | 529 return downloads_directory_.path(); |
| 270 } | 530 } |
| 271 | 531 |
| 272 private: | 532 private: |
| 533 void SetUpExtensionFunction(UIThreadExtensionFunction* function) { | |
| 534 if (extension_) { | |
| 535 // Recreate the tab each time for insulation. | |
| 536 TabContents* tab = current_browser()->AddSelectedTabWithURL( | |
| 537 extension_->GetResourceURL("empty.html"), | |
| 538 content::PAGE_TRANSITION_LINK); | |
| 539 function->set_extension(extension_); | |
| 540 function->SetRenderViewHost(tab->web_contents()->GetRenderViewHost()); | |
| 541 } | |
| 542 } | |
| 543 | |
| 273 void CreateAndSetDownloadsDirectory() { | 544 void CreateAndSetDownloadsDirectory() { |
| 274 ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir()); | 545 ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir()); |
| 275 current_browser()->profile()->GetPrefs()->SetFilePath( | 546 current_browser()->profile()->GetPrefs()->SetFilePath( |
| 276 prefs::kDownloadDefaultDirectory, | 547 prefs::kDownloadDefaultDirectory, |
| 277 downloads_directory_.path()); | 548 downloads_directory_.path()); |
| 278 } | 549 } |
| 279 | 550 |
| 280 ScopedTempDir downloads_directory_; | 551 ScopedTempDir downloads_directory_; |
| 281 }; | 552 const extensions::Extension* extension_; |
| 282 | |
| 283 class DownloadExtensionTestIncognito : public DownloadExtensionTest { | |
| 284 public: | |
| 285 virtual Browser* current_browser() OVERRIDE { return current_browser_; } | |
| 286 | |
| 287 virtual void SetUpOnMainThread() OVERRIDE { | |
| 288 GoOnTheRecord(); | |
| 289 DownloadExtensionTest::SetUpOnMainThread(); | |
| 290 incognito_browser_ = CreateIncognitoBrowser(); | |
| 291 GoOffTheRecord(); | |
| 292 GetDownloadManager()->RemoveAllDownloads(); | |
| 293 } | |
| 294 | |
| 295 void GoOnTheRecord() { current_browser_ = browser(); } | |
| 296 void GoOffTheRecord() { current_browser_ = incognito_browser_; } | |
| 297 | |
| 298 private: | |
| 299 Browser* incognito_browser_; | 553 Browser* incognito_browser_; |
| 300 Browser* current_browser_; | 554 Browser* current_browser_; |
| 555 scoped_ptr<DownloadsEventsListener> events_listener_; | |
| 556 | |
| 557 DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest); | |
| 301 }; | 558 }; |
| 302 | 559 |
| 303 class MockIconExtractorImpl : public DownloadFileIconExtractor { | 560 class MockIconExtractorImpl : public DownloadFileIconExtractor { |
| 304 public: | 561 public: |
| 305 MockIconExtractorImpl(const FilePath& path, IconLoader::IconSize icon_size, | 562 MockIconExtractorImpl(const FilePath& path, IconLoader::IconSize icon_size, |
| 306 const std::string& response) | 563 const std::string& response) |
| 307 : expected_path_(path), | 564 : expected_path_(path), |
| 308 expected_icon_size_(icon_size), | 565 expected_icon_size_(icon_size), |
| 309 response_(response) { | 566 response_(response) { |
| 310 } | 567 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 if ((*item)->IsInProgress()) | 626 if ((*item)->IsInProgress()) |
| 370 (*item)->Cancel(true); | 627 (*item)->Cancel(true); |
| 371 } | 628 } |
| 372 } | 629 } |
| 373 | 630 |
| 374 private: | 631 private: |
| 375 DownloadManager::DownloadVector* items_; | 632 DownloadManager::DownloadVector* items_; |
| 376 DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); | 633 DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); |
| 377 }; | 634 }; |
| 378 | 635 |
| 379 } // namespace | 636 void FileCreated(const std::string& url, const base::Closure& done, |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Could you put two comments here, one that these fu
benjhayden
2012/06/19 15:01:59
Done.
| |
| 637 base::PlatformFileError result) { | |
| 638 CHECK(BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done)); | |
| 639 } | |
| 640 | |
| 641 void CreateFileOnIOThread(fileapi::FileSystemOperationInterface* operation, | |
| 642 const base::Closure& done, | |
| 643 const std::string& url) { | |
| 644 operation->CreateFile(GURL(url), | |
| 645 true/*exclusive*/, | |
| 646 base::Bind(&FileCreated, url, done)); | |
| 647 } | |
| 648 | |
| 649 void OpenFileSystemCallback(fileapi::FileSystemContext* fs, | |
| 650 const std::string& filename, | |
| 651 const base::Closure& done, | |
| 652 base::PlatformFileError result, | |
| 653 const std::string& fs_name, | |
| 654 const GURL& root) { | |
| 655 fileapi::FileSystemOperationInterface* operation = | |
| 656 fs->CreateFileSystemOperation(root); | |
| 657 CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind( | |
| 658 &CreateFileOnIOThread, operation, done, root.spec() + filename))); | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
nit: indent? (Again not sure about Rietveld forma
benjhayden
2012/06/19 15:01:59
Looks right to me. The previous line ends with a p
Randy Smith (Not in Mondays)
2012/06/19 19:23:23
Right--did the alignment wrong in my head. Ooops.
| |
| 659 } | |
| 660 | |
| 661 } // namespace | |
| 380 | 662 |
| 381 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsApi_PauseResumeCancel) { | 663 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsApi_PauseResumeCancel) { |
| 382 DownloadItem* download_item = CreateSlowTestDownload(); | 664 DownloadItem* download_item = CreateSlowTestDownload(); |
| 383 ASSERT_TRUE(download_item); | 665 ASSERT_TRUE(download_item); |
| 384 | 666 |
| 385 // Call pause(). It should succeed and the download should be paused on | 667 // Call pause(). It should succeed and the download should be paused on |
| 386 // return. | 668 // return. |
| 387 EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), | 669 EXPECT_TRUE(RunFunction(new DownloadsPauseFunction(), |
| 388 DownloadItemIdAsArgList(download_item))); | 670 DownloadItemIdAsArgList(download_item))); |
| 389 EXPECT_TRUE(download_item->IsPaused()); | 671 EXPECT_TRUE(download_item->IsPaused()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 423 new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item)); | 705 new DownloadsPauseFunction(), DownloadItemIdAsArgList(download_item)); |
| 424 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 706 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 425 error.c_str()); | 707 error.c_str()); |
| 426 | 708 |
| 427 // Calling resume on a non-active download yields kInvalidOperationError | 709 // Calling resume on a non-active download yields kInvalidOperationError |
| 428 error = RunFunctionAndReturnError( | 710 error = RunFunctionAndReturnError( |
| 429 new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item)); | 711 new DownloadsResumeFunction(), DownloadItemIdAsArgList(download_item)); |
| 430 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 712 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 431 error.c_str()); | 713 error.c_str()); |
| 432 | 714 |
| 433 // Calling pause()/resume()/cancel() with invalid download Ids is | 715 // Calling paused on a non-existent download yields kInvalidOperationError. |
| 434 // tested in the API test (DownloadsApiTest). | 716 error = RunFunctionAndReturnError( |
| 717 new DownloadsPauseFunction(), "[-42]"); | |
| 718 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | |
| 719 error.c_str()); | |
| 720 | |
| 721 // Calling resume on a non-existent download yields kInvalidOperationError | |
| 722 error = RunFunctionAndReturnError( | |
| 723 new DownloadsResumeFunction(), "[-42]"); | |
| 724 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | |
| 725 error.c_str()); | |
| 435 } | 726 } |
| 436 | 727 |
| 437 // Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted | 728 // Test downloads.getFileIcon() on in-progress, finished, cancelled and deleted |
| 438 // download items. | 729 // download items. |
| 439 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsApi_FileIcon_Active) { | 730 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsApi_FileIcon_Active) { |
| 440 DownloadItem* download_item = CreateSlowTestDownload(); | 731 DownloadItem* download_item = CreateSlowTestDownload(); |
| 441 ASSERT_TRUE(download_item); | 732 ASSERT_TRUE(download_item); |
| 442 | 733 |
| 443 // Get the icon for the in-progress download. This call should succeed even | 734 // Get the icon for the in-progress download. This call should succeed even |
| 444 // if the file type isn't registered. | 735 // if the file type isn't registered. |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 519 expected_path, IconLoader::NORMAL, "")); | 810 expected_path, IconLoader::NORMAL, "")); |
| 520 std::string error = RunFunctionAndReturnError(function.release(), args); | 811 std::string error = RunFunctionAndReturnError(function.release(), args); |
| 521 EXPECT_STREQ(download_extension_errors::kIconNotFoundError, | 812 EXPECT_STREQ(download_extension_errors::kIconNotFoundError, |
| 522 error.c_str()); | 813 error.c_str()); |
| 523 | 814 |
| 524 // Once the download item is deleted, we should return kInvalidOperationError. | 815 // Once the download item is deleted, we should return kInvalidOperationError. |
| 525 download_item->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); | 816 download_item->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); |
| 526 error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args); | 817 error = RunFunctionAndReturnError(new DownloadsGetFileIconFunction(), args); |
| 527 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 818 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 528 error.c_str()); | 819 error.c_str()); |
| 529 | |
| 530 // Asking for icons of other (invalid) sizes is tested in the API test | |
| 531 // (DownloadsApiTest). | |
| 532 } | 820 } |
| 533 | 821 |
| 534 // Test that we can acquire file icons for history downloads regardless of | 822 // Test that we can acquire file icons for history downloads regardless of |
| 535 // whether they exist or not. If the file doesn't exist we should receive a | 823 // whether they exist or not. If the file doesn't exist we should receive a |
| 536 // generic icon from the OS/toolkit that may or may not be specific to the file | 824 // generic icon from the OS/toolkit that may or may not be specific to the file |
| 537 // type. | 825 // type. |
| 538 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsApi_FileIcon_History) { | 826 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsApi_FileIcon_History) { |
| 539 const HistoryDownloadInfo kHistoryInfo[] = { | 827 const HistoryDownloadInfo kHistoryInfo[] = { |
| 540 { FILE_PATH_LITERAL("real.txt"), | 828 { FILE_PATH_LITERAL("real.txt"), |
| 541 DownloadItem::COMPLETE, | 829 DownloadItem::COMPLETE, |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 812 base::ListValue* result_list = NULL; | 1100 base::ListValue* result_list = NULL; |
| 813 ASSERT_TRUE(result->GetAsList(&result_list)); | 1101 ASSERT_TRUE(result->GetAsList(&result_list)); |
| 814 ASSERT_EQ(1UL, result_list->GetSize()); | 1102 ASSERT_EQ(1UL, result_list->GetSize()); |
| 815 base::DictionaryValue* item_value = NULL; | 1103 base::DictionaryValue* item_value = NULL; |
| 816 ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); | 1104 ASSERT_TRUE(result_list->GetDictionary(0, &item_value)); |
| 817 FilePath::StringType item_name; | 1105 FilePath::StringType item_name; |
| 818 ASSERT_TRUE(item_value->GetString("filename", &item_name)); | 1106 ASSERT_TRUE(item_value->GetString("filename", &item_name)); |
| 819 ASSERT_EQ(items[2]->GetFullPath().value(), item_name); | 1107 ASSERT_EQ(items[2]->GetFullPath().value(), item_name); |
| 820 } | 1108 } |
| 821 | 1109 |
| 822 IN_PROC_BROWSER_TEST_F(DownloadExtensionTestIncognito, | 1110 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
| 823 DownloadsApi_SearchIncognito) { | 1111 DownloadExtensionTest_SearchIncognito) { |
| 824 scoped_ptr<base::Value> result_value; | 1112 scoped_ptr<base::Value> result_value; |
| 825 base::ListValue* result_list = NULL; | 1113 base::ListValue* result_list = NULL; |
| 826 base::DictionaryValue* result_dict = NULL; | 1114 base::DictionaryValue* result_dict = NULL; |
| 827 FilePath::StringType filename; | 1115 FilePath::StringType filename; |
| 828 bool is_incognito = false; | 1116 bool is_incognito = false; |
| 829 std::string error; | 1117 std::string error; |
| 830 std::string on_item_arg; | 1118 std::string on_item_arg; |
| 831 std::string off_item_arg; | 1119 std::string off_item_arg; |
| 832 std::string result_string; | 1120 std::string result_string; |
| 833 | 1121 |
| 834 // Set up one on-record item and one off-record item. | 1122 // Set up one on-record item and one off-record item. |
| 1123 GoOffTheRecord(); | |
| 1124 DownloadItem* off_item = CreateSlowTestDownload(); | |
| 1125 ASSERT_TRUE(off_item); | |
| 1126 ASSERT_TRUE(off_item->IsOtr()); | |
| 1127 off_item_arg = DownloadItemIdAsArgList(off_item); | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Why reverse the order? Any particular reason? If
benjhayden
2012/06/19 15:01:59
Done.
| |
| 835 | 1128 |
| 836 GoOnTheRecord(); | 1129 GoOnTheRecord(); |
| 837 DownloadItem* on_item = CreateSlowTestDownload(); | 1130 DownloadItem* on_item = CreateSlowTestDownload(); |
| 838 ASSERT_TRUE(on_item); | 1131 ASSERT_TRUE(on_item); |
| 839 ASSERT_FALSE(on_item->IsOtr()); | 1132 ASSERT_FALSE(on_item->IsOtr()); |
| 840 on_item_arg = DownloadItemIdAsArgList(on_item); | 1133 on_item_arg = DownloadItemIdAsArgList(on_item); |
| 841 | |
| 842 GoOffTheRecord(); | |
| 843 DownloadItem* off_item = CreateSlowTestDownload(); | |
| 844 ASSERT_TRUE(off_item); | |
| 845 ASSERT_TRUE(off_item->IsOtr()); | |
| 846 ASSERT_TRUE(on_item->GetFullPath() != off_item->GetFullPath()); | 1134 ASSERT_TRUE(on_item->GetFullPath() != off_item->GetFullPath()); |
| 847 off_item_arg = DownloadItemIdAsArgList(off_item); | |
| 848 | 1135 |
| 849 // Extensions running in the incognito window should have access to both | 1136 // Extensions running in the incognito window should have access to both |
| 850 // items because the Test extension is in spanning mode. | 1137 // items because the Test extension is in spanning mode. |
| 1138 GoOffTheRecord(); | |
| 851 result_value.reset(RunFunctionAndReturnResult( | 1139 result_value.reset(RunFunctionAndReturnResult( |
| 852 new DownloadsSearchFunction(), "[{}]")); | 1140 new DownloadsSearchFunction(), "[{}]")); |
| 853 ASSERT_TRUE(result_value.get()); | 1141 ASSERT_TRUE(result_value.get()); |
| 854 ASSERT_TRUE(result_value->GetAsList(&result_list)); | 1142 ASSERT_TRUE(result_value->GetAsList(&result_list)); |
| 855 ASSERT_EQ(2UL, result_list->GetSize()); | 1143 ASSERT_EQ(2UL, result_list->GetSize()); |
| 856 ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); | 1144 ASSERT_TRUE(result_list->GetDictionary(0, &result_dict)); |
| 857 ASSERT_TRUE(result_dict->GetString("filename", &filename)); | 1145 ASSERT_TRUE(result_dict->GetString("filename", &filename)); |
| 858 ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); | 1146 ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito)); |
| 859 EXPECT_TRUE(on_item->GetFullPath() == FilePath(filename)); | 1147 EXPECT_TRUE(on_item->GetFullPath() == FilePath(filename)); |
| 860 EXPECT_FALSE(is_incognito); | 1148 EXPECT_FALSE(is_incognito); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 886 error = RunFunctionAndReturnError(new DownloadsResumeFunction(), | 1174 error = RunFunctionAndReturnError(new DownloadsResumeFunction(), |
| 887 off_item_arg); | 1175 off_item_arg); |
| 888 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 1176 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 889 error.c_str()); | 1177 error.c_str()); |
| 890 error = RunFunctionAndReturnError( | 1178 error = RunFunctionAndReturnError( |
| 891 new DownloadsGetFileIconFunction(), | 1179 new DownloadsGetFileIconFunction(), |
| 892 base::StringPrintf("[%d, {}]", off_item->GetId())); | 1180 base::StringPrintf("[%d, {}]", off_item->GetId())); |
| 893 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 1181 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 894 error.c_str()); | 1182 error.c_str()); |
| 895 | 1183 |
| 896 // TODO(benjhayden): Test incognito_split_mode() extension. | |
| 897 // TODO(benjhayden): Test download(), onCreated, onChanged, onErased. | |
| 898 | |
| 899 GoOffTheRecord(); | 1184 GoOffTheRecord(); |
| 900 | 1185 |
| 901 // Do the FileIcon test for both the on- and off-items while off the record. | 1186 // Do the FileIcon test for both the on- and off-items while off the record. |
| 902 // NOTE(benjhayden): This does not include the FileIcon test from history, | 1187 // NOTE(benjhayden): This does not include the FileIcon test from history, |
| 903 // just active downloads. This shouldn't be a problem. | 1188 // just active downloads. This shouldn't be a problem. |
| 904 EXPECT_TRUE(RunFunctionAndReturnString( | 1189 EXPECT_TRUE(RunFunctionAndReturnString( |
| 905 new DownloadsGetFileIconFunction(), | 1190 new DownloadsGetFileIconFunction(), |
| 906 base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string)); | 1191 base::StringPrintf("[%d, {}]", on_item->GetId()), &result_string)); |
| 907 EXPECT_TRUE(RunFunctionAndReturnString( | 1192 EXPECT_TRUE(RunFunctionAndReturnString( |
| 908 new DownloadsGetFileIconFunction(), | 1193 new DownloadsGetFileIconFunction(), |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 946 EXPECT_TRUE(off_item->IsCancelled()); | 1231 EXPECT_TRUE(off_item->IsCancelled()); |
| 947 error = RunFunctionAndReturnError(new DownloadsPauseFunction(), | 1232 error = RunFunctionAndReturnError(new DownloadsPauseFunction(), |
| 948 off_item_arg); | 1233 off_item_arg); |
| 949 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 1234 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 950 error.c_str()); | 1235 error.c_str()); |
| 951 error = RunFunctionAndReturnError(new DownloadsResumeFunction(), | 1236 error = RunFunctionAndReturnError(new DownloadsResumeFunction(), |
| 952 off_item_arg); | 1237 off_item_arg); |
| 953 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 1238 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
| 954 error.c_str()); | 1239 error.c_str()); |
| 955 } | 1240 } |
| 1241 | |
| 1242 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1243 DownloadExtensionTest_DownloadsEventsListener) { | |
| 1244 // Test that DownloadsEventsListener times out quickly enough for an event | |
| 1245 // that isn't going to happen. | |
| 1246 ASSERT_FALSE(WaitFor(100, extension_event_names::kOnDownloadErased, "-1")); | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
What is this actually testing? Just that 100 != i
benjhayden
2012/06/19 15:01:59
This is actually testing that DownloadsEventsListe
Randy Smith (Not in Mondays)
2012/06/19 19:23:23
What you look to be testing is that WaitFor(100, .
benjhayden
2012/06/21 17:50:48
The test doesn't use the timeout, and I can always
| |
| 1247 } | |
| 1248 | |
| 1249 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1250 DownloadExtensionTest_Download_Basic) { | |
| 1251 LoadExtension("downloads_split"); | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
What does this do/what is it for? Some documentat
benjhayden
2012/06/19 15:01:59
Done.
Randy Smith (Not in Mondays)
2012/06/19 19:23:23
As discussed, maybe a comment in the downloads_spl
benjhayden
2012/06/21 17:50:48
Done.
| |
| 1252 CHECK(StartTestServer()); | |
| 1253 std::string download_url = GetURL("slow?0"); | |
| 1254 GoOnTheRecord(); | |
| 1255 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1256 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1257 "[{\"url\": \"%s\"}]", download_url.c_str()))); | |
| 1258 ASSERT_TRUE(result.get()); | |
| 1259 int result_id = -1; | |
| 1260 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1261 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1262 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1263 ASSERT_TRUE(item); | |
| 1264 ScopedCancellingItem canceller(item); | |
| 1265 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1266 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Doesn't this result in a hung test if the event ne
benjhayden
2012/06/19 15:01:59
Yep. See my new comments on kTimeOutMs.
| |
| 1267 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1268 " \"filename\": \"%s\"," | |
| 1269 " \"incognito\": false," | |
| 1270 " \"mime\": \"text/plain\"," | |
| 1271 " \"paused\": false," | |
| 1272 " \"url\": \"%s\"}]", | |
| 1273 GetFilename("slow.txt.crdownload").c_str(), | |
| 1274 download_url.c_str()))); | |
| 1275 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1276 base::StringPrintf("[{\"id\": %d," | |
| 1277 " \"filename\": {" | |
| 1278 " \"old\": \"%s\"," | |
| 1279 " \"new\": \"%s\"}," | |
| 1280 " \"state\": {" | |
| 1281 " \"old\": \"in_progress\"," | |
| 1282 " \"new\": \"complete\"}}]", | |
| 1283 result_id, | |
| 1284 GetFilename("slow.txt.crdownload").c_str(), | |
| 1285 GetFilename("slow.txt").c_str()))); | |
| 1286 } | |
| 1287 | |
| 1288 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1289 DownloadExtensionTest_Download_Incognito) { | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
If you're testing incognito, shouldn't part of tha
benjhayden
2012/06/19 15:01:59
That's tested in SearchIncognito.
| |
| 1290 LoadExtension("downloads_split"); | |
| 1291 CHECK(StartTestServer()); | |
| 1292 GoOffTheRecord(); | |
| 1293 std::string download_url = GetURL("slow?0"); | |
| 1294 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1295 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1296 "[{\"url\": \"%s\"}]", download_url.c_str()))); | |
| 1297 ASSERT_TRUE(result.get()); | |
| 1298 int result_id = -1; | |
| 1299 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1300 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1301 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1302 ASSERT_TRUE(item); | |
| 1303 ScopedCancellingItem canceller(item); | |
| 1304 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1305 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1306 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1307 " \"filename\": \"%s\"," | |
| 1308 " \"incognito\": true," | |
| 1309 " \"mime\": \"text/plain\"," | |
| 1310 " \"paused\": false," | |
| 1311 " \"url\": \"%s\"}]", | |
| 1312 GetFilename("slow.txt.crdownload").c_str(), | |
| 1313 download_url.c_str()))); | |
| 1314 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1315 base::StringPrintf("[{\"id\":%d," | |
| 1316 " \"filename\": {" | |
| 1317 " \"old\": \"%s\"," | |
| 1318 " \"new\": \"%s\"}," | |
| 1319 " \"state\": {" | |
| 1320 " \"new\": \"complete\"," | |
| 1321 " \"old\": \"in_progress\"}}]", | |
| 1322 result_id, | |
| 1323 GetFilename("slow.txt.crdownload").c_str(), | |
| 1324 GetFilename("slow.txt").c_str()))); | |
| 1325 } | |
| 1326 | |
| 1327 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1328 DownloadExtensionTest_Download_UnsafeHeaders) { | |
| 1329 LoadExtension("downloads_split"); | |
| 1330 CHECK(StartTestServer()); | |
| 1331 GoOnTheRecord(); | |
| 1332 // Test that we disallow certain headers case-insensitive. | |
| 1333 static const char* kUnsafeHeaders[] = { | |
| 1334 "Accept-chArsEt", | |
| 1335 "accept-eNcoding", | |
| 1336 "coNNection", | |
| 1337 "coNteNt-leNgth", | |
| 1338 "cooKIE", | |
| 1339 "cOOkie2", | |
| 1340 "coNteNt-traNsfer-eNcodiNg", | |
| 1341 "dAtE", | |
| 1342 "ExpEcT", | |
| 1343 "hOsT", | |
| 1344 "kEEp-aLivE", | |
| 1345 "rEfErEr", | |
| 1346 "tE", | |
| 1347 "trAilER", | |
| 1348 "trANsfer-eNcodiNg", | |
| 1349 "upGRAde", | |
| 1350 "usER-agENt", | |
| 1351 "viA", | |
| 1352 "pRoxY-", | |
| 1353 "sEc-", | |
| 1354 "pRoxY-probably-not-evil", | |
| 1355 "sEc-probably-not-evil", | |
| 1356 "oRiGiN", | |
| 1357 "Access-Control-Request-Headers", | |
| 1358 "Access-Control-Request-Method", | |
| 1359 }; | |
| 1360 for (size_t index = 0; index < arraysize(kUnsafeHeaders); ++index) { | |
| 1361 std::string download_url = GetURL("slow?0"); | |
| 1362 EXPECT_STREQ(download_extension_errors::kGenericError, | |
| 1363 RunFunctionAndReturnError(new DownloadsDownloadFunction(), | |
| 1364 base::StringPrintf( | |
| 1365 "[{\"url\": \"%s\"," | |
| 1366 " \"filename\": \"unsafe-header-%lu.txt\"," | |
| 1367 " \"headers\": [{" | |
| 1368 " \"name\": \"%s\"," | |
| 1369 " \"value\": \"unsafe\"}]}]", | |
| 1370 download_url.c_str(), index, kUnsafeHeaders[index])).c_str()); | |
| 1371 } | |
| 1372 } | |
| 1373 | |
| 1374 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1375 DownloadExtensionTest_Download_Subdirectory) { | |
| 1376 LoadExtension("downloads_split"); | |
| 1377 CHECK(StartTestServer()); | |
| 1378 // Test that subdirectories (slashes) are disallowed in filenames. | |
| 1379 // TODO(benjhayden) Update this when subdirectories are supported. | |
| 1380 std::string download_url = GetURL("slow?0"); | |
| 1381 GoOnTheRecord(); | |
| 1382 EXPECT_STREQ(download_extension_errors::kGenericError, | |
| 1383 RunFunctionAndReturnError(new DownloadsDownloadFunction(), | |
| 1384 base::StringPrintf( | |
| 1385 "[{\"url\": \"%s\"," | |
| 1386 " \"filename\": \"sub/dir/ect/ory.txt\"}]", | |
| 1387 download_url.c_str())).c_str()); | |
| 1388 } | |
| 1389 | |
| 1390 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1391 DownloadExtensionTest_Download_InvalidFilename) { | |
| 1392 LoadExtension("downloads_split"); | |
| 1393 CHECK(StartTestServer()); | |
| 1394 // Test that invalid filenames are disallowed. | |
| 1395 std::string download_url = GetURL("slow?0"); | |
| 1396 GoOnTheRecord(); | |
| 1397 EXPECT_STREQ(download_extension_errors::kGenericError, | |
| 1398 RunFunctionAndReturnError(new DownloadsDownloadFunction(), | |
| 1399 base::StringPrintf( | |
| 1400 "[{\"url\": \"%s\"," | |
| 1401 " \"filename\": \"../../../../../etc/passwd\"}]", | |
| 1402 download_url.c_str())).c_str()); | |
| 1403 } | |
| 1404 | |
| 1405 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1406 DownloadExtensionTest_Download_InvalidURLs) { | |
| 1407 LoadExtension("downloads_split"); | |
| 1408 GoOnTheRecord(); | |
| 1409 static const char* kInvalidURLs[] = { | |
| 1410 "foo bar", | |
| 1411 "../hello", | |
| 1412 "/hello", | |
| 1413 "google.com/", | |
| 1414 "http://", | |
| 1415 "#frag", | |
| 1416 "foo/bar.html#frag", | |
| 1417 "javascript:document.write(\\\"hello\\\");", | |
| 1418 "javascript:return false;", | |
| 1419 "ftp://example.com/example.txt", | |
| 1420 }; | |
| 1421 for (size_t index = 0; index < arraysize(kInvalidURLs); ++index) { | |
| 1422 EXPECT_STREQ(download_extension_errors::kInvalidURLError, | |
| 1423 RunFunctionAndReturnError(new DownloadsDownloadFunction(), | |
| 1424 base::StringPrintf( | |
| 1425 "[{\"url\": \"%s\"}]", kInvalidURLs[index])).c_str()); | |
| 1426 } | |
| 1427 } | |
| 1428 | |
| 1429 // TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to | |
| 1430 // permissions, test downloading from ftp. | |
| 1431 | |
| 1432 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1433 DownloadExtensionTest_Download_URLFragment) { | |
| 1434 LoadExtension("downloads_split"); | |
| 1435 CHECK(StartTestServer()); | |
| 1436 // Valid URLs plus fragments are still valid URLs. | |
| 1437 std::string download_url = GetURL("slow?0#fragment"); | |
| 1438 GoOnTheRecord(); | |
| 1439 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1440 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1441 "[{\"url\": \"%s\"}]", download_url.c_str()))); | |
| 1442 ASSERT_TRUE(result.get()); | |
| 1443 int result_id = -1; | |
| 1444 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1445 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1446 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1447 ASSERT_TRUE(item); | |
| 1448 ScopedCancellingItem canceller(item); | |
| 1449 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1450 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1451 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1452 " \"filename\": \"%s\"," | |
| 1453 " \"incognito\": false," | |
| 1454 " \"mime\": \"text/plain\"," | |
| 1455 " \"paused\": false," | |
| 1456 " \"url\": \"%s\"}]", | |
| 1457 GetFilename("slow.txt.crdownload").c_str(), | |
| 1458 download_url.c_str()))); | |
| 1459 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1460 base::StringPrintf("[{\"id\": %d," | |
| 1461 " \"filename\": {" | |
| 1462 " \"old\": \"%s\"," | |
| 1463 " \"new\": \"%s\"}," | |
| 1464 " \"state\": {" | |
| 1465 " \"old\": \"in_progress\"," | |
| 1466 " \"new\": \"complete\"}}]", | |
| 1467 result_id, | |
| 1468 GetFilename("slow.txt.crdownload").c_str(), | |
| 1469 GetFilename("slow.txt").c_str()))); | |
| 1470 } | |
| 1471 | |
| 1472 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1473 DownloadExtensionTest_Download_DataURL) { | |
| 1474 LoadExtension("downloads_split"); | |
| 1475 CHECK(StartTestServer()); | |
| 1476 std::string download_url = "data:text/plain,hello"; | |
| 1477 GoOnTheRecord(); | |
| 1478 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1479 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1480 "[{\"url\": \"%s\"," | |
| 1481 " \"filename\": \"data.txt\"}]", download_url.c_str()))); | |
| 1482 ASSERT_TRUE(result.get()); | |
| 1483 int result_id = -1; | |
| 1484 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1485 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1486 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1487 ASSERT_TRUE(item); | |
| 1488 ScopedCancellingItem canceller(item); | |
| 1489 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1490 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1491 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1492 " \"filename\": \"%s\"," | |
| 1493 " \"incognito\": false," | |
| 1494 " \"mime\": \"text/plain\"," | |
| 1495 " \"paused\": false," | |
| 1496 " \"url\": \"%s\"}]", | |
| 1497 GetFilename("data.txt.crdownload").c_str(), | |
| 1498 download_url.c_str()))); | |
| 1499 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1500 base::StringPrintf("[{\"id\": %d," | |
| 1501 " \"filename\": {" | |
| 1502 " \"old\": \"%s\"," | |
| 1503 " \"new\": \"%s\"}," | |
| 1504 " \"state\": {" | |
| 1505 " \"old\": \"in_progress\"," | |
| 1506 " \"new\": \"complete\"}}]", | |
| 1507 result_id, | |
| 1508 GetFilename("data.txt.crdownload").c_str(), | |
| 1509 GetFilename("data.txt").c_str()))); | |
| 1510 } | |
| 1511 | |
| 1512 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1513 DownloadExtensionTest_Download_File) { | |
| 1514 LoadExtension("downloads_split"); | |
| 1515 CHECK(StartTestServer()); | |
| 1516 // Valid file URLs are valid URLs. | |
| 1517 std::string download_url = "file:///"; | |
| 1518 GoOnTheRecord(); | |
| 1519 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1520 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1521 "[{\"url\": \"%s\"," | |
| 1522 " \"filename\": \"file.txt\"}]", download_url.c_str()))); | |
| 1523 ASSERT_TRUE(result.get()); | |
| 1524 int result_id = -1; | |
| 1525 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1526 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1527 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1528 ASSERT_TRUE(item); | |
| 1529 ScopedCancellingItem canceller(item); | |
| 1530 #if defined(OS_WIN) | |
| 1531 download_url += "/"; | |
| 1532 #endif | |
| 1533 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1534 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1535 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1536 " \"filename\": \"%s\"," | |
| 1537 " \"incognito\": false," | |
| 1538 " \"mime\": \"text/html\"," | |
| 1539 " \"paused\": false," | |
| 1540 " \"url\": \"%s\"}]", | |
| 1541 GetFilename("file.txt.crdownload").c_str(), | |
| 1542 download_url.c_str()))); | |
| 1543 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1544 base::StringPrintf("[{\"id\": %d," | |
| 1545 " \"filename\": {" | |
| 1546 " \"old\": \"%s\"," | |
| 1547 " \"new\": \"%s\"}," | |
| 1548 " \"state\": {" | |
| 1549 " \"old\": \"in_progress\"," | |
| 1550 " \"new\": \"complete\"}}]", | |
| 1551 result_id, | |
| 1552 GetFilename("file.txt.crdownload").c_str(), | |
| 1553 GetFilename("file.txt").c_str()))); | |
| 1554 } | |
| 1555 | |
| 1556 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1557 DownloadExtensionTest_Download_AuthBasic_Fail) { | |
| 1558 LoadExtension("downloads_split"); | |
| 1559 CHECK(StartTestServer()); | |
| 1560 std::string download_url = GetURL("auth-basic"); | |
| 1561 GoOnTheRecord(); | |
| 1562 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1563 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1564 "[{\"url\": \"%s\"," | |
| 1565 " \"filename\": \"auth-basic-fail.txt\"}]", | |
| 1566 download_url.c_str()))); | |
| 1567 ASSERT_TRUE(result.get()); | |
| 1568 int result_id = -1; | |
| 1569 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1570 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1571 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1572 ASSERT_TRUE(item); | |
| 1573 ScopedCancellingItem canceller(item); | |
| 1574 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1575 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1576 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1577 " \"incognito\": false," | |
| 1578 " \"mime\": \"text/html\"," | |
| 1579 " \"paused\": false," | |
| 1580 " \"url\": \"%s\"}]", | |
| 1581 download_url.c_str()))); | |
| 1582 // The item may or may not be interrupted before the onCreated event fires. | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
I'd add an explanatory line here or below (that in
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Also, this pattern seems to occur repeatedly in th
benjhayden
2012/06/19 15:01:59
Done.
benjhayden
2012/06/19 15:01:59
Done.
| |
| 1583 static const int kExpectedError = 30; | |
| 1584 if (item->IsInterrupted()) { | |
| 1585 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1586 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1587 " \"incognito\": false," | |
| 1588 " \"mime\": \"text/html\"," | |
| 1589 " \"paused\": false," | |
| 1590 " \"state\": \"interrupted\"," | |
| 1591 " \"error\": %d," | |
| 1592 " \"url\": \"%s\"}]", | |
| 1593 kExpectedError, | |
| 1594 download_url.c_str()))); | |
| 1595 } else { | |
| 1596 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1597 base::StringPrintf("[{\"id\": %d," | |
| 1598 " \"error\": {\"new\": 30}," | |
| 1599 " \"state\":{" | |
| 1600 " \"old\": \"in_progress\"," | |
| 1601 " \"new\":\"interrupted\"}}]", | |
| 1602 result_id))); | |
| 1603 } | |
| 1604 } | |
| 1605 | |
| 1606 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1607 DownloadExtensionTest_Download_Headers) { | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
It looks like this test is only testing that the s
benjhayden
2012/06/19 15:01:59
The test server verifies the expected_headers, and
| |
| 1608 LoadExtension("downloads_split"); | |
| 1609 CHECK(StartTestServer()); | |
| 1610 // Test the |header| download option. | |
| 1611 std::string download_url = GetURL("files/downloads/a_zip_file.zip?" | |
| 1612 "expected_headers=Foo:bar&expected_headers=Qx:yo"); | |
| 1613 GoOnTheRecord(); | |
| 1614 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1615 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1616 "[{\"url\": \"%s\"," | |
| 1617 " \"filename\": \"headers-succeed.txt\"," | |
| 1618 " \"headers\": [" | |
| 1619 " {\"name\": \"Foo\", \"value\": \"bar\"}," | |
| 1620 " {\"name\": \"Qx\", \"value\":\"yo\"}]}]", | |
| 1621 download_url.c_str()))); | |
| 1622 ASSERT_TRUE(result.get()); | |
| 1623 int result_id = -1; | |
| 1624 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1625 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1626 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1627 ASSERT_TRUE(item); | |
| 1628 ScopedCancellingItem canceller(item); | |
| 1629 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1630 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1631 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1632 " \"incognito\": false," | |
| 1633 " \"mime\": \"application/octet-stream\"," | |
| 1634 " \"paused\": false," | |
| 1635 " \"url\": \"%s\"}]", | |
| 1636 download_url.c_str()))); | |
| 1637 std::string incomplete_filename = GetFilename( | |
| 1638 "headers-succeed.txt.crdownload"); | |
| 1639 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1640 base::StringPrintf("[{\"id\": %d," | |
| 1641 " \"filename\": {" | |
| 1642 " \"old\": \"%s\"," | |
| 1643 " \"new\": \"%s\"}," | |
| 1644 " \"state\": {" | |
| 1645 " \"old\": \"in_progress\"," | |
| 1646 " \"new\": \"complete\"}}]", | |
| 1647 result_id, | |
| 1648 incomplete_filename.c_str(), | |
| 1649 GetFilename("headers-succeed.txt").c_str()))); | |
| 1650 } | |
| 1651 | |
| 1652 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
I think it's generally a good idea to have a line
benjhayden
2012/06/19 15:01:59
Done.
| |
| 1653 DownloadExtensionTest_Download_Headers_Fail) { | |
| 1654 LoadExtension("downloads_split"); | |
| 1655 CHECK(StartTestServer()); | |
| 1656 // Test that headers-succeed would fail if the resource requires the headers | |
| 1657 // and chrome fails to propagate them back to the server. This tests both | |
| 1658 // that testserver.py does not succeed when it should fail as well as how | |
| 1659 // the downloads extension api exposes the failure to extensions. | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
As well as that the api really does propagate the
benjhayden
2012/06/19 15:01:59
No, that's tested by DownloadExtensionTest_Downloa
| |
| 1660 std::string download_url = GetURL("files/downloads/a_zip_file.zip?" | |
| 1661 "expected_headers=Foo:bar&expected_headers=Qx:yo"); | |
| 1662 static const int kExpectedError = 33; | |
| 1663 GoOnTheRecord(); | |
| 1664 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1665 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1666 "[{\"url\": \"%s\"," | |
| 1667 " \"filename\": \"headers-fail.txt\"}]", | |
| 1668 download_url.c_str()))); | |
| 1669 ASSERT_TRUE(result.get()); | |
| 1670 int result_id = -1; | |
| 1671 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1672 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1673 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1674 ASSERT_TRUE(item); | |
| 1675 ScopedCancellingItem canceller(item); | |
| 1676 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1677 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1678 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1679 " \"incognito\": false," | |
| 1680 " \"bytesReceived\": 0," | |
| 1681 " \"mime\": \"\"," | |
| 1682 " \"paused\": false," | |
| 1683 " \"url\": \"%s\"}]", download_url.c_str()))); | |
| 1684 if (item->IsInterrupted()) { | |
| 1685 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1686 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1687 " \"incognito\": false," | |
| 1688 " \"bytesReceived\": 0," | |
| 1689 " \"mime\": \"\"," | |
| 1690 " \"paused\": false," | |
| 1691 " \"id\": %d," | |
| 1692 " \"state\": \"interrupted\"," | |
| 1693 " \"error\": %d," | |
| 1694 " \"url\": \"%s\"}]", | |
| 1695 result_id, | |
| 1696 kExpectedError, | |
| 1697 download_url.c_str()))); | |
| 1698 } else { | |
| 1699 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1700 base::StringPrintf("[{\"id\": %d," | |
| 1701 " \"error\": {\"new\": %d}," | |
| 1702 " \"state\": {" | |
| 1703 " \"old\": \"in_progress\"," | |
| 1704 " \"new\": \"interrupted\"}}]", | |
| 1705 result_id, | |
| 1706 kExpectedError))); | |
| 1707 } | |
| 1708 } | |
| 1709 | |
| 1710 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1711 DownloadExtensionTest_Download_AuthBasic) { | |
| 1712 LoadExtension("downloads_split"); | |
| 1713 CHECK(StartTestServer()); | |
| 1714 std::string download_url = GetURL("auth-basic"); | |
| 1715 // This is just base64 of 'username:secret'. | |
| 1716 static const char* kAuthorization = "dXNlcm5hbWU6c2VjcmV0"; | |
| 1717 GoOnTheRecord(); | |
| 1718 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1719 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1720 "[{\"url\": \"%s\"," | |
| 1721 " \"filename\": \"auth-basic-succeed.txt\"," | |
| 1722 " \"headers\": [{" | |
| 1723 " \"name\": \"Authorization\"," | |
| 1724 " \"value\": \"Basic %s\"}]}]", | |
| 1725 download_url.c_str(), kAuthorization))); | |
| 1726 ASSERT_TRUE(result.get()); | |
| 1727 int result_id = -1; | |
| 1728 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1729 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1730 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1731 ASSERT_TRUE(item); | |
| 1732 ScopedCancellingItem canceller(item); | |
| 1733 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1734 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1735 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1736 " \"incognito\": false," | |
| 1737 " \"mime\": \"text/html\"," | |
| 1738 " \"paused\": false," | |
| 1739 " \"url\": \"%s\"}]", download_url.c_str()))); | |
| 1740 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1741 base::StringPrintf("[{\"id\": %d," | |
| 1742 " \"state\": {" | |
| 1743 " \"old\": \"in_progress\"," | |
| 1744 " \"new\": \"complete\"}}]", result_id))); | |
| 1745 } | |
| 1746 | |
| 1747 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1748 DownloadExtensionTest_Download_Post) { | |
| 1749 LoadExtension("downloads_split"); | |
| 1750 CHECK(StartTestServer()); | |
| 1751 std::string download_url = GetURL("files/post/downloads/a_zip_file.zip?" | |
| 1752 "expected_body=BODY"); | |
| 1753 GoOnTheRecord(); | |
| 1754 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1755 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1756 "[{\"url\": \"%s\"," | |
| 1757 " \"filename\": \"post-succeed.txt\"," | |
| 1758 " \"method\": \"POST\"," | |
| 1759 " \"body\": \"BODY\"}]", | |
| 1760 download_url.c_str()))); | |
| 1761 ASSERT_TRUE(result.get()); | |
| 1762 int result_id = -1; | |
| 1763 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1764 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1765 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1766 ASSERT_TRUE(item); | |
| 1767 ScopedCancellingItem canceller(item); | |
| 1768 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1769 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1770 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1771 " \"incognito\": false," | |
| 1772 " \"mime\": \"application/octet-stream\"," | |
| 1773 " \"paused\": false," | |
| 1774 " \"bytesReceived\": 164," | |
| 1775 " \"url\": \"%s\"}]", download_url.c_str()))); | |
| 1776 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1777 base::StringPrintf("[{\"id\": %d," | |
| 1778 " \"state\": {" | |
| 1779 " \"old\": \"in_progress\"," | |
| 1780 " \"new\": \"complete\"}}]", result_id))); | |
| 1781 } | |
| 1782 | |
| 1783 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1784 DownloadExtensionTest_Download_Post_Get) { | |
| 1785 LoadExtension("downloads_split"); | |
| 1786 CHECK(StartTestServer()); | |
| 1787 // Test that downloadPostSuccess would fail if the resource requires the | |
| 1788 // POST method, and chrome fails to propagate the |method| parameter back to | |
| 1789 // the server. This tests both that testserver.py does not succeed when it | |
| 1790 // should fail, and this tests how the downloads extension api exposes the | |
| 1791 // failure to extensions. | |
| 1792 std::string download_url = GetURL("files/post/downloads/a_zip_file.zip?" | |
| 1793 "expected_body=BODY"); | |
| 1794 GoOnTheRecord(); | |
| 1795 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1796 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1797 "[{\"url\": \"%s\"," | |
| 1798 " \"body\": \"BODY\"," | |
| 1799 " \"filename\": \"post-get.txt\"}]", | |
| 1800 download_url.c_str()))); | |
| 1801 ASSERT_TRUE(result.get()); | |
| 1802 int result_id = -1; | |
| 1803 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1804 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1805 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1806 ASSERT_TRUE(item); | |
| 1807 ScopedCancellingItem canceller(item); | |
| 1808 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1809 static const int kExpectedError = 33; | |
| 1810 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1811 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1812 " \"incognito\": false," | |
| 1813 " \"mime\": \"\"," | |
| 1814 " \"paused\": false," | |
| 1815 " \"id\": %d," | |
| 1816 " \"url\": \"%s\"}]", | |
| 1817 result_id, | |
| 1818 download_url.c_str()))); | |
| 1819 if (item->IsInterrupted()) { | |
| 1820 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1821 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1822 " \"incognito\": false," | |
| 1823 " \"mime\": \"\"," | |
| 1824 " \"paused\": false," | |
| 1825 " \"id\": %d," | |
| 1826 " \"state\": \"interrupted\"," | |
| 1827 " \"error\": %d," | |
| 1828 " \"url\": \"%s\"}]", | |
| 1829 result_id, | |
| 1830 kExpectedError, | |
| 1831 download_url.c_str()))); | |
| 1832 } else { | |
| 1833 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1834 base::StringPrintf("[{\"id\": %d," | |
| 1835 " \"error\": {\"new\": %d}," | |
| 1836 " \"state\": {" | |
| 1837 " \"old\": \"in_progress\"," | |
| 1838 " \"new\": \"interrupted\"}}]", | |
| 1839 result_id, | |
| 1840 kExpectedError))); | |
| 1841 } | |
| 1842 } | |
| 1843 | |
| 1844 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1845 DownloadExtensionTest_Download_Post_NoBody) { | |
| 1846 LoadExtension("downloads_split"); | |
| 1847 CHECK(StartTestServer()); | |
| 1848 // Test that downloadPostSuccess would fail if the resource requires the | |
| 1849 // POST method, and chrome fails to propagate the |body| parameter back to | |
| 1850 // the server. This tests both that testserver.py does not succeed when it | |
| 1851 // should fail, and this tests how the downloads extension api exposes the | |
| 1852 // failure to extensions. | |
| 1853 std::string download_url = GetURL("files/post/downloads/a_zip_file.zip?" | |
| 1854 "expected_body=BODY"); | |
| 1855 GoOnTheRecord(); | |
| 1856 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1857 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1858 "[{\"url\": \"%s\"," | |
| 1859 " \"method\": \"POST\"," | |
| 1860 " \"filename\": \"post-nobody.txt\"}]", | |
| 1861 download_url.c_str()))); | |
| 1862 ASSERT_TRUE(result.get()); | |
| 1863 int result_id = -1; | |
| 1864 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1865 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1866 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1867 ASSERT_TRUE(item); | |
| 1868 ScopedCancellingItem canceller(item); | |
| 1869 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1870 static const int kExpectedError = 33; | |
| 1871 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1872 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1873 " \"incognito\": false," | |
| 1874 " \"mime\": \"\"," | |
| 1875 " \"paused\": false," | |
| 1876 " \"id\": %d," | |
| 1877 " \"url\": \"%s\"}]", | |
| 1878 result_id, | |
| 1879 download_url.c_str()))); | |
| 1880 if (item->IsInterrupted()) { | |
| 1881 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1882 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1883 " \"incognito\": false," | |
| 1884 " \"mime\": \"\"," | |
| 1885 " \"paused\": false," | |
| 1886 " \"id\": %d," | |
| 1887 " \"state\": \"interrupted\"," | |
| 1888 " \"error\": %d," | |
| 1889 " \"url\": \"%s\"}]", | |
| 1890 result_id, | |
| 1891 kExpectedError, | |
| 1892 download_url.c_str()))); | |
| 1893 } else { | |
| 1894 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1895 base::StringPrintf("[{\"id\": %d," | |
| 1896 " \"error\": {\"new\": %d}," | |
| 1897 " \"state\": {" | |
| 1898 " \"old\": \"in_progress\"," | |
| 1899 " \"new\": \"interrupted\"}}]", | |
| 1900 result_id, | |
| 1901 kExpectedError))); | |
| 1902 } | |
| 1903 } | |
| 1904 | |
| 1905 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1906 DownloadExtensionTest_Download_Cancel) { | |
| 1907 LoadExtension("downloads_split"); | |
| 1908 CHECK(StartTestServer()); | |
| 1909 // Test that cancel()ing an in-progress download causes its state to | |
| 1910 // transition to interrupted, and test that that state transition is | |
| 1911 // detectable by an onChanged event listener. TODO(benjhayden): Test other | |
| 1912 // sources of interruptions such as server death. | |
| 1913 std::string download_url = GetURL("download-known-size"); | |
| 1914 GoOnTheRecord(); | |
| 1915 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1916 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1917 "[{\"url\": \"%s\"}]", download_url.c_str()))); | |
| 1918 ASSERT_TRUE(result.get()); | |
| 1919 int result_id = -1; | |
| 1920 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1921 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1922 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1923 ASSERT_TRUE(item); | |
| 1924 ScopedCancellingItem canceller(item); | |
| 1925 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1926 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1927 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1928 " \"incognito\": false," | |
| 1929 " \"mime\": \"application/octet-stream\"," | |
| 1930 " \"paused\": false," | |
| 1931 " \"id\": %d," | |
| 1932 " \"url\": \"%s\"}]", | |
| 1933 result_id, | |
| 1934 download_url.c_str()))); | |
| 1935 item->Cancel(true); | |
| 1936 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1937 base::StringPrintf("[{\"id\": %d," | |
| 1938 " \"error\": {\"new\": 40}," | |
| 1939 " \"state\": {" | |
| 1940 " \"old\": \"in_progress\"," | |
| 1941 " \"new\": \"interrupted\"}}]", | |
| 1942 result_id))); | |
| 1943 } | |
| 1944 | |
| 1945 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | |
| 1946 DownloadExtensionTest_Download_FileSystemURL) { | |
| 1947 LoadExtension("downloads_split"); | |
| 1948 CHECK(StartTestServer()); | |
| 1949 // Test downloading filesystem: URLs. | |
| 1950 // NOTE: chrome disallows creating HTML5 FileSystem Files in incognito. | |
|
Randy Smith (Not in Mondays)
2012/06/18 18:42:58
Should we test that?
benjhayden
2012/06/19 15:01:59
What would it buy to test that HTML5 Files are dis
Randy Smith (Not in Mondays)
2012/06/19 19:23:23
In a sorta vague fuzzy background way, yeah. I do
| |
| 1951 std::string download_url = "filesystem:" + GetExtensionURL() + | |
| 1952 "temporary/on_record.txt"; | |
| 1953 static const char* kHTML5FileCreated = "html5_file_created"; | |
| 1954 GoOnTheRecord(); | |
| 1955 fileapi::FileSystemContext* fs = BrowserContext::GetFileSystemContext( | |
| 1956 browser()->profile()); | |
| 1957 base::Closure file_created = base::Bind( | |
| 1958 &DownloadExtensionTest::ObserveEvent, | |
| 1959 base::Unretained(this), | |
| 1960 browser()->profile(), | |
| 1961 kHTML5FileCreated, | |
| 1962 "on_record"); | |
| 1963 fileapi::FileSystemContext::OpenFileSystemCallback fs_opened = base::Bind( | |
| 1964 &OpenFileSystemCallback, | |
| 1965 base::Unretained(fs), | |
| 1966 "on_record.txt", | |
| 1967 file_created); | |
| 1968 fs->OpenFileSystem(GURL(GetExtensionURL()), | |
| 1969 fileapi::kFileSystemTypeTemporary, | |
| 1970 true/*create*/, | |
| 1971 fs_opened); | |
| 1972 ASSERT_TRUE(WaitFor(kHTML5FileCreated, "on_record")); | |
| 1973 scoped_ptr<base::Value> result(RunFunctionAndReturnResult( | |
| 1974 new DownloadsDownloadFunction(), base::StringPrintf( | |
| 1975 "[{\"url\": \"%s\"}]", download_url.c_str()))); | |
| 1976 ASSERT_TRUE(result.get()); | |
| 1977 int result_id = -1; | |
| 1978 ASSERT_TRUE(result->GetAsInteger(&result_id)); | |
| 1979 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | |
| 1980 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | |
| 1981 ASSERT_TRUE(item); | |
| 1982 ScopedCancellingItem canceller(item); | |
| 1983 ASSERT_EQ(download_url, item->GetURL().spec()); | |
| 1984 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadCreated, | |
| 1985 base::StringPrintf("[{\"danger\": \"safe\"," | |
| 1986 " \"filename\": \"%s\"," | |
| 1987 " \"incognito\": false," | |
| 1988 " \"mime\": \"text/plain\"," | |
| 1989 " \"paused\": false," | |
| 1990 " \"url\": \"%s\"}]", | |
| 1991 GetFilename("on_record.txt.crdownload").c_str(), | |
| 1992 download_url.c_str()))); | |
| 1993 ASSERT_TRUE(WaitFor(extension_event_names::kOnDownloadChanged, | |
| 1994 base::StringPrintf("[{\"id\": %d," | |
| 1995 " \"filename\": {" | |
| 1996 " \"old\": \"%s\"," | |
| 1997 " \"new\": \"%s\"}," | |
| 1998 " \"state\": {" | |
| 1999 " \"old\": \"in_progress\"," | |
| 2000 " \"new\": \"complete\"}}]", | |
| 2001 result_id, | |
| 2002 GetFilename("on_record.txt.crdownload").c_str(), | |
| 2003 GetFilename("on_record.txt").c_str()))); | |
| 2004 } | |
| OLD | NEW |