summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp')
-rw-r--r--Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp49
1 files changed, 44 insertions, 5 deletions
diff --git a/Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp b/Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp
index 38117ebb3..ab4b6eee4 100644
--- a/Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp
+++ b/Source/WebKit2/WebProcess/Downloads/soup/DownloadSoup.cpp
@@ -49,9 +49,16 @@ class DownloadClient : public ResourceHandleClient {
public:
DownloadClient(Download* download)
: m_download(download)
+ , m_handleResponseLaterID(0)
{
}
+ ~DownloadClient()
+ {
+ if (m_handleResponseLaterID)
+ g_source_remove(m_handleResponseLaterID);
+ }
+
void downloadFailed(const ResourceError& error)
{
m_download->didFail(error, CoreIPC::DataReference());
@@ -96,11 +103,20 @@ public:
return;
}
+ GRefPtr<GFileInfo> info = adoptGRef(g_file_info_new());
+ g_file_info_set_attribute_string(info.get(), "metadata::download-uri", response.url().string().utf8().data());
+ g_file_set_attributes_async(file.get(), info.get(), G_FILE_QUERY_INFO_NONE, G_PRIORITY_DEFAULT, 0, 0, 0);
+
m_download->didCreateDestination(destinationURI);
}
void didReceiveData(ResourceHandle*, const char* data, int length, int /*encodedDataLength*/)
{
+ if (m_handleResponseLaterID) {
+ g_source_remove(m_handleResponseLaterID);
+ handleResponse();
+ }
+
gsize bytesWritten;
GOwnPtr<GError> error;
g_output_stream_write_all(G_OUTPUT_STREAM(m_outputStream.get()), data, length, &bytesWritten, 0, &error.outPtr());
@@ -132,9 +148,35 @@ public:
notImplemented();
}
+ void handleResponse()
+ {
+ m_handleResponseLaterID = 0;
+ didReceiveResponse(0, m_delayedResponse);
+ }
+
+ static gboolean handleResponseLaterCallback(DownloadClient* downloadClient)
+ {
+ downloadClient->handleResponse();
+ return FALSE;
+ }
+
+ void handleResponseLater(const ResourceResponse& response)
+ {
+ ASSERT(!m_response);
+ ASSERT(!m_handleResponseLaterID);
+
+ m_delayedResponse = response;
+
+ // Call didReceiveResponse in an idle to make sure the download is added
+ // to the DownloadManager downloads map.
+ m_handleResponseLaterID = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast<GSourceFunc>(handleResponseLaterCallback), this, 0);
+ }
+
Download* m_download;
GRefPtr<GFileOutputStream> m_outputStream;
GRefPtr<SoupMessage> m_response;
+ ResourceResponse m_delayedResponse;
+ unsigned m_handleResponseLaterID;
};
void Download::start(WebPage*)
@@ -146,7 +188,7 @@ void Download::start(WebPage*)
didStart();
}
-void Download::startWithHandle(WebPage*, ResourceHandle* resourceHandle, const ResourceResponse&)
+void Download::startWithHandle(WebPage*, ResourceHandle* resourceHandle, const ResourceResponse& response)
{
ASSERT(!m_downloadClient);
ASSERT(!m_resourceHandle);
@@ -154,10 +196,7 @@ void Download::startWithHandle(WebPage*, ResourceHandle* resourceHandle, const R
resourceHandle->setClient(m_downloadClient.get());
m_resourceHandle = resourceHandle;
didStart();
- // If the handle already got a response, make sure the download client is notified.
- ResourceHandleInternal* handleInternal = m_resourceHandle->getInternal();
- if (!handleInternal->m_response.isNull())
- m_downloadClient->didReceiveResponse(m_resourceHandle.get(), handleInternal->m_response);
+ static_cast<DownloadClient*>(m_downloadClient.get())->handleResponseLater(response);
}
void Download::cancel()