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

jianli at chromium.org jianli at chromium.org
Wed Dec 22 12:51:51 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 0459421a1e3e40495f8d5c6f2c1806908caf524b
Author: jianli at chromium.org <jianli at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Aug 31 20:57:29 2010 +0000

    Fix ThreadableBlobRegistry methods not to rely on WorkerContext.
    https://bugs.webkit.org/show_bug.cgi?id=44971
    
    Reviewed by Darin Fisher and David Levin.
    
    We could hit an ASSERT when we're performing some blob related cleanup
    in ScriptExecutionContext destructor when WorkerContext dies. The fix
    is to use isMainThread and callOnMainThread.
    
    * fileapi/ThreadableBlobRegistry.cpp:
    (WebCore::BlobRegistryContext::BlobRegistryContext):
    (WebCore::registerBlobURLTask):
    (WebCore::ThreadableBlobRegistry::registerBlobURL):
    (WebCore::registerBlobURLFromTask):
    (WebCore::unregisterBlobURLTask):
    (WebCore::ThreadableBlobRegistry::unregisterBlobURL):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66528 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index e1c2dd2..a88639b 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2010-08-31  Jian Li  <jianli at chromium.org>
+
+        Reviewed by Darin Fisher and David Levin.
+
+        Fix ThreadableBlobRegistry methods not to rely on WorkerContext.
+        https://bugs.webkit.org/show_bug.cgi?id=44971
+
+        We could hit an ASSERT when we're performing some blob related cleanup
+        in ScriptExecutionContext destructor when WorkerContext dies. The fix
+        is to use isMainThread and callOnMainThread.
+
+        * fileapi/ThreadableBlobRegistry.cpp:
+        (WebCore::BlobRegistryContext::BlobRegistryContext):
+        (WebCore::registerBlobURLTask):
+        (WebCore::ThreadableBlobRegistry::registerBlobURL):
+        (WebCore::registerBlobURLFromTask):
+        (WebCore::unregisterBlobURLTask):
+        (WebCore::ThreadableBlobRegistry::unregisterBlobURL):
+
 2010-08-31  Martin Robinson  <mrobinson at igalia.com>
 
         Reviewed by Gustavo Noronha Silva.
diff --git a/WebCore/fileapi/ThreadableBlobRegistry.cpp b/WebCore/fileapi/ThreadableBlobRegistry.cpp
index 8d72076..034557b 100644
--- a/WebCore/fileapi/ThreadableBlobRegistry.cpp
+++ b/WebCore/fileapi/ThreadableBlobRegistry.cpp
@@ -34,65 +34,82 @@
 
 #include "BlobData.h"
 #include "BlobRegistry.h"
-#include "CrossThreadTask.h"
-#include "NotImplemented.h"
 #include "ScriptExecutionContext.h"
