diff --git a/atom/browser/api/atom_api_download_item.cc b/atom/browser/api/atom_api_download_item.cc index 240444d1ee3..818e18ae58e 100644 --- a/atom/browser/api/atom_api_download_item.cc +++ b/atom/browser/api/atom_api_download_item.cc @@ -146,6 +146,10 @@ const GURL& DownloadItem::GetURL() const { return download_item_->GetURL(); } +const std::vector& DownloadItem::GetURLChain() const { + return download_item_->GetUrlChain(); +} + content::DownloadItem::DownloadState DownloadItem::GetState() const { return download_item_->GetState(); } @@ -162,6 +166,18 @@ base::FilePath DownloadItem::GetSavePath() const { return save_path_; } +std::string DownloadItem::GetLastModifiedTime() const { + return download_item_->GetLastModifiedTime(); +} + +std::string DownloadItem::GetETag() const { + return download_item_->GetETag(); +} + +double DownloadItem::GetStartTime() const { + return download_item_->GetStartTime().ToDoubleT(); +} + // static void DownloadItem::BuildPrototype(v8::Isolate* isolate, v8::Local prototype) { @@ -180,10 +196,14 @@ void DownloadItem::BuildPrototype(v8::Isolate* isolate, .SetMethod("getFilename", &DownloadItem::GetFilename) .SetMethod("getContentDisposition", &DownloadItem::GetContentDisposition) .SetMethod("getURL", &DownloadItem::GetURL) + .SetMethod("getURLChain", &DownloadItem::GetURLChain) .SetMethod("getState", &DownloadItem::GetState) .SetMethod("isDone", &DownloadItem::IsDone) .SetMethod("setSavePath", &DownloadItem::SetSavePath) - .SetMethod("getSavePath", &DownloadItem::GetSavePath); + .SetMethod("getSavePath", &DownloadItem::GetSavePath) + .SetMethod("getLastModifiedTime", &DownloadItem::GetLastModifiedTime) + .SetMethod("getETag", &DownloadItem::GetETag) + .SetMethod("getStartTime", &DownloadItem::GetStartTime); } // static diff --git a/atom/browser/api/atom_api_download_item.h b/atom/browser/api/atom_api_download_item.h index 332c8cebb87..fbc74b1c818 100644 --- a/atom/browser/api/atom_api_download_item.h +++ b/atom/browser/api/atom_api_download_item.h @@ -6,6 +6,7 @@ #define ATOM_BROWSER_API_ATOM_API_DOWNLOAD_ITEM_H_ #include +#include #include "atom/browser/api/trackable_object.h" #include "base/files/file_path.h" @@ -38,10 +39,14 @@ class DownloadItem : public mate::TrackableObject, std::string GetFilename() const; std::string GetContentDisposition() const; const GURL& GetURL() const; + const std::vector& GetURLChain() const; content::DownloadItem::DownloadState GetState() const; bool IsDone() const; void SetSavePath(const base::FilePath& path); base::FilePath GetSavePath() const; + std::string GetLastModifiedTime() const; + std::string GetETag() const; + double GetStartTime() const; protected: DownloadItem(v8::Isolate* isolate, content::DownloadItem* download_item); diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index 96fcca561d9..ae59619402a 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -34,6 +34,7 @@ #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/download_manager_delegate.h" #include "content/public/browser/storage_partition.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" @@ -331,6 +332,25 @@ void OnClearStorageDataDone(const base::Closure& callback) { callback.Run(); } +void DownloadIdCallback(content::DownloadManager* download_manager, + const base::FilePath& path, + const std::vector& url_chain, + const std::string& mime_type, + int64_t offset, + int64_t length, + const std::string& last_modified, + const std::string& etag, + const base::Time& start_time, + uint32_t id) { + content::DownloadItem* item = download_manager->CreateDownloadItem( + base::GenerateGUID(), id, path, path, url_chain, GURL(), GURL(), GURL(), + GURL(), mime_type, mime_type, start_time, base::Time(), etag, + last_modified, offset, length, std::string(), + content::DownloadItem::INTERRUPTED, + content::DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + content::DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT, false); +} + } // namespace Session::Session(v8::Isolate* isolate, AtomBrowserContext* browser_context) @@ -357,10 +377,10 @@ void Session::OnDownloadCreated(content::DownloadManager* manager, v8::Locker locker(isolate()); v8::HandleScope handle_scope(isolate()); - bool prevent_default = Emit( - "will-download", - DownloadItem::Create(isolate(), item), - item->GetWebContents()); + auto handle = DownloadItem::Create(isolate(), item); + if (item->GetState() == content::DownloadItem::INTERRUPTED) + handle->SetSavePath(item->GetTargetFilePath()); + bool prevent_default = Emit("will-download", handle, item->GetWebContents()); if (prevent_default) { item->Cancel(true); item->Remove(); @@ -520,6 +540,29 @@ void Session::GetBlobData( callback)); } +void Session::CreateInterruptedDownload(const mate::Dictionary& options) { + int64_t offset = 0, length = 0; + double start_time = 0.0; + std::string mime_type, last_modified, etag; + base::FilePath path; + std::vector url_chain; + options.Get("path", &path); + options.Get("urlChain", &url_chain); + options.Get("mimeType", &mime_type); + options.Get("offset", &offset); + options.Get("length", &length); + options.Get("lastModified", &last_modified); + options.Get("eTag", &etag); + options.Get("startTime", &start_time); + if (path.empty() || length == 0 || offset >= length) + return; + auto download_manager = + content::BrowserContext::GetDownloadManager(browser_context()); + download_manager->GetDelegate()->GetNextId(base::Bind( + &DownloadIdCallback, download_manager, path, url_chain, mime_type, offset, + length, last_modified, etag, base::Time::FromDoubleT(start_time))); +} + v8::Local Session::Cookies(v8::Isolate* isolate) { if (cookies_.IsEmpty()) { auto handle = Cookies::Create(isolate, browser_context()); @@ -603,6 +646,8 @@ void Session::BuildPrototype(v8::Isolate* isolate, .SetMethod("setUserAgent", &Session::SetUserAgent) .SetMethod("getUserAgent", &Session::GetUserAgent) .SetMethod("getBlobData", &Session::GetBlobData) + .SetMethod("createInterruptedDownload", + &Session::CreateInterruptedDownload) .SetProperty("cookies", &Session::Cookies) .SetProperty("protocol", &Session::Protocol) .SetProperty("webRequest", &Session::WebRequest); diff --git a/atom/browser/api/atom_api_session.h b/atom/browser/api/atom_api_session.h index 8fbdb75fd6f..6024e135b1c 100644 --- a/atom/browser/api/atom_api_session.h +++ b/atom/browser/api/atom_api_session.h @@ -79,6 +79,7 @@ class Session: public mate::TrackableObject, std::string GetUserAgent(); void GetBlobData(const std::string& uuid, const AtomBlobReader::CompletionCallback& callback); + void CreateInterruptedDownload(const mate::Dictionary& options); v8::Local Cookies(v8::Isolate* isolate); v8::Local Protocol(v8::Isolate* isolate); v8::Local WebRequest(v8::Isolate* isolate);