[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andersca at apple.com andersca at apple.com
Wed Dec 22 16:38:20 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 1aae99437903f57cf4b12cd5d6624bf73a93a279
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Nov 29 18:46:54 2010 +0000

    Downloads: When the web process crashes, call error callbacks for pending downloads
    https://bugs.webkit.org/show_bug.cgi?id=50164
    <rdar://problem/8691170>
    
    Reviewed by Sam Weinig.
    
    * UIProcess/API/C/WKContext.h:
    Add processDidCrash callback.
    
    * UIProcess/Downloads/DownloadProxy.cpp:
    (WebKit::DownloadProxy::~DownloadProxy):
    Assert that the web context is null.
    
    (WebKit::DownloadProxy::processDidClose):
    Call the processDidCrash callback.
    
    (WebKit::DownloadProxy::didFinish):
    (WebKit::DownloadProxy::didFail):
    Call downloadFinished.
    
    * UIProcess/WebContext.cpp:
    (WebKit::WebContext::processDidClose):
    Call processDidClose on all pending downloads.
    
    (WebKit::WebContext::downloadFinished):
    Remove the download proxy from the map.
    
    * UIProcess/WebDownloadClient.cpp:
    (WebKit::WebDownloadClient::processDidCrash):
    Call the processDidCrash callback function.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72812 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index acb4533..27819a0 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,36 @@
+2010-11-29  Anders Carlsson  <andersca at apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Downloads: When the web process crashes, call error callbacks for pending downloads
+        https://bugs.webkit.org/show_bug.cgi?id=50164
+        <rdar://problem/8691170>
+
+        * UIProcess/API/C/WKContext.h:
+        Add processDidCrash callback.
+
+        * UIProcess/Downloads/DownloadProxy.cpp:
+        (WebKit::DownloadProxy::~DownloadProxy):
+        Assert that the web context is null.
+
+        (WebKit::DownloadProxy::processDidClose):
+        Call the processDidCrash callback.
+
+        (WebKit::DownloadProxy::didFinish):
+        (WebKit::DownloadProxy::didFail):
+        Call downloadFinished.
+
+        * UIProcess/WebContext.cpp:
+        (WebKit::WebContext::processDidClose):
+        Call processDidClose on all pending downloads.
+
+        (WebKit::WebContext::downloadFinished):
+        Remove the download proxy from the map.
+
+        * UIProcess/WebDownloadClient.cpp:
+        (WebKit::WebDownloadClient::processDidCrash):
+        Call the processDidCrash callback function.
+
 2010-11-29  Laszlo Gombos  <laszlo.1.gombos at nokia.com>
 
         Reviewed by Kenneth Rohde Christiansen.
diff --git a/WebKit2/UIProcess/API/C/WKContext.h b/WebKit2/UIProcess/API/C/WKContext.h
index 90ca8e9..3cd2b2e 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 (*WKContextDownloadProcessDidCrashCallback)(WKContextRef context, WKDownloadRef download, const void *clientInfo);
 
 struct WKContextDownloadClient {
     int                                                                 version;
@@ -90,6 +91,7 @@ struct WKContextDownloadClient {
     WKContextDownloadDidCreateDestinationCallback                       didCreateDestination;
     WKContextDownloadDidFinishCallback                                  didFinish;
     WKContextDownloadDidFailCallback                                    didFail;
+    WKContextDownloadProcessDidCrashCallback                            processDidCrash;
 };
 typedef struct WKContextDownloadClient WKContextDownloadClient;
 
diff --git a/WebKit2/UIProcess/Downloads/DownloadProxy.cpp b/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
index 2e1343c..1afca4b 100644
--- a/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
+++ b/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
@@ -53,6 +53,7 @@ DownloadProxy::DownloadProxy(WebContext* webContext)
 
 DownloadProxy::~DownloadProxy()
 {
+    ASSERT(!m_webContext);
 }
 
 void DownloadProxy::invalidate()
@@ -61,6 +62,14 @@ void DownloadProxy::invalidate()
     m_webContext = 0;
 }
 
+void DownloadProxy::processDidClose()
+{
+    if (!m_webContext)
+        return;
+
+    m_webContext->downloadClient().processDidCrash(m_webContext, this);
+}
+
 void DownloadProxy::didStart(const ResourceRequest& request)
 {
     m_request = request;
@@ -120,6 +129,9 @@ void DownloadProxy::didFinish()
         return;
 
     m_webContext->downloadClient().didFinish(m_webContext, this);
+
+    // This can cause the DownloadProxy object to be deleted.
+    m_webContext->downloadFinished(this);
 }
 
 void DownloadProxy::didFail(const ResourceError& error)
@@ -128,6 +140,9 @@ void DownloadProxy::didFail(const ResourceError& error)
         return;
 
     m_webContext->downloadClient().didFail(m_webContext, this, error);
+
+    // 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 0e3c43f..aae32e2 100644
--- a/WebKit2/UIProcess/Downloads/DownloadProxy.h
+++ b/WebKit2/UIProcess/Downloads/DownloadProxy.h
@@ -53,6 +53,7 @@ public:
     const WebCore::ResourceRequest& request() const { return m_request; }
 
     void invalidate();
+    void processDidClose();
 
     void didReceiveDownloadProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
     CoreIPC::SyncReplyMode didReceiveSyncDownloadProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
diff --git a/WebKit2/UIProcess/WebContext.cpp b/WebKit2/UIProcess/WebContext.cpp
index 1993eab..c10999a 100644
--- a/WebKit2/UIProcess/WebContext.cpp
+++ b/WebKit2/UIProcess/WebContext.cpp
@@ -197,8 +197,11 @@ void WebContext::processDidClose(WebProcessProxy* process)
     m_visitedLinkProvider.processDidClose();
 
     // Invalidate all outstanding downloads.
-    for (HashMap<uint64_t, RefPtr<DownloadProxy> >::iterator::Values it = m_downloads.begin().values(), end = m_downloads.end().values(); it != end; ++it)
+    for (HashMap<uint64_t, RefPtr<DownloadProxy> >::iterator::Values it = m_downloads.begin().values(), end = m_downloads.end().values(); it != end; ++it) {
+        (*it)->processDidClose();
         (*it)->invalidate();
+    }
+
     m_downloads.clear();
 
     m_process = 0;
@@ -424,6 +427,14 @@ uint64_t WebContext::createDownloadProxy()
     return downloadID;
 }
 