-#include "WorkerContext.h"
-#include "WorkerLoaderProxy.h"
-#include "WorkerThread.h"
+#include <wtf/MainThread.h>
 
 namespace WebCore {
 
-#if ENABLE(BLOB)
+struct BlobRegistryContext {
+    BlobRegistryContext(const KURL& url, PassOwnPtr<BlobData> blobData)
+        : url(url.copy())
+        , blobData(blobData)
+    {
+    }
+
+    BlobRegistryContext(const KURL& url, const KURL& srcURL)
+        : url(url.copy())
+        , srcURL(srcURL.copy())
+    {
+    }
+
+    BlobRegistryContext(const KURL& url)
+        : url(url.copy())
+    {
+    }
+
+    KURL url;
+    KURL srcURL;
+    OwnPtr<BlobData> blobData;
+};
 
-static void postTaskToMainThread(ScriptExecutionContext* scriptExecutionContext, PassOwnPtr<ScriptExecutionContext::Task> task)
-{
-#if ENABLE(WORKERS)
-    ASSERT(scriptExecutionContext->isWorkerContext());
-    WorkerLoaderProxy& proxy = static_cast<WorkerContext*>(scriptExecutionContext)->thread()->workerLoaderProxy();
-    proxy.postTaskToLoader(task);
-#else
-    notImplemented();
-#endif
-}
+#if ENABLE(BLOB)
 
-static void registerBlobURLTask(ScriptExecutionContext*, const KURL& url, PassOwnPtr<BlobData> blobData)
+static void registerBlobURLTask(void* context)
 {
-    blobRegistry().registerBlobURL(url, blobData);
+    OwnPtr<BlobRegistryContext> blobRegistryContext = adoptPtr(static_cast<BlobRegistryContext*>(context));
+    blobRegistry().registerBlobURL(blobRegistryContext->url, blobRegistryContext->blobData.release());
 }
 
-void ThreadableBlobRegistry::registerBlobURL(ScriptExecutionContext* scriptExecutionContext, const KURL& url, PassOwnPtr<BlobData> blobData)
+void ThreadableBlobRegistry::registerBlobURL(ScriptExecutionContext*, const KURL& url, PassOwnPtr<BlobData> blobData)
 {
-    if (scriptExecutionContext->isWorkerContext())
-        postTaskToMainThread(scriptExecutionContext, createCallbackTask(&registerBlobURLTask, url, blobData));
-    else
-        registerBlobURLTask(scriptExecutionContext, url, blobData);
+    if (isMainThread())
+        blobRegistry().registerBlobURL(url, blobData);
+    else {
+        OwnPtr<BlobRegistryContext> context = adoptPtr(new BlobRegistryContext(url, blobData));
+        callOnMainThread(&registerBlobURLTask, context.leakPtr());
+    }
 }
 
-static void registerBlobURLFromTask(ScriptExecutionContext*, const KURL& url, const KURL& srcURL)
+static void registerBlobURLFromTask(void* context)
 {
-    blobRegistry().registerBlobURL(url, srcURL);
+    OwnPtr<BlobRegistryContext> blobRegistryContext = adoptPtr(static_cast<BlobRegistryContext*>(context));
+    blobRegistry().registerBlobURL(blobRegistryContext->url, blobRegistryContext->srcURL);
 }
 
-void ThreadableBlobRegistry::registerBlobURL(ScriptExecutionContext* scriptExecutionContext, const KURL& url, const KURL& srcURL)
+void ThreadableBlobRegistry::registerBlobURL(ScriptExecutionContext*, const KURL& url, const KURL& srcURL)
 {
-    if (scriptExecutionContext->isWorkerContext())
-        postTaskToMainThread(scriptExecutionContext, createCallbackTask(&registerBlobURLFromTask, url, srcURL));
-    else
-        registerBlobURLFromTask(scriptExecutionContext, url, srcURL);
+    if (isMainThread())
+        blobRegistry().registerBlobURL(url, srcURL);
+    else {
+        OwnPtr<BlobRegistryContext> context = adoptPtr(new BlobRegistryContext(url, srcURL));
+        callOnMainThread(&registerBlobURLFromTask, context.leakPtr());
+    }
 }
 
-static void unregisterBlobURLTask(ScriptExecutionContext*, const KURL& url)
+static void unregisterBlobURLTask(void* context)
 {
-    blobRegistry().unregisterBlobURL(url);
+    OwnPtr<BlobRegistryContext> blobRegistryContext = adoptPtr(static_cast<BlobRegistryContext*>(context));
+    blobRegistry().unregisterBlobURL(blobRegistryContext->url);
 }
 
-void ThreadableBlobRegistry::unregisterBlobURL(ScriptExecutionContext* scriptExecutionContext, const KURL& url)
+void ThreadableBlobRegistry::unregisterBlobURL(ScriptExecutionContext*, const KURL& url)
 {
-    if (scriptExecutionContext->isWorkerContext())
-        postTaskToMainThread(scriptExecutionContext, createCallbackTask(&unregisterBlobURLTask, url));
-    else
-        unregisterBlobURLTask(scriptExecutionContext, url);
+    if (isMainThread())
+        blobRegistry().unregisterBlobURL(url);
+    else {
+        OwnPtr<BlobRegistryContext> context = adoptPtr(new BlobRegistryContext(url));
+        callOnMainThread(&unregisterBlobURLTask, context.leakPtr());
+    }
 }
 
 #else

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list