[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da
andersca at apple.com
andersca at apple.com
Wed Dec 22 17:45:11 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 09c7e62a02c7e1a67f0c304bb4ae6cde07f099e1
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Nov 29 23:34:17 2010 +0000
Should be able to pause and resume downloads
https://bugs.webkit.org/show_bug.cgi?id=50185
<rdar://problem/8691135>
Reviewed by Darin Adler.
* UIProcess/API/C/WKContext.h:
Add didCancel callback.
* UIProcess/API/C/WKDownload.cpp:
(WKDownloadGetResumeData):
(WKDownloadCancel):
Call the respective DownloadProxy member functions.
* UIProcess/API/C/WKDownload.h:
* UIProcess/Downloads/DownloadProxy.cpp:
(WebKit::DownloadProxy::cancel):
Send Cancel to the WebProcess.
(WebKit::DownloadProxy::didFail):
This now takes a resumeData reference.
(WebKit::DownloadProxy::didCancel):
Set the resume data and call didCancel.
* UIProcess/Downloads/DownloadProxy.h:
(WebKit::DownloadProxy::resumeData):
Return the resume data.
* UIProcess/Downloads/DownloadProxy.messages.in:
Add DidCancel message, Add resume data to DidFail.
* UIProcess/WebDownloadClient.cpp:
(WebKit::WebDownloadClient::didCancel):
Call the didCancel context client function.
* WebProcess/Downloads/Download.cpp:
(WebKit::Download::didFail):
This now takes a resume data argument as well.
(WebKit::Download::didCancel):
Send DidCancel.
* WebProcess/Downloads/DownloadManager.cpp:
(WebKit::DownloadManager::cancelDownload):
Look up the download and cancel it.
* WebProcess/Downloads/cf/DownloadCFNet.cpp:
(WebKit::Download::cancel):
Add stub.
* WebProcess/Downloads/mac/DownloadMac.mm:
(WebKit::Download::cancel):
Cancel the download.
(-[WKDownloadAsDelegate download:didFailWithError:]):
Pass the resume data along.
* WebProcess/Downloads/qt/DownloadQt.cpp:
(WebKit::Download::cancel):
Add stub.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::cancelDownload):
Ask the download manager to cancel the download.
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in:
Add CancelDownload message.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72841 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index d274f74..fcddb03 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,75 @@
+2010-11-29 Anders Carlsson <andersca at apple.com>
+
+ Reviewed by Darin Adler.
+
+ Should be able to pause and resume downloads
+ https://bugs.webkit.org/show_bug.cgi?id=50185
+ <rdar://problem/8691135>
+
+ * UIProcess/API/C/WKContext.h:
+ Add didCancel callback.
+
+ * UIProcess/API/C/WKDownload.cpp:
+ (WKDownloadGetResumeData):
+ (WKDownloadCancel):
+ Call the respective DownloadProxy member functions.
+
+ * UIProcess/API/C/WKDownload.h:
+ * UIProcess/Downloads/DownloadProxy.cpp:
+ (WebKit::DownloadProxy::cancel):
+ Send Cancel to the WebProcess.
+
+ (WebKit::DownloadProxy::didFail):
+ This now takes a resumeData reference.
+
+ (WebKit::DownloadProxy::didCancel):
+ Set the resume data and call didCancel.
+
+ * UIProcess/Downloads/DownloadProxy.h:
+ (WebKit::DownloadProxy::resumeData):
+ Return the resume data.
+
+ * UIProcess/Downloads/DownloadProxy.messages.in:
+ Add DidCancel message, Add resume data to DidFail.
+
+ * UIProcess/WebDownloadClient.cpp:
+ (WebKit::WebDownloadClient::didCancel):
+ Call the didCancel context client function.
+
+ * WebProcess/Downloads/Download.cpp:
+ (WebKit::Download::didFail):
+ This now takes a resume data argument as well.
+
+ (WebKit::Download::didCancel):
+ Send DidCancel.
+
+ * WebProcess/Downloads/DownloadManager.cpp:
+ (WebKit::DownloadManager::cancelDownload):
+ Look up the download and cancel it.
+
+ * WebProcess/Downloads/cf/DownloadCFNet.cpp:
+ (WebKit::Download::cancel):
+ Add stub.
+
+ * WebProcess/Downloads/mac/DownloadMac.mm:
+ (WebKit::Download::cancel):
+ Cancel the download.
+
+ (-[WKDownloadAsDelegate download:didFailWithError:]):
+ Pass the resume data along.
+
+ * WebProcess/Downloads/qt/DownloadQt.cpp:
+ (WebKit::Download::cancel):
+ Add stub.
+
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::cancelDownload):
+ Ask the download manager to cancel the download.
+
+ * WebProcess/WebProcess.h:
+ * WebProcess/WebProcess.messages.in:
+ Add CancelDownload message.
+
2010-11-29 Balazs Kelemen <kbalazs at webkit.org>
Reviewed by Adam Roben.
diff --git a/WebKit2/UIProcess/API/C/WKContext.h b/WebKit2/UIProcess/API/C/WKContext.h
index 3cd2b2e..2970a6a 100644
--- a/WebKit2/UIProcess/API/C/WKContext.h
+++ b/WebKit2/UIProcess/API/C/WKContext.h
@@ -78,6 +78,7 @@ typedef WKStringRef (*WKContextDownloadDecideDestinationWithSuggestedFilenameCal
typedef void (*WKContextDownloadDidCreateDestinationCallback)(WKContextRef context, WKDownloadRef download, WKStringRef path, const void *clientInfo);
typedef void (*WKContextDownloadDidFinishCallback)(WKContextRef context, WKDownloadRef download, const void *clientInfo);
typedef void (*WKContextDownloadDidFailCallback)(WKContextRef context, WKDownloadRef download, WKErrorRef error, const void *clientInfo);
+typedef void (*WKContextDownloadDidCancel)(WKContextRef context, WKDownloadRef download, const void *clientInfo);
typedef void (*WKContextDownloadProcessDidCrashCallback)(WKContextRef context, WKDownloadRef download, const void *clientInfo);
struct WKContextDownloadClient {
@@ -91,6 +92,7 @@ struct WKContextDownloadClient {
WKContextDownloadDidCreateDestinationCallback didCreateDestination;
WKContextDownloadDidFinishCallback didFinish;
WKContextDownloadDidFailCallback didFail;
+ WKContextDownloadDidCancel didCancel;
WKContextDownloadProcessDidCrashCallback processDidCrash;
};
typedef struct WKContextDownloadClient WKContextDownloadClient;
diff --git a/WebKit2/UIProcess/API/C/WKDownload.cpp b/WebKit2/UIProcess/API/C/WKDownload.cpp
index 6f3b536..8960e2a 100644
--- a/WebKit2/UIProcess/API/C/WKDownload.cpp
+++ b/WebKit2/UIProcess/API/C/WKDownload.cpp
@@ -40,3 +40,13 @@ WKURLRequestRef WKDownloadCopyRequest(WKDownloadRef download)
{
return toAPI(WebURLRequest::create(toImpl(download)->request()).leakRef());
}
+
+WKDataRef WKDownloadGetResumeData(WKDownloadRef download)
+{
+ return toAPI(toImpl(download)->resumeData());
+}
+
+void WKDownloadCancel(WKDownloadRef download)
+{
+ return toImpl(download)->cancel();
+}
diff --git a/WebKit2/UIProcess/API/C/WKDownload.h b/WebKit2/UIProcess/API/C/WKDownload.h
index b94f678..b812681 100644
--- a/WebKit2/UIProcess/API/C/WKDownload.h
+++ b/WebKit2/UIProcess/API/C/WKDownload.h
@@ -39,6 +39,8 @@ extern "C" {
WK_EXPORT WKTypeID WKDownloadGetTypeID();
WK_EXPORT WKURLRequestRef WKDownloadCopyRequest(WKDownloadRef download);
+WK_EXPORT WKDataRef WKDownloadGetResumeData(WKDownloadRef download);
+WK_EXPORT void WKDownloadCancel(WKDownloadRef download);
#ifdef __cplusplus
}
diff --git a/WebKit2/UIProcess/Downloads/DownloadProxy.cpp b/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
index 1afca4b..fcc4a75 100644
--- a/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
+++ b/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
@@ -25,8 +25,10 @@
#include "DownloadProxy.h"
-#include "NotImplemented.h"
+#include "DataReference.h"
#include "WebContext.h"
+#include "WebData.h"
+#include "WebProcessMessages.h"
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
@@ -56,6 +58,14 @@ DownloadProxy::~DownloadProxy()
ASSERT(!m_webContext);
}
+void DownloadProxy::cancel()
+{
+ if (!m_webContext)
+ return;
+
+ m_webContext->process()->send(Messages::WebProcess::CancelDownload(m_downloadID), 0);
+}
+
void DownloadProxy::invalidate()
{
ASSERT(m_webContext);
@@ -134,16 +144,36 @@ void DownloadProxy::didFinish()
m_webContext->downloadFinished(this);
}
-void DownloadProxy::didFail(const ResourceError& error)
+static PassRefPtr<WebData> createWebData(const CoreIPC::DataReference& data)
+{
+ if (data.isEmpty())
+ return 0;
+
+ return WebData::create(data.data(), data.size());
+}
+
+void DownloadProxy::didFail(const ResourceError& error, const CoreIPC::DataReference& resumeData)
{
if (!m_webContext)
return;
+ m_resumeData = createWebData(resumeData);
+
m_webContext->downloadClient().didFail(m_webContext, this, error);
// This can cause the DownloadProxy object to be deleted.
m_webContext->downloadFinished(this);
}
+void DownloadProxy::didCancel(const CoreIPC::DataReference& resumeData)
+{
+ m_resumeData = createWebData(resumeData);
+
+ m_webContext->downloadClient().didCancel(m_webContext, this);
+
+ // This can cause the DownloadProxy object to be deleted.
+ m_webContext->downloadFinished(this);
+}
+
} // namespace WebKit
diff --git a/WebKit2/UIProcess/Downloads/DownloadProxy.h b/WebKit2/UIProcess/Downloads/DownloadProxy.h
index aae32e2..a155d72 100644
--- a/WebKit2/UIProcess/Downloads/DownloadProxy.h
+++ b/WebKit2/UIProcess/Downloads/DownloadProxy.h
@@ -41,6 +41,7 @@ namespace WebCore {
namespace WebKit {
class WebContext;
+class WebData;
class DownloadProxy : public APIObject {
public:
@@ -51,6 +52,9 @@ public:
uint64_t downloadID() const { return m_downloadID; }
const WebCore::ResourceRequest& request() const { return m_request; }
+ WebData* resumeData() const { return m_resumeData.get(); }
+
+ void cancel();
void invalidate();
void processDidClose();
@@ -71,10 +75,13 @@ private:
void decideDestinationWithSuggestedFilename(const String& filename, String& destination, bool& allowOverwrite, SandboxExtension::Handle& sandboxExtensionHandle);
void didCreateDestination(const String& path);
void didFinish();
- void didFail(const WebCore::ResourceError&);
+ void didFail(const WebCore::ResourceError&, const CoreIPC::DataReference& resumeData);
+ void didCancel(const CoreIPC::DataReference& resumeData);
WebContext* m_webContext;
uint64_t m_downloadID;
+
+ RefPtr<WebData> m_resumeData;
WebCore::ResourceRequest m_request;
};
diff --git a/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in b/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in
index 243deb7..999080b 100644
--- a/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in
+++ b/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in
@@ -28,5 +28,6 @@ messages -> DownloadProxy {
DecideDestinationWithSuggestedFilename(String filename) -> (String destination, bool allowOverwrite, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
DidCreateDestination(WTF::String path)
DidFinish()
- DidFail(WebCore::ResourceError error)
+ DidFail(WebCore::ResourceError error, CoreIPC::DataReference resumeData)
+ DidCancel(CoreIPC::DataReference resumeData)
}
diff --git a/WebKit2/UIProcess/WebDownloadClient.cpp b/WebKit2/UIProcess/WebDownloadClient.cpp
index ba53588..d6a7bcb 100644
--- a/WebKit2/UIProcess/WebDownloadClient.cpp
+++ b/WebKit2/UIProcess/WebDownloadClient.cpp
@@ -98,6 +98,14 @@ void WebDownloadClient::didFail(WebContext* webContext, DownloadProxy* downloadP
m_client.didFail(toAPI(webContext), toAPI(downloadProxy), toAPI(error), m_client.clientInfo);
}
+void WebDownloadClient::didCancel(WebContext* webContext, DownloadProxy* downloadProxy)
+{
+ if (!m_client.didCancel)
+ return;
+
+ m_client.didCancel(toAPI(webContext), toAPI(downloadProxy), m_client.clientInfo);
+}
+
void WebDownloadClient::processDidCrash(WebContext* webContext, DownloadProxy* downloadProxy)
{
if (!m_client.processDidCrash)
diff --git a/WebKit2/UIProcess/WebDownloadClient.h b/WebKit2/UIProcess/WebDownloadClient.h
index f5c2211..902c870 100644
--- a/WebKit2/UIProcess/WebDownloadClient.h
+++ b/WebKit2/UIProcess/WebDownloadClient.h
@@ -50,6 +50,7 @@ public:
void didCreateDestination(WebContext*, DownloadProxy*, const String& path);
void didFinish(WebContext*, DownloadProxy*);
void didFail(WebContext*, DownloadProxy*, const WebCore::ResourceError&);
+ void didCancel(WebContext*, DownloadProxy*);
void processDidCrash(WebContext*, DownloadProxy*);
};
diff --git a/WebKit2/WebProcess/Downloads/Download.cpp b/WebKit2/WebProcess/Downloads/Download.cpp
index e70d927..3cb5588 100644
--- a/WebKit2/WebProcess/Downloads/Download.cpp
+++ b/WebKit2/WebProcess/Downloads/Download.cpp
@@ -26,6 +26,7 @@
#include "Download.h"
#include "Connection.h"
+#include "DataReference.h"
#include "DownloadProxyMessages.h"
#include "DownloadManager.h"
#include "SandboxExtension.h"
@@ -110,9 +111,18 @@ void Download::didFinish()
DownloadManager::shared().downloadFinished(this);
}
-void Download::didFail(const WebCore::ResourceError& error)
+void Download::didFail(const ResourceError& error, const CoreIPC::DataReference& resumeData)
{
- send(Messages::DownloadProxy::DidFail(error));
+ send(Messages::DownloadProxy::DidFail(error, resumeData));
+
+ if (m_sandboxExtension)
+ m_sandboxExtension->invalidate();
+ DownloadManager::shared().downloadFinished(this);
+}
+
+void Download::didCancel(const CoreIPC::DataReference& resumeData)
+{
+ send(Messages::DownloadProxy::DidCancel(resumeData));
if (m_sandboxExtension)
m_sandboxExtension->invalidate();
diff --git a/WebKit2/WebProcess/Downloads/Download.h b/WebKit2/WebProcess/Downloads/Download.h
index 37faca8..54f325a 100644
--- a/WebKit2/WebProcess/Downloads/Download.h
+++ b/WebKit2/WebProcess/Downloads/Download.h
@@ -42,6 +42,10 @@ class WKDownloadAsDelegate;
#endif
#endif
+namespace CoreIPC {
+ class DataReference;
+}
+
namespace WebCore {
class ResourceError;
class ResourceHandle;
@@ -66,6 +70,7 @@ public:
void start(WebPage* initiatingWebPage);
void startWithHandle(WebPage* initiatingPage, WebCore::ResourceHandle*, const WebCore::ResourceRequest& initialRequest, const WebCore::ResourceResponse&);
+ void cancel();
uint64_t downloadID() const { return m_downloadID; }
@@ -76,7 +81,8 @@ public:
String decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite);
void didCreateDestination(const String& path);
void didFinish();
- void didFail(const WebCore::ResourceError&);
+ void didFail(const WebCore::ResourceError&, const CoreIPC::DataReference& resumeData);
+ void didCancel(const CoreIPC::DataReference& resumeData);
private:
Download(uint64_t downloadID, const WebCore::ResourceRequest&);
diff --git a/WebKit2/WebProcess/Downloads/DownloadManager.cpp b/WebKit2/WebProcess/Downloads/DownloadManager.cpp
index b3acad5..e65883a 100644
--- a/WebKit2/WebProcess/Downloads/DownloadManager.cpp
+++ b/WebKit2/WebProcess/Downloads/DownloadManager.cpp
@@ -61,6 +61,15 @@ void DownloadManager::convertHandleToDownload(uint64_t downloadID, WebPage* init
m_downloads.set(downloadID, download.leakPtr());
}
+void DownloadManager::cancelDownload(uint64_t downloadID)
+{
+ Download* download = m_downloads.get(downloadID);
+ if (!download)
+ return;
+
+ download->cancel();
+}
+
void DownloadManager::downloadFinished(Download* download)
{
ASSERT(m_downloads.contains(download->downloadID()));
diff --git a/WebKit2/WebProcess/Downloads/DownloadManager.h b/WebKit2/WebProcess/Downloads/DownloadManager.h
index 0245bb6..1f27b86 100644
--- a/WebKit2/WebProcess/Downloads/DownloadManager.h
+++ b/WebKit2/WebProcess/Downloads/DownloadManager.h
@@ -49,6 +49,8 @@ public:
void startDownload(uint64_t downloadID, WebPage* initiatingPage, const WebCore::ResourceRequest&);
void convertHandleToDownload(uint64_t downloadID, WebPage* initiatingPage, WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceRequest& initialRequest, const WebCore::ResourceResponse&);
+ void cancelDownload(uint64_t downloadID);
+
void downloadFinished(Download*);
bool isDownloading() const { return !m_downloads.isEmpty(); }
diff --git a/WebKit2/WebProcess/Downloads/cf/DownloadCFNet.cpp b/WebKit2/WebProcess/Downloads/cf/DownloadCFNet.cpp
index 4f56e35..34fd60e 100644
--- a/WebKit2/WebProcess/Downloads/cf/DownloadCFNet.cpp
+++ b/WebKit2/WebProcess/Downloads/cf/DownloadCFNet.cpp
@@ -41,6 +41,11 @@ void Download::startWithHandle(WebPage* initiatingPage, ResourceHandle*, const R
notImplemented();
}
+void Download::cancel()
+{
+ notImplemented();
+}
+
void Download::platformInvalidate()
{
notImplemented();
diff --git a/WebKit2/WebProcess/Downloads/mac/DownloadMac.mm b/WebKit2/WebProcess/Downloads/mac/DownloadMac.mm
index 6ca49ad..0f3c669 100644
--- a/WebKit2/WebProcess/Downloads/mac/DownloadMac.mm
+++ b/WebKit2/WebProcess/Downloads/mac/DownloadMac.mm
@@ -30,6 +30,7 @@
#include <WebCore/Page.h>
#include <WebCore/ResourceHandle.h>
#include <WebCore/ResourceResponse.h>
+#include "DataReference.h"
#include "NotImplemented.h"
#include "WebPage.h"
@@ -145,6 +146,14 @@ void Download::startWithHandle(WebPage* initiatingPage, ResourceHandle* handle,
setOriginalURLForDownload(initiatingPage, m_nsURLDownload.get(), initialRequest);
}
+void Download::cancel()
+{
+ [m_nsURLDownload.get() cancel];
+
+ RetainPtr<NSData> resumeData = [m_nsURLDownload.get() resumeData];
+ didCancel(CoreIPC::DataReference(reinterpret_cast<const uint8_t*>([resumeData.get() bytes]), [resumeData.get() length]));
+}
+
void Download::platformInvalidate()
{
ASSERT(m_nsURLDownload);
@@ -262,8 +271,13 @@ void Download::platformInvalidate()
- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error
{
- if (_download)
- _download->didFail(error);
+ if (!_download)
+ return;
+
+ RetainPtr<NSData> resumeData = [download resumeData];
+ CoreIPC::DataReference dataReference(reinterpret_cast<const uint8_t*>([resumeData.get() bytes]), [resumeData.get() length]);
+
+ _download->didFail(error, dataReference);
}
@end
diff --git a/WebKit2/WebProcess/Downloads/qt/DownloadQt.cpp b/WebKit2/WebProcess/Downloads/qt/DownloadQt.cpp
index 4f56e35..34fd60e 100644
--- a/WebKit2/WebProcess/Downloads/qt/DownloadQt.cpp
+++ b/WebKit2/WebProcess/Downloads/qt/DownloadQt.cpp
@@ -41,6 +41,11 @@ void Download::startWithHandle(WebPage* initiatingPage, ResourceHandle*, const R
notImplemented();
}
+void Download::cancel()
+{
+ notImplemented();
+}
+
void Download::platformInvalidate()
{
notImplemented();
diff --git a/WebKit2/WebProcess/WebProcess.cpp b/WebKit2/WebProcess/WebProcess.cpp
index 8190750..a4bb0bb 100644
--- a/WebKit2/WebProcess/WebProcess.cpp
+++ b/WebKit2/WebProcess/WebProcess.cpp
@@ -548,4 +548,9 @@ void WebProcess::clearApplicationCache()
#endif
}
+void WebProcess::cancelDownload(uint64_t downloadID)
+{
+ DownloadManager::shared().cancelDownload(downloadID);
+}
+
} // namespace WebKit
diff --git a/WebKit2/WebProcess/WebProcess.h b/WebKit2/WebProcess/WebProcess.h
index ac0e52f..cbc8b8f 100644
--- a/WebKit2/WebProcess/WebProcess.h
+++ b/WebKit2/WebProcess/WebProcess.h
@@ -112,6 +112,8 @@ private:
void platformClearResourceCaches();
void clearApplicationCache();
+ void cancelDownload(uint64_t downloadID);
+
// CoreIPC::Connection::Client
void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
void didClose(CoreIPC::Connection*);
diff --git a/WebKit2/WebProcess/WebProcess.messages.in b/WebKit2/WebProcess/WebProcess.messages.in
index a4626c5..1b63496 100644
--- a/WebKit2/WebProcess/WebProcess.messages.in
+++ b/WebKit2/WebProcess/WebProcess.messages.in
@@ -45,4 +45,8 @@ messages -> WebProcess {
ClearResourceCaches();
ClearApplicationCache();
+
+ # Downloads. This should really be in a Download.messages.in, but it seemed unnecessary to create a new file just for
+ # a single message.
+ CancelDownload(uint64_t downloadID)
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list