+void WebContext::downloadFinished(DownloadProxy* downloadProxy)
+{
+    ASSERT(m_downloads.contains(downloadProxy->downloadID()));
+
+    downloadProxy->invalidate();
+    m_downloads.remove(downloadProxy->downloadID());
+}
+
 void WebContext::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
 {
     if (messageID.is<CoreIPC::MessageClassWebContext>()) {
diff --git a/WebKit2/UIProcess/WebContext.h b/WebKit2/UIProcess/WebContext.h
index 7df33c7..20c8fa3 100644
--- a/WebKit2/UIProcess/WebContext.h
+++ b/WebKit2/UIProcess/WebContext.h
@@ -124,6 +124,7 @@ public:
     // Downloads.
     uint64_t createDownloadProxy();
     WebDownloadClient& downloadClient() { return m_downloadClient; }
+    void downloadFinished(DownloadProxy*);
 
 private:
     WebContext(ProcessModel, const String& injectedBundlePath);
diff --git a/WebKit2/UIProcess/WebDownloadClient.cpp b/WebKit2/UIProcess/WebDownloadClient.cpp
index 7e69d96..ba53588 100644
--- a/WebKit2/UIProcess/WebDownloadClient.cpp
+++ b/WebKit2/UIProcess/WebDownloadClient.cpp
@@ -98,4 +98,12 @@ void WebDownloadClient::didFail(WebContext* webContext, DownloadProxy* downloadP
     m_client.didFail(toAPI(webContext), toAPI(downloadProxy), toAPI(error), m_client.clientInfo);
 }
 
+void WebDownloadClient::processDidCrash(WebContext* webContext, DownloadProxy* downloadProxy)
+{
+    if (!m_client.processDidCrash)
+        return;
+
+    m_client.processDidCrash(toAPI(webContext), toAPI(downloadProxy), m_client.clientInfo);
+}
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebDownloadClient.h b/WebKit2/UIProcess/WebDownloadClient.h
index 7c75605..f5c2211 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 processDidCrash(WebContext*, DownloadProxy*);
 };
 
 } // namespace WebKit

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list