<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[167904] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/167904">167904</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-04-28 13:55:09 -0700 (Mon, 28 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Unreviewed, rolling out <a href="http://trac.webkit.org/projects/webkit/changeset/167855">r167855</a>.
https://bugs.webkit.org/show_bug.cgi?id=132301

Broke the windows build (Requested by bfulgham on #webkit).

Reverted changeset:

&quot;ScriptExecutionContext::Task should work well with C++11
lambdas&quot;
https://bugs.webkit.org/show_bug.cgi?id=129795
http://trac.webkit.org/changeset/167855</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesquotaStorageErrorCallbackcpp">trunk/Source/WebCore/Modules/quota/StorageErrorCallback.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesquotaStorageErrorCallbackh">trunk/Source/WebCore/Modules/quota/StorageErrorCallback.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabasecpp">trunk/Source/WebCore/Modules/webdatabase/Database.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseSynccpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseSync.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLCallbackWrapperh">trunk/Source/WebCore/Modules/webdatabase/SQLCallbackWrapper.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebsocketsThreadableWebSocketChannelClientWrappercpp">trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebsocketsThreadableWebSocketChannelClientWrapperh">trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebsocketsWorkerThreadableWebSocketChannelcpp">trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebsocketsWorkerThreadableWebSocketChannelh">trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCallbackDatah">trunk/Source/WebCore/bindings/js/JSCallbackData.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskcpp">trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskh">trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMWindowBasecpp">trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWorkerGlobalScopeBasecpp">trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCoredomCrossThreadTaskh">trunk/Source/WebCore/dom/CrossThreadTask.h</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumenth">trunk/Source/WebCore/dom/Document.h</a></li>
<li><a href="#trunkSourceWebCoredomScriptExecutionContextcpp">trunk/Source/WebCore/dom/ScriptExecutionContext.cpp</a></li>
<li><a href="#trunkSourceWebCoredomScriptExecutionContexth">trunk/Source/WebCore/dom/ScriptExecutionContext.h</a></li>
<li><a href="#trunkSourceWebCoredomStringCallbackcpp">trunk/Source/WebCore/dom/StringCallback.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderappcacheApplicationCacheGroupcpp">trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersDefaultSharedWorkerRepositorycpp">trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerEventQueuecpp">trunk/Source/WebCore/workers/WorkerEventQueue.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerEventQueueh">trunk/Source/WebCore/workers/WorkerEventQueue.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopecpp">trunk/Source/WebCore/workers/WorkerGlobalScope.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopeh">trunk/Source/WebCore/workers/WorkerGlobalScope.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerLoaderProxyh">trunk/Source/WebCore/workers/WorkerLoaderProxy.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerMessagingProxycpp">trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerMessagingProxyh">trunk/Source/WebCore/workers/WorkerMessagingProxy.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerRunLoopcpp">trunk/Source/WebCore/workers/WorkerRunLoop.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerRunLooph">trunk/Source/WebCore/workers/WorkerRunLoop.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerThreadcpp">trunk/Source/WebCore/workers/WorkerThread.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/ChangeLog        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-04-28  Commit Queue  &lt;commit-queue@webkit.org&gt;
+
+        Unreviewed, rolling out r167855.
+        https://bugs.webkit.org/show_bug.cgi?id=132301
+
+        Broke the windows build (Requested by bfulgham on #webkit).
+
+        Reverted changeset:
+
+        &quot;ScriptExecutionContext::Task should work well with C++11
+        lambdas&quot;
+        https://bugs.webkit.org/show_bug.cgi?id=129795
+        http://trac.webkit.org/changeset/167855
+
</ins><span class="cx"> 2014-04-24  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Implement WebQuickLookHandleClient for WebKit2
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesquotaStorageErrorCallbackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/quota/StorageErrorCallback.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/quota/StorageErrorCallback.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/quota/StorageErrorCallback.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -40,13 +40,19 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> StorageErrorCallback::CallbackTask::CallbackTask(PassRefPtr&lt;StorageErrorCallback&gt; callback, ExceptionCode ec)
</span><del>-    : ScriptExecutionContext::Task([=] (ScriptExecutionContext*) {
-        if (callback)
-            callback-&gt;handleEvent(DOMCoreException::create(ExceptionCodeDescription(ec)).get());
-    })
</del><ins>+    : m_callback(callback)
+    , m_ec(ec)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StorageErrorCallback::CallbackTask::performTask(ScriptExecutionContext*)
+{
+    if (!m_callback)
+        return;
+    ExceptionCodeDescription description(m_ec);
+    m_callback-&gt;handleEvent(DOMCoreException::create(description).get());
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(QUOTA)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesquotaStorageErrorCallbackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/quota/StorageErrorCallback.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/quota/StorageErrorCallback.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/quota/StorageErrorCallback.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -50,9 +50,16 @@
</span><span class="cx"> 
</span><span class="cx">     class CallbackTask : public ScriptExecutionContext::Task {
</span><span class="cx">     public:
</span><ins>+        static PassOwnPtr&lt;CallbackTask&gt; create(PassRefPtr&lt;StorageErrorCallback&gt; callback, ExceptionCode ec)
+        {
+            return adoptPtr(new CallbackTask(callback, ec));
+        }
+
+        virtual void performTask(ScriptExecutionContext*);
+
+    private:
</ins><span class="cx">         CallbackTask(PassRefPtr&lt;StorageErrorCallback&gt;, ExceptionCode);
</span><span class="cx"> 
</span><del>-    private:
</del><span class="cx">         RefPtr&lt;StorageErrorCallback&gt; m_callback;
</span><span class="cx">         ExceptionCode m_ec;
</span><span class="cx">     };
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/Database.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/Database.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -87,17 +87,39 @@
</span><span class="cx">     ASSERT(m_databaseContext-&gt;databaseThread());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class DerefContextTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;DerefContextTask&gt; create(PassRefPtr&lt;ScriptExecutionContext&gt; context)
+    {
+        return adoptPtr(new DerefContextTask(context));
+    }
+
+    virtual void performTask(ScriptExecutionContext* context)
+    {
+        ASSERT_UNUSED(context, context == m_context);
+        m_context.clear();
+    }
+
+    virtual bool isCleanupTask() const { return true; }
+
+private:
+    DerefContextTask(PassRefPtr&lt;ScriptExecutionContext&gt; context)
+        : m_context(context)
+    {
+    }
+    
+    RefPtr&lt;ScriptExecutionContext&gt; m_context;
+};
+
</ins><span class="cx"> Database::~Database()
</span><span class="cx"> {
</span><span class="cx">     // The reference to the ScriptExecutionContext needs to be cleared on the JavaScript thread.  If we're on that thread already, we can just let the RefPtr's destruction do the dereffing.
</span><span class="cx">     if (!m_scriptExecutionContext-&gt;isContextThread()) {
</span><span class="cx">         // Grab a pointer to the script execution here because we're releasing it when we pass it to
</span><span class="cx">         // DerefContextTask::create.
</span><del>-        PassRefPtr&lt;ScriptExecutionContext&gt; passedContext = m_scriptExecutionContext.release();
-        passedContext-&gt;postTask({ScriptExecutionContext::Task::CleanupTask, [=] (ScriptExecutionContext* context) {
-            ASSERT_UNUSED(context, context == passedContext);
-            RefPtr&lt;ScriptExecutionContext&gt; scriptExecutionContext(passedContext);
-        }});
</del><ins>+        ScriptExecutionContext* scriptExecutionContext = m_scriptExecutionContext.get();
+        
+        scriptExecutionContext-&gt;postTask(DerefContextTask::create(m_scriptExecutionContext.release()));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -165,25 +187,49 @@
</span><span class="cx">     runTransaction(callback, errorCallback, successCallback, true);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void callTransactionErrorCallback(ScriptExecutionContext*, PassRefPtr&lt;SQLTransactionErrorCallback&gt; callback, PassRefPtr&lt;SQLError&gt; error)
+{
+    callback-&gt;handleEvent(error.get());
+}
+
</ins><span class="cx"> void Database::runTransaction(PassRefPtr&lt;SQLTransactionCallback&gt; callback, PassRefPtr&lt;SQLTransactionErrorCallback&gt; errorCallback,
</span><span class="cx">     PassRefPtr&lt;VoidCallback&gt; successCallback, bool readOnly, const ChangeVersionData* changeVersionData)
</span><span class="cx"> {
</span><del>-    RefPtr&lt;SQLTransactionErrorCallback&gt; errorCallbackProtector(errorCallback);
-    RefPtr&lt;SQLTransaction&gt; transaction = SQLTransaction::create(this, callback, successCallback, errorCallbackProtector, readOnly);
</del><ins>+    RefPtr&lt;SQLTransactionErrorCallback&gt; anotherRefToErrorCallback = errorCallback;
+    RefPtr&lt;SQLTransaction&gt; transaction = SQLTransaction::create(this, callback, successCallback, anotherRefToErrorCallback, readOnly);
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;SQLTransactionBackend&gt; transactionBackend(backend()-&gt;runTransaction(transaction.release(), readOnly, changeVersionData));
-    if (!transactionBackend &amp;&amp; errorCallbackProtector)
-        scriptExecutionContext()-&gt;postTask([=] (ScriptExecutionContext*) {
-            errorCallbackProtector-&gt;handleEvent(SQLError::create(SQLError::UNKNOWN_ERR, &quot;database has been closed&quot;).get());
-        });
</del><ins>+    RefPtr&lt;SQLTransactionBackend&gt; transactionBackend;
+    transactionBackend = backend()-&gt;runTransaction(transaction.release(), readOnly, changeVersionData);
+    if (!transactionBackend &amp;&amp; anotherRefToErrorCallback) {
+        RefPtr&lt;SQLError&gt; error = SQLError::create(SQLError::UNKNOWN_ERR, &quot;database has been closed&quot;);
+        scriptExecutionContext()-&gt;postTask(createCallbackTask(&amp;callTransactionErrorCallback, anotherRefToErrorCallback, error.release()));
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class DeliverPendingCallbackTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;DeliverPendingCallbackTask&gt; create(PassRefPtr&lt;SQLTransaction&gt; transaction)
+    {
+        return adoptPtr(new DeliverPendingCallbackTask(transaction));
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        m_transaction-&gt;performPendingCallback();
+    }
+
+private:
+    DeliverPendingCallbackTask(PassRefPtr&lt;SQLTransaction&gt; transaction)
+        : m_transaction(transaction)
+    {
+    }
+
+    RefPtr&lt;SQLTransaction&gt; m_transaction;
+};
+
</ins><span class="cx"> void Database::scheduleTransactionCallback(SQLTransaction* transaction)
</span><span class="cx"> {
</span><del>-    RefPtr&lt;SQLTransaction&gt; transactionProtector(transaction);
-    m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext*) {
-        transactionProtector-&gt;performPendingCallback();
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(DeliverPendingCallbackTask::create(transaction));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Vector&lt;String&gt; Database::performGetTableNames()
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -117,6 +117,29 @@
</span><span class="cx">     m_databaseIsAvailable = available;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class DatabaseCreationCallbackTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;DatabaseCreationCallbackTask&gt; create(PassRefPtr&lt;Database&gt; database, PassRefPtr&lt;DatabaseCallback&gt; creationCallback)
+    {
+        return adoptPtr(new DatabaseCreationCallbackTask(database, creationCallback));
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        m_creationCallback-&gt;handleEvent(m_database.get());
+    }
+
+private:
+    DatabaseCreationCallbackTask(PassRefPtr&lt;Database&gt; database, PassRefPtr&lt;DatabaseCallback&gt; callback)
+        : m_database(database)
+        , m_creationCallback(callback)
+    {
+    }
+
+    RefPtr&lt;Database&gt; m_database;
+    RefPtr&lt;DatabaseCallback&gt; m_creationCallback;
+};
+
</ins><span class="cx"> PassRefPtr&lt;DatabaseContext&gt; DatabaseManager::existingDatabaseContextFor(ScriptExecutionContext* context)
</span><span class="cx"> {
</span><span class="cx">     std::lock_guard&lt;std::mutex&gt; lock(m_mutex);
</span><span class="lines">@@ -311,9 +334,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (backend-&gt;isNew() &amp;&amp; creationCallback.get()) {
</span><span class="cx">         LOG(StorageAPI, &quot;Scheduling DatabaseCreationCallbackTask for database %p\n&quot;, database.get());
</span><del>-        database-&gt;m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext*) {
-            creationCallback-&gt;handleEvent(database.get());
-        });
</del><ins>+        database-&gt;m_scriptExecutionContext-&gt;postTask(DatabaseCreationCallbackTask::create(database, creationCallback));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(database);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseSynccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseSync.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseSync.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseSync.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -158,6 +158,27 @@
</span><span class="cx">     // FIXME: need to do something similar to closeImmediately(), but in a sync way
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class CloseSyncDatabaseOnContextThreadTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;CloseSyncDatabaseOnContextThreadTask&gt; create(PassRefPtr&lt;DatabaseSync&gt; database)
+    {
+        return adoptPtr(new CloseSyncDatabaseOnContextThreadTask(database));
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        m_database-&gt;closeImmediately();
+    }
+
+private:
+    CloseSyncDatabaseOnContextThreadTask(PassRefPtr&lt;DatabaseSync&gt; database)
+        : m_database(database)
+    {
+    }
+
+    RefPtr&lt;DatabaseSync&gt; m_database;
+};
+
</ins><span class="cx"> void DatabaseSync::closeImmediately()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_scriptExecutionContext-&gt;isContextThread());
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLCallbackWrapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLCallbackWrapper.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLCallbackWrapper.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLCallbackWrapper.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> 
</span><span class="cx">     void clear()
</span><span class="cx">     {
</span><del>-        ScriptExecutionContext* scriptExecutionContextPtr;
</del><ins>+        ScriptExecutionContext* context;
</ins><span class="cx">         T* callback;
</span><span class="cx">         {
</span><span class="cx">             MutexLocker locker(m_mutex);
</span><span class="lines">@@ -70,14 +70,10 @@
</span><span class="cx">                 m_scriptExecutionContext = 0;
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            scriptExecutionContextPtr = m_scriptExecutionContext.release().leakRef();
</del><ins>+            context = m_scriptExecutionContext.release().leakRef();
</ins><span class="cx">             callback = m_callback.release().leakRef();
</span><span class="cx">         }
</span><del>-        scriptExecutionContextPtr-&gt;postTask({ ScriptExecutionContext::Task::CleanupTask, [=] (ScriptExecutionContext* context) {
-            ASSERT_UNUSED(context, context == scriptExecutionContextPtr &amp;&amp; context-&gt;isContextThread());
-            callback-&gt;deref();
-            scriptExecutionContextPtr-&gt;deref();
-        } });
</del><ins>+        context-&gt;postTask(SafeReleaseTask::create(callback));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     PassRefPtr&lt;T&gt; unwrap()
</span><span class="lines">@@ -92,6 +88,31 @@
</span><span class="cx">     bool hasCallback() const { return m_callback; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    class SafeReleaseTask : public ScriptExecutionContext::Task {
+    public:
+        static PassOwnPtr&lt;SafeReleaseTask&gt; create(T* callbackToRelease)
+        {
+            return adoptPtr(new SafeReleaseTask(callbackToRelease));
+        }
+
+        virtual void performTask(ScriptExecutionContext* context)
+        {
+            ASSERT(m_callbackToRelease &amp;&amp; context &amp;&amp; context-&gt;isContextThread());
+            m_callbackToRelease-&gt;deref();
+            context-&gt;deref();
+        }
+
+        virtual bool isCleanupTask() const { return true; }
+
+    private:
+        explicit SafeReleaseTask(T* callbackToRelease)
+            : m_callbackToRelease(callbackToRelease)
+        {
+        }
+
+        T* m_callbackToRelease;
+    };
+
</ins><span class="cx">     Mutex m_mutex;
</span><span class="cx">     RefPtr&lt;T&gt; m_callback;
</span><span class="cx">     RefPtr&lt;ScriptExecutionContext&gt; m_scriptExecutionContext;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebsocketsThreadableWebSocketChannelClientWrappercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -157,49 +157,49 @@
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didConnect()
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didConnectCallback, this)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didConnectCallback, this));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didReceiveMessage(const String&amp; message)
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didReceiveMessageCallback, this, message)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didReceiveMessageCallback, this, message));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData(PassOwnPtr&lt;Vector&lt;char&gt;&gt; binaryData)
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didReceiveBinaryDataCallback, this, binaryData)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didReceiveBinaryDataCallback, this, binaryData));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didUpdateBufferedAmount(unsigned long bufferedAmount)
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didUpdateBufferedAmountCallback, this, bufferedAmount)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didUpdateBufferedAmountCallback, this, bufferedAmount));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didStartClosingHandshake()
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didStartClosingHandshakeCallback, this)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didStartClosingHandshakeCallback, this));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didClose(unsigned long unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String&amp; reason)
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didCloseCallback, this, unhandledBufferedAmount, closingHandshakeCompletion, code, reason)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didCloseCallback, this, unhandledBufferedAmount, closingHandshakeCompletion, code, reason));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didReceiveMessageError()
</span><span class="cx"> {
</span><del>-    m_pendingTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(createCallbackTask(&amp;didReceiveMessageErrorCallback, this)));
</del><ins>+    m_pendingTasks.append(createCallbackTask(&amp;didReceiveMessageErrorCallback, this));
</ins><span class="cx">     if (!m_suspended)
</span><span class="cx">         processPendingTasks();
</span><span class="cx"> }
</span><span class="lines">@@ -231,10 +231,10 @@
</span><span class="cx">         m_context-&gt;postTask(createCallbackTask(&amp;ThreadableWebSocketChannelClientWrapper::processPendingTasksCallback, this));
</span><span class="cx">         return;
</span><span class="cx">     }
</span><del>-
-    Vector&lt;std::unique_ptr&lt;ScriptExecutionContext::Task&gt;&gt; pendingTasks = std::move(m_pendingTasks);
-    for (auto&amp; task : pendingTasks)
-        task-&gt;performTask(nullptr);
</del><ins>+    Vector&lt;OwnPtr&lt;ScriptExecutionContext::Task&gt;&gt; tasks;
+    tasks.swap(m_pendingTasks);
+    for (Vector&lt;OwnPtr&lt;ScriptExecutionContext::Task&gt;&gt;::const_iterator iter = tasks.begin(); iter != tasks.end(); ++iter)
+        (*iter)-&gt;performTask(0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadableWebSocketChannelClientWrapper::didConnectCallback(ScriptExecutionContext* context, PassRefPtr&lt;ThreadableWebSocketChannelClientWrapper&gt; wrapper)
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebsocketsThreadableWebSocketChannelClientWrapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -37,7 +37,6 @@
</span><span class="cx"> #include &quot;ThreadableWebSocketChannel.h&quot;
</span><span class="cx"> #include &quot;WebSocketChannelClient.h&quot;
</span><span class="cx"> #include &quot;WorkerThreadableWebSocketChannel.h&quot;
</span><del>-#include &lt;memory&gt;
</del><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/OwnPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/PassOwnPtr.h&gt;
</span><span class="lines">@@ -115,7 +114,7 @@
</span><span class="cx">     ThreadableWebSocketChannel::SendResult m_sendRequestResult;
</span><span class="cx">     unsigned long m_bufferedAmount;
</span><span class="cx">     bool m_suspended;
</span><del>-    Vector&lt;std::unique_ptr&lt;ScriptExecutionContext::Task&gt;&gt; m_pendingTasks;
</del><ins>+    Vector&lt;OwnPtr&lt;ScriptExecutionContext::Task&gt;&gt; m_pendingTasks;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebsocketsWorkerThreadableWebSocketChannelcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -359,6 +359,44 @@
</span><span class="cx">     disconnect();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class WorkerThreadableWebSocketChannel::WorkerGlobalScopeDidInitializeTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;ScriptExecutionContext::Task&gt; create(WorkerThreadableWebSocketChannel::Peer* peer,
+                                                           WorkerLoaderProxy* loaderProxy,
+                                                           PassRefPtr&lt;ThreadableWebSocketChannelClientWrapper&gt; workerClientWrapper)
+    {
+        return adoptPtr(new WorkerGlobalScopeDidInitializeTask(peer, loaderProxy, workerClientWrapper));
+    }
+
+    virtual ~WorkerGlobalScopeDidInitializeTask() { }
+    virtual void performTask(ScriptExecutionContext* context) override
+    {
+        ASSERT_UNUSED(context, context-&gt;isWorkerGlobalScope());
+        if (m_workerClientWrapper-&gt;failedWebSocketChannelCreation()) {
+            // If Bridge::initialize() quitted earlier, we need to kick mainThreadDestroy() to delete the peer.
+            OwnPtr&lt;WorkerThreadableWebSocketChannel::Peer&gt; peer = adoptPtr(m_peer);
+            m_peer = 0;
+            m_loaderProxy-&gt;postTaskToLoader(createCallbackTask(&amp;WorkerThreadableWebSocketChannel::mainThreadDestroy, peer.release()));
+        } else
+            m_workerClientWrapper-&gt;didCreateWebSocketChannel(m_peer);
+    }
+    virtual bool isCleanupTask() const override { return true; }
+
+private:
+    WorkerGlobalScopeDidInitializeTask(WorkerThreadableWebSocketChannel::Peer* peer,
+                                   WorkerLoaderProxy* loaderProxy,
+                                   PassRefPtr&lt;ThreadableWebSocketChannelClientWrapper&gt; workerClientWrapper)
+        : m_peer(peer)
+        , m_loaderProxy(loaderProxy)
+        , m_workerClientWrapper(workerClientWrapper)
+    {
+    }
+
+    WorkerThreadableWebSocketChannel::Peer* m_peer;
+    WorkerLoaderProxy* m_loaderProxy;
+    RefPtr&lt;ThreadableWebSocketChannelClientWrapper&gt; m_workerClientWrapper;
+};
+
</ins><span class="cx"> void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecutionContext* context, WorkerLoaderProxy* loaderProxy, PassRefPtr&lt;ThreadableWebSocketChannelClientWrapper&gt; prpClientWrapper, const String&amp; taskMode)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="lines">@@ -366,18 +404,12 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;ThreadableWebSocketChannelClientWrapper&gt; clientWrapper = prpClientWrapper;
</span><span class="cx"> 
</span><del>-    Peer* peerPtr = Peer::create(clientWrapper, *loaderProxy, context, taskMode);
-    bool sent = loaderProxy-&gt;postTaskForModeToWorkerGlobalScope({ ScriptExecutionContext::Task::CleanupTask, [=] (ScriptExecutionContext* context) {
-        ASSERT_UNUSED(context, context-&gt;isWorkerGlobalScope());
-        if (clientWrapper-&gt;failedWebSocketChannelCreation()) {
-            // If Bridge::initialize() quitted earlier, we need to kick mainThreadDestroy() to delete the peer.
-            loaderProxy-&gt;postTaskToLoader(createCallbackTask(&amp;WorkerThreadableWebSocketChannel::mainThreadDestroy, AllowCrossThreadAccess(peerPtr)));
-        } else
-            clientWrapper-&gt;didCreateWebSocketChannel(peerPtr);
-    } }, taskMode);
</del><ins>+    Peer* peer = Peer::create(clientWrapper, *loaderProxy, context, taskMode);
+    bool sent = loaderProxy-&gt;postTaskForModeToWorkerGlobalScope(
+        WorkerThreadableWebSocketChannel::WorkerGlobalScopeDidInitializeTask::create(peer, loaderProxy, clientWrapper), taskMode);
</ins><span class="cx">     if (!sent) {
</span><span class="cx">         clientWrapper-&gt;clearPeer();
</span><del>-        delete peerPtr;
</del><ins>+        delete peer;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -543,21 +575,25 @@
</span><span class="cx">     m_loaderProxy.postTaskToLoader(createCallbackTask(&amp;WorkerThreadableWebSocketChannel::mainThreadFail, AllowCrossThreadAccess(m_peer), reason));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerThreadableWebSocketChannel::mainThreadDestroy(ScriptExecutionContext* context, Peer* peerPtr)
</del><ins>+void WorkerThreadableWebSocketChannel::mainThreadDestroy(ScriptExecutionContext* context, PassOwnPtr&lt;Peer&gt; peer)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     ASSERT_UNUSED(context, context-&gt;isDocument());
</span><del>-    std::unique_ptr&lt;Peer&gt; peer(peerPtr);
</del><ins>+    ASSERT_UNUSED(peer, peer);
+
+    // Peer object will be deleted even if the task does not run in the main thread's cleanup period, because
+    // the destructor for the task object (created by createCallbackTask()) will automatically delete the peer.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerThreadableWebSocketChannel::Bridge::disconnect()
</span><span class="cx"> {
</span><span class="cx">     clearClientWrapper();
</span><span class="cx">     if (m_peer) {
</span><del>-        m_loaderProxy.postTaskToLoader(createCallbackTask(&amp;WorkerThreadableWebSocketChannel::mainThreadDestroy, AllowCrossThreadAccess(m_peer)));
-        m_peer = nullptr;
</del><ins>+        OwnPtr&lt;Peer&gt; peer = adoptPtr(m_peer);
+        m_peer = 0;
+        m_loaderProxy.postTaskToLoader(createCallbackTask(&amp;WorkerThreadableWebSocketChannel::mainThreadDestroy, peer.release()));
</ins><span class="cx">     }
</span><del>-    m_workerGlobalScope = nullptr;
</del><ins>+    m_workerGlobalScope = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerThreadableWebSocketChannel::mainThreadSuspend(ScriptExecutionContext* context, Peer* peer)
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebsocketsWorkerThreadableWebSocketChannelh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -176,7 +176,7 @@
</span><span class="cx">     static void mainThreadBufferedAmount(ScriptExecutionContext*, Peer*);
</span><span class="cx">     static void mainThreadClose(ScriptExecutionContext*, Peer*, int code, const String&amp; reason);
</span><span class="cx">     static void mainThreadFail(ScriptExecutionContext*, Peer*, const String&amp; reason);
</span><del>-    static void mainThreadDestroy(ScriptExecutionContext*, Peer*);
</del><ins>+    static void mainThreadDestroy(ScriptExecutionContext*, PassOwnPtr&lt;Peer&gt;);
</ins><span class="cx">     static void mainThreadSuspend(ScriptExecutionContext*, Peer*);
</span><span class="cx">     static void mainThreadResume(ScriptExecutionContext*, Peer*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCallbackDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCallbackData.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCallbackData.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/bindings/js/JSCallbackData.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -79,12 +79,21 @@
</span><span class="cx"> 
</span><span class="cx"> class DeleteCallbackDataTask : public ScriptExecutionContext::Task {
</span><span class="cx"> public:
</span><del>-    DeleteCallbackDataTask(JSCallbackData* data)
-        : ScriptExecutionContext::Task({ ScriptExecutionContext::Task::CleanupTask, [=] (ScriptExecutionContext*) {
-            delete data;
-        } })
</del><ins>+    static PassOwnPtr&lt;DeleteCallbackDataTask&gt; create(JSCallbackData* data)
</ins><span class="cx">     {
</span><ins>+        return adoptPtr(new DeleteCallbackDataTask(data));
</ins><span class="cx">     }
</span><ins>+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        delete m_data;
+    }
+    virtual bool isCleanupTask() const { return true; }
+private:
+
+    DeleteCallbackDataTask(JSCallbackData* data) : m_data(data) {}
+
+    JSCallbackData* m_data;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -80,12 +80,17 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, PassRefPtr&lt;Microtask&gt; task)
</span><del>-    : ScriptExecutionContext::Task(nullptr)
</del><ins>+    : m_callback(JSGlobalObjectCallback::create(globalObject, task))
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;JSGlobalObjectCallback&gt; callback = JSGlobalObjectCallback::create(globalObject, task);
-    m_task = [=] (ScriptExecutionContext*) {
-        callback-&gt;call();
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSGlobalObjectTask::~JSGlobalObjectTask()
+{
+}
+
+void JSGlobalObjectTask::performTask(ScriptExecutionContext*)
+{
+    m_callback-&gt;call();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -31,9 +31,23 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class JSGlobalObjectTask : public ScriptExecutionContext::Task {
</del><ins>+class JSGlobalObjectCallback;
+
+class JSGlobalObjectTask final : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><ins>+    static PassOwnPtr&lt;JSGlobalObjectTask&gt; create(JSDOMGlobalObject* globalObject, PassRefPtr&lt;JSC::Microtask&gt; task)
+    {
+        return adoptPtr(new JSGlobalObjectTask(globalObject, task));
+    }
+
+    virtual ~JSGlobalObjectTask();
+
+private:
</ins><span class="cx">     JSGlobalObjectTask(JSDOMGlobalObject*, PassRefPtr&lt;JSC::Microtask&gt;);
</span><ins>+
+    virtual void performTask(ScriptExecutionContext*) override;
+
+    RefPtr&lt;JSGlobalObjectCallback&gt; m_callback;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMWindowBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -190,7 +190,7 @@
</span><span class="cx"> void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr&lt;Microtask&gt; task)
</span><span class="cx"> {
</span><span class="cx">     const JSDOMWindowBase* thisObject = static_cast&lt;const JSDOMWindowBase*&gt;(object);
</span><del>-    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask((JSDOMWindowBase*)thisObject, task));
</del><ins>+    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask::create((JSDOMWindowBase*)thisObject, task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSDOMWindowBase::willRemoveFromWindowShell()
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWorkerGlobalScopeBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx"> void JSWorkerGlobalScopeBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr&lt;Microtask&gt; task)
</span><span class="cx"> {
</span><span class="cx">     const JSWorkerGlobalScopeBase* thisObject = static_cast&lt;const JSWorkerGlobalScopeBase*&gt;(object);
</span><del>-    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask((JSDOMGlobalObject*)thisObject, task));
</del><ins>+    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask::create((JSDOMGlobalObject*)thisObject, task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue toJS(ExecState* exec, JSDOMGlobalObject*, WorkerGlobalScope* workerGlobalScope)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -3435,7 +3435,7 @@
</span><span class="cx">     push(@implContent, &quot;    if (!context || context-&gt;isContextThread())\n&quot;);
</span><span class="cx">     push(@implContent, &quot;        delete m_data;\n&quot;);
</span><span class="cx">     push(@implContent, &quot;    else\n&quot;);
</span><del>-    push(@implContent, &quot;        context-&gt;postTask(DeleteCallbackDataTask(m_data));\n&quot;);
</del><ins>+    push(@implContent, &quot;        context-&gt;postTask(DeleteCallbackDataTask::create(m_data));\n&quot;);
</ins><span class="cx">     push(@implContent, &quot;#ifndef NDEBUG\n&quot;);
</span><span class="cx">     push(@implContent, &quot;    m_data = 0;\n&quot;);
</span><span class="cx">     push(@implContent, &quot;#endif\n&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCoredomCrossThreadTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/CrossThreadTask.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/CrossThreadTask.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/dom/CrossThreadTask.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -57,19 +57,25 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1&gt;
</span><del>-class CrossThreadTask1 {
</del><ins>+class CrossThreadTask1 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1);
</span><span class="cx">     typedef CrossThreadTask1&lt;P1, MP1&gt; CrossThreadTask;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P1&gt;::ParamType Param1;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask1(Method method, Param1 parameter1)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1);
</span><span class="cx">     }
</span><span class="lines">@@ -80,13 +86,19 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2&gt;
</span><del>-class CrossThreadTask2 {
</del><ins>+class CrossThreadTask2 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2);
</span><span class="cx">     typedef CrossThreadTask2&lt;P1, MP1, P2, MP2&gt; CrossThreadTask;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P1&gt;::ParamType Param1;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P2&gt;::ParamType Param2;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask2(Method method, Param1 parameter1, Param2 parameter2)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="lines">@@ -94,7 +106,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2);
</span><span class="cx">     }
</span><span class="lines">@@ -106,7 +118,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3&gt;
</span><del>-class CrossThreadTask3 {
</del><ins>+class CrossThreadTask3 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3);
</span><span class="cx">     typedef CrossThreadTask3&lt;P1, MP1, P2, MP2, P3, MP3&gt; CrossThreadTask;
</span><span class="lines">@@ -114,6 +126,12 @@
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P2&gt;::ParamType Param2;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P3&gt;::ParamType Param3;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, parameter3));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask3(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="lines">@@ -122,7 +140,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2, m_parameter3);
</span><span class="cx">     }
</span><span class="lines">@@ -135,7 +153,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4&gt;
</span><del>-class CrossThreadTask4 {
</del><ins>+class CrossThreadTask4 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4);
</span><span class="cx">     typedef CrossThreadTask4&lt;P1, MP1, P2, MP2, P3, MP3, P4, MP4&gt; CrossThreadTask;
</span><span class="lines">@@ -144,6 +162,12 @@
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P3&gt;::ParamType Param3;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P4&gt;::ParamType Param4;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask4(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="lines">@@ -153,7 +177,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4);
</span><span class="cx">     }
</span><span class="lines">@@ -167,7 +191,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5&gt;
</span><del>-class CrossThreadTask5 {
</del><ins>+class CrossThreadTask5 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5);
</span><span class="cx">     typedef CrossThreadTask5&lt;P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5&gt; CrossThreadTask;
</span><span class="lines">@@ -177,6 +201,12 @@
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P4&gt;::ParamType Param4;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P5&gt;::ParamType Param5;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask5(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="lines">@@ -187,7 +217,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5);
</span><span class="cx">     }
</span><span class="lines">@@ -202,7 +232,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6&gt;
</span><del>-class CrossThreadTask6 {
</del><ins>+class CrossThreadTask6 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6);
</span><span class="cx">     typedef CrossThreadTask6&lt;P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6&gt; CrossThreadTask;
</span><span class="lines">@@ -213,6 +243,12 @@
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P5&gt;::ParamType Param5;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P6&gt;::ParamType Param6;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask6(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="lines">@@ -224,7 +260,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6);
</span><span class="cx">     }
</span><span class="lines">@@ -240,7 +276,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7&gt;
</span><del>-class CrossThreadTask7 {
</del><ins>+class CrossThreadTask7 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7);
</span><span class="cx">     typedef CrossThreadTask7&lt;P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6, P7, MP7&gt; CrossThreadTask;
</span><span class="lines">@@ -252,6 +288,12 @@
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P6&gt;::ParamType Param6;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P7&gt;::ParamType Param7;
</span><span class="cx"> 
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7));
+    }
+
+private:
</ins><span class="cx">     CrossThreadTask7(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7)
</span><span class="cx">         : m_method(method)
</span><span class="cx">         , m_parameter1(parameter1)
</span><span class="lines">@@ -264,7 +306,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6, m_parameter7);
</span><span class="cx">     }
</span><span class="lines">@@ -281,7 +323,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8&gt;
</span><del>-class CrossThreadTask8 {
</del><ins>+class CrossThreadTask8 : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><span class="cx">     typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8);
</span><span class="cx">     typedef CrossThreadTask8&lt;P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6, P7, MP7, P8, MP8&gt; CrossThreadTask;
</span><span class="lines">@@ -294,6 +336,12 @@
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P7&gt;::ParamType Param7;
</span><span class="cx">     typedef typename CrossThreadTaskTraits&lt;P8&gt;::ParamType Param8;
</span><span class="cx">     
</span><ins>+    static PassOwnPtr&lt;CrossThreadTask&gt; create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7, Param8 parameter8)
+    {
+        return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8));
+    }
+    
+private:
</ins><span class="cx">     CrossThreadTask8(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7, Param8 parameter8)
</span><span class="cx">     : m_method(method)
</span><span class="cx">     , m_parameter1(parameter1)
</span><span class="lines">@@ -307,7 +355,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void performTask(ScriptExecutionContext* context)
</del><ins>+    virtual void performTask(ScriptExecutionContext* context)
</ins><span class="cx">     {
</span><span class="cx">         (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6, m_parameter7, m_parameter8);
</span><span class="cx">     }
</span><span class="lines">@@ -325,134 +373,102 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1),
</span><span class="cx">     const P1&amp; parameter1)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask1&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1&gt;(
</del><ins>+    return CrossThreadTask1&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1&gt;::create(
</ins><span class="cx">         method,
</span><span class="cx">         CrossThreadCopier&lt;P1&gt;::copy(parameter1));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1, MP2),
</span><span class="cx">     const P1&amp; parameter1, const P2&amp; parameter2)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask2&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2&gt;(
</del><ins>+    return CrossThreadTask2&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2&gt;::create(
</ins><span class="cx">         method,
</span><span class="cx">         CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1, MP2, MP3),
</span><span class="cx">     const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask3&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3&gt;(
</del><ins>+    return CrossThreadTask3&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3&gt;::create(
</ins><span class="cx">         method,
</span><span class="cx">         CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
</span><span class="cx">         CrossThreadCopier&lt;P3&gt;::copy(parameter3));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4),
</span><span class="cx">     const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3, const P4&amp; parameter4)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask4&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
-        typename CrossThreadCopier&lt;P4&gt;::Type, MP4&gt;(
</del><ins>+    return CrossThreadTask4&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
+        typename CrossThreadCopier&lt;P4&gt;::Type, MP4&gt;::create(
</ins><span class="cx">             method,
</span><span class="cx">             CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
</span><span class="cx">             CrossThreadCopier&lt;P3&gt;::copy(parameter3), CrossThreadCopier&lt;P4&gt;::copy(parameter4));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5),
</span><span class="cx">     const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3, const P4&amp; parameter4, const P5&amp; parameter5)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask5&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
-        typename CrossThreadCopier&lt;P4&gt;::Type, MP4, typename CrossThreadCopier&lt;P5&gt;::Type, MP5&gt;(
</del><ins>+    return CrossThreadTask5&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
+        typename CrossThreadCopier&lt;P4&gt;::Type, MP4, typename CrossThreadCopier&lt;P5&gt;::Type, MP5&gt;::create(
</ins><span class="cx">             method,
</span><span class="cx">             CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
</span><span class="cx">             CrossThreadCopier&lt;P3&gt;::copy(parameter3), CrossThreadCopier&lt;P4&gt;::copy(parameter4),
</span><span class="cx">             CrossThreadCopier&lt;P5&gt;::copy(parameter5));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6),
</span><span class="cx">     const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3, const P4&amp; parameter4, const P5&amp; parameter5, const P6&amp; parameter6)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask6&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
-        typename CrossThreadCopier&lt;P4&gt;::Type, MP4, typename CrossThreadCopier&lt;P5&gt;::Type, MP5, typename CrossThreadCopier&lt;P6&gt;::Type, MP6&gt;(
</del><ins>+    return CrossThreadTask6&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
+        typename CrossThreadCopier&lt;P4&gt;::Type, MP4, typename CrossThreadCopier&lt;P5&gt;::Type, MP5, typename CrossThreadCopier&lt;P6&gt;::Type, MP6&gt;::create(
</ins><span class="cx">             method,
</span><span class="cx">             CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
</span><span class="cx">             CrossThreadCopier&lt;P3&gt;::copy(parameter3), CrossThreadCopier&lt;P4&gt;::copy(parameter4),
</span><span class="cx">             CrossThreadCopier&lt;P5&gt;::copy(parameter5), CrossThreadCopier&lt;P6&gt;::copy(parameter6));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
</ins><span class="cx">     void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7),
</span><span class="cx">     const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3, const P4&amp; parameter4, const P5&amp; parameter5, const P6&amp; parameter6, const P7&amp; parameter7)
</span><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask7&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
</del><ins>+    return CrossThreadTask7&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
</ins><span class="cx">         typename CrossThreadCopier&lt;P4&gt;::Type, MP4, typename CrossThreadCopier&lt;P5&gt;::Type, MP5, typename CrossThreadCopier&lt;P6&gt;::Type, MP6,
</span><del>-        typename CrossThreadCopier&lt;P7&gt;::Type, MP7&gt;(
</del><ins>+        typename CrossThreadCopier&lt;P7&gt;::Type, MP7&gt;::create(
</ins><span class="cx">             method,
</span><span class="cx">             CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
</span><span class="cx">             CrossThreadCopier&lt;P3&gt;::copy(parameter3), CrossThreadCopier&lt;P4&gt;::copy(parameter4),
</span><span class="cx">             CrossThreadCopier&lt;P5&gt;::copy(parameter5), CrossThreadCopier&lt;P6&gt;::copy(parameter6),
</span><span class="cx">             CrossThreadCopier&lt;P7&gt;::copy(parameter7));
</span><del>-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8&gt;
</span><del>-ScriptExecutionContext::Task createCallbackTask(
-    void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
-    const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3, const P4&amp; parameter4, const P5&amp; parameter5, const P6&amp; parameter6, const P7&amp; parameter7, const P8&amp; parameter8)
</del><ins>+PassOwnPtr&lt;ScriptExecutionContext::Task&gt; createCallbackTask(
+                                                            void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
+                                                            const P1&amp; parameter1, const P2&amp; parameter2, const P3&amp; parameter3, const P4&amp; parameter4, const P5&amp; parameter5, const P6&amp; parameter6, const P7&amp; parameter7, const P8&amp; parameter8)
</ins><span class="cx"> {
</span><del>-    auto taskPtr = new CrossThreadTask8&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
</del><ins>+    return CrossThreadTask8&lt;typename CrossThreadCopier&lt;P1&gt;::Type, MP1, typename CrossThreadCopier&lt;P2&gt;::Type, MP2, typename CrossThreadCopier&lt;P3&gt;::Type, MP3,
</ins><span class="cx">     typename CrossThreadCopier&lt;P4&gt;::Type, MP4, typename CrossThreadCopier&lt;P5&gt;::Type, MP5, typename CrossThreadCopier&lt;P6&gt;::Type, MP6,
</span><del>-    typename CrossThreadCopier&lt;P7&gt;::Type, MP7, typename CrossThreadCopier&lt;P8&gt;::Type, MP8&gt;(
-        method,
-        CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
-        CrossThreadCopier&lt;P3&gt;::copy(parameter3), CrossThreadCopier&lt;P4&gt;::copy(parameter4),
-        CrossThreadCopier&lt;P5&gt;::copy(parameter5), CrossThreadCopier&lt;P6&gt;::copy(parameter6),
-        CrossThreadCopier&lt;P7&gt;::copy(parameter7), CrossThreadCopier&lt;P8&gt;::copy(parameter8));
-    return [=] (ScriptExecutionContext* context) {
-        std::unique_ptr&lt;typename std::remove_pointer&lt;decltype(taskPtr)&gt;::type&gt; task(taskPtr);
-        task-&gt;performTask(context);
-    };
</del><ins>+    typename CrossThreadCopier&lt;P7&gt;::Type, MP7, typename CrossThreadCopier&lt;P8&gt;::Type, MP8&gt;::create(
+                                                       method,
+                                                       CrossThreadCopier&lt;P1&gt;::copy(parameter1), CrossThreadCopier&lt;P2&gt;::copy(parameter2),
+                                                       CrossThreadCopier&lt;P3&gt;::copy(parameter3), CrossThreadCopier&lt;P4&gt;::copy(parameter4),
+                                                       CrossThreadCopier&lt;P5&gt;::copy(parameter5), CrossThreadCopier&lt;P6&gt;::copy(parameter6),
+                                                       CrossThreadCopier&lt;P7&gt;::copy(parameter7), CrossThreadCopier&lt;P8&gt;::copy(parameter8));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/dom/Document.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -4876,7 +4876,7 @@
</span><span class="cx"> void Document::addConsoleMessage(MessageSource source, MessageLevel level, const String&amp; message, unsigned long requestIdentifier)
</span><span class="cx"> {
</span><span class="cx">     if (!isContextThread()) {
</span><del>-        postTask(AddConsoleMessageTask(source, level, message.isolatedCopy()));
</del><ins>+        postTask(AddConsoleMessageTask::create(source, level, message));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -4887,7 +4887,7 @@
</span><span class="cx"> void Document::addMessage(MessageSource source, MessageLevel level, const String&amp; message, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr&lt;Inspector::ScriptCallStack&gt; callStack, JSC::ExecState* state, unsigned long requestIdentifier)
</span><span class="cx"> {
</span><span class="cx">     if (!isContextThread()) {
</span><del>-        postTask(AddConsoleMessageTask(source, level, message));
</del><ins>+        postTask(AddConsoleMessageTask::create(source, level, message));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -4900,32 +4900,51 @@
</span><span class="cx">     return topDocument().securityOrigin();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Document::postTask(Task task)
</del><ins>+struct PerformTaskContext {
+    WTF_MAKE_NONCOPYABLE(PerformTaskContext); WTF_MAKE_FAST_ALLOCATED;
+public:
+    PerformTaskContext(WeakPtr&lt;Document&gt; document, PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task)
+        : documentReference(document)
+        , task(task)
+    {
+    }
+
+    WeakPtr&lt;Document&gt; documentReference;
+    OwnPtr&lt;ScriptExecutionContext::Task&gt; task;
+};
+
+void Document::didReceiveTask(void* untypedContext)
</ins><span class="cx"> {
</span><del>-    Task* taskPtr = std::make_unique&lt;Task&gt;(std::move(task)).release();
-    WeakPtr&lt;Document&gt; documentReference(m_weakFactory.createWeakPtr());
</del><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    callOnMainThread([=] {
-        ASSERT(isMainThread());
-        std::unique_ptr&lt;Task&gt; task(taskPtr);
</del><ins>+    OwnPtr&lt;PerformTaskContext&gt; context = adoptPtr(static_cast&lt;PerformTaskContext*&gt;(untypedContext));
+    ASSERT(context);
</ins><span class="cx"> 
</span><del>-        Document* document = documentReference.get();
-        if (!document)
-            return;
</del><ins>+    Document* document = context-&gt;documentReference.get();
+    if (!document)
+        return;
</ins><span class="cx"> 
</span><del>-        Page* page = document-&gt;page();
-        if ((page &amp;&amp; page-&gt;defersLoading()) || !document-&gt;m_pendingTasks.isEmpty())
-            document-&gt;m_pendingTasks.append(std::move(*task.release()));
-        else
-            task-&gt;performTask(document);
-    });
</del><ins>+    Page* page = document-&gt;page();
+    if ((page &amp;&amp; page-&gt;defersLoading()) || !document-&gt;m_pendingTasks.isEmpty()) {
+        document-&gt;m_pendingTasks.append(context-&gt;task.release());
+        return;
+    }
+
+    context-&gt;task-&gt;performTask(document);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Document::postTask(PassOwnPtr&lt;Task&gt; task)
+{
+    callOnMainThread(didReceiveTask, new PerformTaskContext(m_weakFactory.createWeakPtr(), task));
+}
+
</ins><span class="cx"> void Document::pendingTasksTimerFired(Timer&lt;Document&gt;&amp;)
</span><span class="cx"> {
</span><del>-    Vector&lt;Task&gt; pendingTasks = std::move(m_pendingTasks);
-    for (auto&amp; task : pendingTasks)
-        task.performTask(this);
</del><ins>+    while (!m_pendingTasks.isEmpty()) {
+        OwnPtr&lt;Task&gt; task = m_pendingTasks[0].release();
+        m_pendingTasks.remove(0);
+        task-&gt;performTask(this);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Document::suspendScheduledTasks(ActiveDOMObject::ReasonForSuspension reason)
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/dom/Document.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -1007,7 +1007,7 @@
</span><span class="cx">     bool isDNSPrefetchEnabled() const { return m_isDNSPrefetchEnabled; }
</span><span class="cx">     void parseDNSPrefetchControlHeader(const String&amp;);
</span><span class="cx"> 
</span><del>-    virtual void postTask(Task) override; // Executes the task on context's thread asynchronously.
</del><ins>+    virtual void postTask(PassOwnPtr&lt;Task&gt;) override; // Executes the task on context's thread asynchronously.
</ins><span class="cx"> 
</span><span class="cx">     void suspendScriptedAnimationControllerCallbacks();
</span><span class="cx">     void resumeScriptedAnimationControllerCallbacks();
</span><span class="lines">@@ -1336,6 +1336,8 @@
</span><span class="cx"> 
</span><span class="cx">     void pendingTasksTimerFired(Timer&lt;Document&gt;&amp;);
</span><span class="cx"> 
</span><ins>+    static void didReceiveTask(void*);
+    
</ins><span class="cx">     template &lt;typename CharacterType&gt;
</span><span class="cx">     void displayBufferModifiedByEncodingInternal(CharacterType*, unsigned) const;
</span><span class="cx"> 
</span><span class="lines">@@ -1641,7 +1643,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     Timer&lt;Document&gt; m_pendingTasksTimer;
</span><del>-    Vector&lt;Task&gt; m_pendingTasks;
</del><ins>+    Vector&lt;OwnPtr&lt;Task&gt;&gt; m_pendingTasks;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(IOS_TEXT_AUTOSIZING)
</span><span class="cx"> public:
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptExecutionContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -55,6 +55,19 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class ProcessMessagesSoonTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;ProcessMessagesSoonTask&gt; create()
+    {
+        return adoptPtr(new ProcessMessagesSoonTask);
+    }
+
+    virtual void performTask(ScriptExecutionContext* context) override
+    {
+        context-&gt;dispatchMessagePortEvents();
+    }
+};
+
</ins><span class="cx"> class ScriptExecutionContext::PendingException {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(PendingException);
</span><span class="cx"> public:
</span><span class="lines">@@ -73,6 +86,11 @@
</span><span class="cx">     RefPtr&lt;ScriptCallStack&gt; m_callStack;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+void ScriptExecutionContext::AddConsoleMessageTask::performTask(ScriptExecutionContext* context)
+{
+    context-&gt;addConsoleMessage(m_source, m_level, m_message);
+}
+
</ins><span class="cx"> ScriptExecutionContext::ScriptExecutionContext()
</span><span class="cx">     : m_circularSequentialID(0)
</span><span class="cx">     , m_inDispatchErrorEvent(false)
</span><span class="lines">@@ -132,9 +150,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ScriptExecutionContext::processMessagePortMessagesSoon()
</span><span class="cx"> {
</span><del>-    postTask([] (ScriptExecutionContext* context) {
-        context-&gt;dispatchMessagePortEvents();
-    });
</del><ins>+    postTask(ProcessMessagesSoonTask::create());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScriptExecutionContext::dispatchMessagePortEvents()
</span><span class="lines">@@ -444,6 +460,10 @@
</span><span class="cx">     return Settings::defaultDOMTimerAlignmentInterval();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ScriptExecutionContext::Task::~Task()
+{
+}
+
</ins><span class="cx"> JSC::VM&amp; ScriptExecutionContext::vm()
</span><span class="cx"> {
</span><span class="cx">      if (isDocument())
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptExecutionContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptExecutionContext.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -115,35 +115,17 @@
</span><span class="cx">     void deref() { derefScriptExecutionContext(); }
</span><span class="cx"> 
</span><span class="cx">     class Task {
</span><ins>+        WTF_MAKE_NONCOPYABLE(Task);
</ins><span class="cx">         WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx">     public:
</span><del>-        enum CleanupTaskTag { CleanupTask };
-
-        template&lt;typename T, typename = typename std::enable_if&lt;!std::is_base_of&lt;Task, T&gt;::value &amp;&amp; std::is_convertible&lt;T, std::function&lt;void (ScriptExecutionContext*)&gt;&gt;::value&gt;::type&gt;
-        Task(T task)
-            : m_task(std::move(task))
-            , m_isCleanupTask(false)
-        {
-        }
-
-        template&lt;typename T, typename = typename std::enable_if&lt;std::is_convertible&lt;T, std::function&lt;void (ScriptExecutionContext*)&gt;&gt;::value&gt;::type&gt;
-        Task(CleanupTaskTag, T task)
-            : m_task(std::move(task))
-            , m_isCleanupTask(true)
-        {
-        }
-
-        Task(Task&amp;&amp;) = default;
-
-        void performTask(ScriptExecutionContext* context) { m_task(context); }
-        bool isCleanupTask() const { return m_isCleanupTask; }
-
-    protected:
-        std::function&lt;void (ScriptExecutionContext*)&gt; m_task;
-        bool m_isCleanupTask;
</del><ins>+        Task() { }
+        virtual ~Task();
+        virtual void performTask(ScriptExecutionContext*) = 0;
+        // Certain tasks get marked specially so that they aren't discarded, and are executed, when the context is shutting down its message queue.
+        virtual bool isCleanupTask() const { return false; }
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    virtual void postTask(Task) = 0; // Executes the task on context's thread asynchronously.
</del><ins>+    virtual void postTask(PassOwnPtr&lt;Task&gt;) = 0; // Executes the task on context's thread asynchronously.
</ins><span class="cx"> 
</span><span class="cx">     // Gets the next id in a circular sequence from 1 to 2^31-1.
</span><span class="cx">     int circularSequentialID();
</span><span class="lines">@@ -175,12 +157,21 @@
</span><span class="cx"> protected:
</span><span class="cx">     class AddConsoleMessageTask : public Task {
</span><span class="cx">     public:
</span><ins>+        static PassOwnPtr&lt;AddConsoleMessageTask&gt; create(MessageSource source, MessageLevel level, const String&amp; message)
+        {
+            return adoptPtr(new AddConsoleMessageTask(source, level, message));
+        }
+        virtual void performTask(ScriptExecutionContext*) override;
+    private:
</ins><span class="cx">         AddConsoleMessageTask(MessageSource source, MessageLevel level, const String&amp; message)
</span><del>-            : Task([=] (ScriptExecutionContext* context) {
-                context-&gt;addConsoleMessage(source, level, message);
-            })
</del><ins>+            : m_source(source)
+            , m_level(level)
+            , m_message(message.isolatedCopy())
</ins><span class="cx">         {
</span><span class="cx">         }
</span><ins>+        MessageSource m_source;
+        MessageLevel m_level;
+        String m_message;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ActiveDOMObject::ReasonForSuspension reasonForSuspendingActiveDOMObjects() const { return m_reasonForSuspendingActiveDOMObjects; }
</span></span></pre></div>
<a id="trunkSourceWebCoredomStringCallbackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/StringCallback.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/StringCallback.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/dom/StringCallback.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -36,12 +36,36 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+namespace {
+
+class DispatchCallbackTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;DispatchCallbackTask&gt; create(PassRefPtr&lt;StringCallback&gt; callback, const String&amp; data)
+    {
+        return adoptPtr(new DispatchCallbackTask(callback, data));
+    }
+
+    virtual void performTask(ScriptExecutionContext*) override
+    {
+        m_callback-&gt;handleEvent(m_data);
+    }
+
+private:
+    DispatchCallbackTask(PassRefPtr&lt;StringCallback&gt; callback, const String&amp; data)
+        : m_callback(callback)
+        , m_data(data)
+    {
+    }
+
+    RefPtr&lt;StringCallback&gt; m_callback;
+    const String m_data;
+};
+
+} // namespace
+
</ins><span class="cx"> void StringCallback::scheduleCallback(ScriptExecutionContext* context, const String&amp; data)
</span><span class="cx"> {
</span><del>-    RefPtr&lt;StringCallback&gt; protector(this);
-    context-&gt;postTask([=] (ScriptExecutionContext*) {
-        this-&gt;handleEvent(data);
-    });
</del><ins>+    context-&gt;postTask(DispatchCallbackTask::create(this, data));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderappcacheApplicationCacheGroupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -1100,6 +1100,41 @@
</span><span class="cx">     // The timer will delete itself once it fires.
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class CallCacheListenerTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;CallCacheListenerTask&gt; create(PassRefPtr&lt;DocumentLoader&gt; loader, ApplicationCacheHost::EventID eventID, int progressTotal, int progressDone)
+    {
+        return adoptPtr(new CallCacheListenerTask(loader, eventID, progressTotal, progressDone));
+    }
+
+    virtual void performTask(ScriptExecutionContext* context) override
+    {
+        
+        ASSERT_UNUSED(context, context-&gt;isDocument());
+        Frame* frame = m_documentLoader-&gt;frame();
+        if (!frame)
+            return;
+    
+        ASSERT(frame-&gt;loader().documentLoader() == m_documentLoader.get());
+
+        m_documentLoader-&gt;applicationCacheHost()-&gt;notifyDOMApplicationCache(m_eventID, m_progressTotal, m_progressDone);
+    }
+
+private:
+    CallCacheListenerTask(PassRefPtr&lt;DocumentLoader&gt; loader, ApplicationCacheHost::EventID eventID, int progressTotal, int progressDone)
+        : m_documentLoader(loader)
+        , m_eventID(eventID)
+        , m_progressTotal(progressTotal)
+        , m_progressDone(progressDone)
+    {
+    }
+
+    RefPtr&lt;DocumentLoader&gt; m_documentLoader;
+    ApplicationCacheHost::EventID m_eventID;
+    int m_progressTotal;
+    int m_progressDone;
+};
+
</ins><span class="cx"> void ApplicationCacheGroup::postListenerTask(ApplicationCacheHost::EventID eventID, int progressTotal, int progressDone, const HashSet&lt;DocumentLoader*&gt;&amp; loaderSet)
</span><span class="cx"> {
</span><span class="cx">     HashSet&lt;DocumentLoader*&gt;::const_iterator loaderSetEnd = loaderSet.end();
</span><span class="lines">@@ -1115,17 +1150,7 @@
</span><span class="cx">     
</span><span class="cx">     ASSERT(frame-&gt;loader().documentLoader() == loader);
</span><span class="cx"> 
</span><del>-    RefPtr&lt;DocumentLoader&gt; loaderProtector(loader);
-    frame-&gt;document()-&gt;postTask([=] (ScriptExecutionContext* context) {
-        ASSERT_UNUSED(context, context-&gt;isDocument());
-        Frame* frame = loaderProtector-&gt;frame();
-        if (!frame)
-            return;
-
-        ASSERT(frame-&gt;loader().documentLoader() == loaderProtector);
-
-        loaderProtector-&gt;applicationCacheHost()-&gt;notifyDOMApplicationCache(eventID, progressTotal, progressDone);
-    });
</del><ins>+    frame-&gt;document()-&gt;postTask(CallCacheListenerTask::create(loader, eventID, progressTotal, progressDone));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ApplicationCacheGroup::setUpdateStatus(UpdateStatus status)
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDefaultSharedWorkerRepositorycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -80,8 +80,8 @@
</span><span class="cx">     bool matches(const String&amp; name, PassRefPtr&lt;SecurityOrigin&gt; origin, const URL&amp; urlToMatch) const;
</span><span class="cx"> 
</span><span class="cx">     // WorkerLoaderProxy
</span><del>-    virtual void postTaskToLoader(ScriptExecutionContext::Task);
-    virtual bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task, const String&amp;);
</del><ins>+    virtual void postTaskToLoader(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;);
+    virtual bool postTaskForModeToWorkerGlobalScope(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;, const String&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // WorkerReportingProxy
</span><span class="cx">     virtual void postExceptionToWorkerObject(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL);
</span><span class="lines">@@ -140,7 +140,7 @@
</span><span class="cx">     return name == m_name;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SharedWorkerProxy::postTaskToLoader(ScriptExecutionContext::Task task)
</del><ins>+void SharedWorkerProxy::postTaskToLoader(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task)
</ins><span class="cx"> {
</span><span class="cx">     MutexLocker lock(m_workerDocumentsLock);
</span><span class="cx"> 
</span><span class="lines">@@ -153,15 +153,15 @@
</span><span class="cx">     // Just pick an arbitrary active document from the HashSet and pass load requests to it.
</span><span class="cx">     // FIXME: Do we need to deal with the case where the user closes the document mid-load, via a shadow document or some other solution?
</span><span class="cx">     Document* document = *(m_workerDocuments.begin());
</span><del>-    document-&gt;postTask(std::move(task));
</del><ins>+    document-&gt;postTask(task);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SharedWorkerProxy::postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task task, const String&amp; mode)
</del><ins>+bool SharedWorkerProxy::postTaskForModeToWorkerGlobalScope(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task, const String&amp; mode)
</ins><span class="cx"> {
</span><span class="cx">     if (isClosing())
</span><span class="cx">         return false;
</span><span class="cx">     ASSERT(m_thread);
</span><del>-    m_thread-&gt;runLoop().postTaskForMode(std::move(task), mode);
</del><ins>+    m_thread-&gt;runLoop().postTaskForMode(task, mode);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -254,19 +254,30 @@
</span><span class="cx"> 
</span><span class="cx"> class SharedWorkerConnectTask : public ScriptExecutionContext::Task {
</span><span class="cx"> public:
</span><del>-    SharedWorkerConnectTask(MessagePortChannel* channel)
-        : ScriptExecutionContext::Task([=] (ScriptExecutionContext* context) {
-            RefPtr&lt;MessagePort&gt; port = MessagePort::create(*context);
-            port-&gt;entangle(std::unique_ptr&lt;MessagePortChannel&gt;(channel));
-            ASSERT_WITH_SECURITY_IMPLICATION(context-&gt;isWorkerGlobalScope());
-            WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
-            // Since close() stops the thread event loop, this should not ever get called while closing.
-            ASSERT(!workerGlobalScope-&gt;isClosing());
-            ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope-&gt;isSharedWorkerGlobalScope());
-            workerGlobalScope-&gt;dispatchEvent(createConnectEvent(port));
-        })
</del><ins>+    static PassOwnPtr&lt;SharedWorkerConnectTask&gt; create(std::unique_ptr&lt;MessagePortChannel&gt; channel)
</ins><span class="cx">     {
</span><ins>+        return adoptPtr(new SharedWorkerConnectTask(std::move(channel)));
</ins><span class="cx">     }
</span><ins>+
+private:
+    SharedWorkerConnectTask(std::unique_ptr&lt;MessagePortChannel&gt; channel)
+        : m_channel(std::move(channel))
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext* scriptContext)
+    {
+        RefPtr&lt;MessagePort&gt; port = MessagePort::create(*scriptContext);
+        port-&gt;entangle(std::move(m_channel));
+        ASSERT_WITH_SECURITY_IMPLICATION(scriptContext-&gt;isWorkerGlobalScope());
+        WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(scriptContext);
+        // Since close() stops the thread event loop, this should not ever get called while closing.
+        ASSERT(!workerGlobalScope-&gt;isClosing());
+        ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope-&gt;isSharedWorkerGlobalScope());
+        workerGlobalScope-&gt;dispatchEvent(createConnectEvent(port));
+    }
+
+    std::unique_ptr&lt;MessagePortChannel&gt; m_channel;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // Loads the script on behalf of a worker.
</span><span class="lines">@@ -356,8 +367,7 @@
</span><span class="cx">         proxy.setThread(thread);
</span><span class="cx">         thread-&gt;start();
</span><span class="cx">     }
</span><del>-
-    proxy.thread()-&gt;runLoop().postTask(SharedWorkerConnectTask(port.release()));
</del><ins>+    proxy.thread()-&gt;runLoop().postTask(SharedWorkerConnectTask::create(std::move(port)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool DefaultSharedWorkerRepository::hasSharedWorkers(Document* document)
</span><span class="lines">@@ -405,7 +415,7 @@
</span><span class="cx">     }
</span><span class="cx">     // If proxy is already running, just connect to it - otherwise, kick off a loader to load the script.
</span><span class="cx">     if (proxy-&gt;thread())
</span><del>-        proxy-&gt;thread()-&gt;runLoop().postTask(SharedWorkerConnectTask(port.release()));
</del><ins>+        proxy-&gt;thread()-&gt;runLoop().postTask(SharedWorkerConnectTask::create(std::move(port)));
</ins><span class="cx">     else {
</span><span class="cx">         RefPtr&lt;SharedWorkerScriptLoader&gt; loader = adoptRef(new SharedWorkerScriptLoader(worker, std::move(port), proxy.release()));
</span><span class="cx">         loader-&gt;load(url);
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerEventQueuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerEventQueue.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerEventQueue.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerEventQueue.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -46,28 +46,30 @@
</span><span class="cx">     close();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-class WorkerEventQueue::EventDispatcher
-{
</del><ins>+class WorkerEventQueue::EventDispatcherTask final : public ScriptExecutionContext::Task {
</ins><span class="cx"> public:
</span><del>-    EventDispatcher(PassRefPtr&lt;Event&gt; event, WorkerEventQueue&amp; eventQueue)
-        : m_event(event)
-        , m_eventQueue(eventQueue)
-        , m_isCancelled(false)
</del><ins>+    static PassOwnPtr&lt;EventDispatcherTask&gt; create(PassRefPtr&lt;Event&gt; event, WorkerEventQueue&amp; eventQueue)
</ins><span class="cx">     {
</span><ins>+        return adoptPtr(new EventDispatcherTask(event, eventQueue));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ~EventDispatcher()
</del><ins>+    virtual ~EventDispatcherTask()
</ins><span class="cx">     {
</span><span class="cx">         if (m_event)
</span><del>-            m_eventQueue.m_eventDispatcherMap.remove(m_event.get());
</del><ins>+            m_eventQueue.m_eventTaskMap.remove(m_event.get());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void dispatch()
</del><ins>+    void dispatchEvent(ScriptExecutionContext*, PassRefPtr&lt;Event&gt; event)
</ins><span class="cx">     {
</span><ins>+        event-&gt;target()-&gt;dispatchEvent(event);
+    }
+
+    virtual void performTask(ScriptExecutionContext* context) override
+    {
</ins><span class="cx">         if (m_isCancelled)
</span><span class="cx">             return;
</span><del>-        m_eventQueue.m_eventDispatcherMap.remove(m_event.get());
-        m_event-&gt;target()-&gt;dispatchEvent(m_event);
</del><ins>+        m_eventQueue.m_eventTaskMap.remove(m_event.get());
+        dispatchEvent(context, m_event);
</ins><span class="cx">         m_event.clear();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -78,29 +80,32 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    EventDispatcherTask(PassRefPtr&lt;Event&gt; event, WorkerEventQueue&amp; eventQueue)
+        : m_event(event)
+        , m_eventQueue(eventQueue)
+        , m_isCancelled(false)
+    {
+    }
+
</ins><span class="cx">     RefPtr&lt;Event&gt; m_event;
</span><span class="cx">     WorkerEventQueue&amp; m_eventQueue;
</span><span class="cx">     bool m_isCancelled;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-bool WorkerEventQueue::enqueueEvent(PassRefPtr&lt;Event&gt; event)
</del><ins>+bool WorkerEventQueue::enqueueEvent(PassRefPtr&lt;Event&gt; prpEvent)
</ins><span class="cx"> {
</span><span class="cx">     if (m_isClosed)
</span><span class="cx">         return false;
</span><del>-
-    EventDispatcher* eventDispatcherPtr = new EventDispatcher(event.get(), *this);
-    m_eventDispatcherMap.add(event, eventDispatcherPtr);
-    m_scriptExecutionContext.postTask([=] (ScriptExecutionContext*) {
-        std::unique_ptr&lt;EventDispatcher&gt; eventDispatcher(eventDispatcherPtr);
-        eventDispatcher-&gt;dispatch();
-    });
-
</del><ins>+    RefPtr&lt;Event&gt; event = prpEvent;
+    OwnPtr&lt;EventDispatcherTask&gt; task = EventDispatcherTask::create(event, *this);
+    m_eventTaskMap.add(event.release(), task.get());
+    m_scriptExecutionContext.postTask(task.release());
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool WorkerEventQueue::cancelEvent(Event&amp; event)
</span><span class="cx"> {
</span><del>-    EventDispatcher* task = m_eventDispatcherMap.take(&amp;event);
</del><ins>+    EventDispatcherTask* task = m_eventTaskMap.take(&amp;event);
</ins><span class="cx">     if (!task)
</span><span class="cx">         return false;
</span><span class="cx">     task-&gt;cancel();
</span><span class="lines">@@ -110,9 +115,11 @@
</span><span class="cx"> void WorkerEventQueue::close()
</span><span class="cx"> {
</span><span class="cx">     m_isClosed = true;
</span><del>-    for (auto&amp; dispatcher : m_eventDispatcherMap.values())
-        dispatcher-&gt;cancel();
-    m_eventDispatcherMap.clear();
</del><ins>+    for (EventTaskMap::iterator it = m_eventTaskMap.begin(); it != m_eventTaskMap.end(); ++it) {
+        EventDispatcherTask* task = it-&gt;value;
+        task-&gt;cancel();
+    }
+    m_eventTaskMap.clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerEventQueueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerEventQueue.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerEventQueue.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerEventQueue.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -48,9 +48,9 @@
</span><span class="cx">     ScriptExecutionContext&amp; m_scriptExecutionContext;
</span><span class="cx">     bool m_isClosed;
</span><span class="cx"> 
</span><del>-    class EventDispatcher;
-    typedef HashMap&lt;RefPtr&lt;Event&gt;, EventDispatcher*&gt; EventDispatcherMap;
-    EventDispatcherMap m_eventDispatcherMap;
</del><ins>+    class EventDispatcherTask;
+    typedef HashMap&lt;RefPtr&lt;Event&gt;, EventDispatcherTask*&gt; EventTaskMap;
+    EventTaskMap m_eventTaskMap;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -64,6 +64,22 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class CloseWorkerGlobalScopeTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;CloseWorkerGlobalScopeTask&gt; create()
+    {
+        return adoptPtr(new CloseWorkerGlobalScopeTask);
+    }
+
+    virtual void performTask(ScriptExecutionContext *context)
+    {
+        // Notify parent that this context is closed. Parent is responsible for calling WorkerThread::stop().
+        toWorkerGlobalScope(context)-&gt;thread().workerReportingProxy().workerGlobalScopeClosed();
+    }
+
+    virtual bool isCleanupTask() const { return true; }
+};
+
</ins><span class="cx"> WorkerGlobalScope::WorkerGlobalScope(const URL&amp; url, const String&amp; userAgent, std::unique_ptr&lt;GroupSettings&gt; settings, WorkerThread&amp; thread, PassRefPtr&lt;SecurityOrigin&gt; topOrigin)
</span><span class="cx">     : m_url(url)
</span><span class="cx">     , m_userAgent(userAgent)
</span><span class="lines">@@ -133,12 +149,7 @@
</span><span class="cx">     // After m_closing is set, all the tasks in the queue continue to be fetched but only
</span><span class="cx">     // tasks with isCleanupTask()==true will be executed.
</span><span class="cx">     m_closing = true;
</span><del>-    postTask({ ScriptExecutionContext::Task::CleanupTask, [] (ScriptExecutionContext* context) {
-        ASSERT_WITH_SECURITY_IMPLICATION(context-&gt;isWorkerGlobalScope());
-        WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
-        // Notify parent that this context is closed. Parent is responsible for calling WorkerThread::stop().
-        workerGlobalScope-&gt;thread().workerReportingProxy().workerGlobalScopeClosed();
-    } });
</del><ins>+    postTask(CloseWorkerGlobalScopeTask::create());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WorkerNavigator* WorkerGlobalScope::navigator() const
</span><span class="lines">@@ -148,9 +159,9 @@
</span><span class="cx">     return m_navigator.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerGlobalScope::postTask(Task task)
</del><ins>+void WorkerGlobalScope::postTask(PassOwnPtr&lt;Task&gt; task)
</ins><span class="cx"> {
</span><del>-    thread().runLoop().postTask(std::move(task));
</del><ins>+    thread().runLoop().postTask(task);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int WorkerGlobalScope::setTimeout(PassOwnPtr&lt;ScheduledAction&gt; action, int timeout)
</span><span class="lines">@@ -223,7 +234,7 @@
</span><span class="cx"> void WorkerGlobalScope::addConsoleMessage(MessageSource source, MessageLevel level, const String&amp; message, unsigned long requestIdentifier)
</span><span class="cx"> {
</span><span class="cx">     if (!isContextThread()) {
</span><del>-        postTask(AddConsoleMessageTask(source, level, message));
</del><ins>+        postTask(AddConsoleMessageTask::create(source, level, message));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -234,7 +245,7 @@
</span><span class="cx"> void WorkerGlobalScope::addMessage(MessageSource source, MessageLevel level, const String&amp; message, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr&lt;ScriptCallStack&gt; callStack, JSC::ExecState* state, unsigned long requestIdentifier)
</span><span class="cx"> {
</span><span class="cx">     if (!isContextThread()) {
</span><del>-        postTask(AddConsoleMessageTask(source, level, message));
</del><ins>+        postTask(AddConsoleMessageTask::create(source, level, message));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx"> 
</span><span class="cx">         using ScriptExecutionContext::hasPendingActivity;
</span><span class="cx"> 
</span><del>-        virtual void postTask(Task) override; // Executes the task on context's thread asynchronously.
</del><ins>+        virtual void postTask(PassOwnPtr&lt;Task&gt;) override; // Executes the task on context's thread asynchronously.
</ins><span class="cx"> 
</span><span class="cx">         // WorkerGlobalScope
</span><span class="cx">         WorkerGlobalScope* self() { return this; }
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerLoaderProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerLoaderProxy.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerLoaderProxy.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerLoaderProxy.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -47,12 +47,12 @@
</span><span class="cx">         virtual ~WorkerLoaderProxy() { }
</span><span class="cx"> 
</span><span class="cx">         // Posts a task to the thread which runs the loading code (normally, the main thread).
</span><del>-        virtual void postTaskToLoader(ScriptExecutionContext::Task) = 0;
</del><ins>+        virtual void postTaskToLoader(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;) = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Posts callbacks from loading code to the WorkerGlobalScope. The 'mode' is used to differentiate
</span><span class="cx">         // specific synchronous loading requests so they can be 'nested', per spec.
</span><span class="cx">         // Returns true if the task was posted successfully.
</span><del>-        virtual bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task, const String&amp; mode) = 0;
</del><ins>+        virtual bool postTaskForModeToWorkerGlobalScope(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;, const String&amp; mode) = 0;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerMessagingProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -53,6 +53,219 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class MessageWorkerGlobalScopeTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;MessageWorkerGlobalScopeTask&gt; create(PassRefPtr&lt;SerializedScriptValue&gt; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels)
+    {
+        return adoptPtr(new MessageWorkerGlobalScopeTask(message, std::move(channels)));
+    }
+
+private:
+    MessageWorkerGlobalScopeTask(PassRefPtr&lt;SerializedScriptValue&gt; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels)
+        : m_message(message)
+        , m_channels(std::move(channels))
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext* scriptContext)
+    {
+        ASSERT_WITH_SECURITY_IMPLICATION(scriptContext-&gt;isWorkerGlobalScope());
+        DedicatedWorkerGlobalScope* context = static_cast&lt;DedicatedWorkerGlobalScope*&gt;(scriptContext);
+        std::unique_ptr&lt;MessagePortArray&gt; ports = MessagePort::entanglePorts(*scriptContext, std::move(m_channels));
+        context-&gt;dispatchEvent(MessageEvent::create(std::move(ports), m_message));
+        context-&gt;thread().workerObjectProxy().confirmMessageFromWorkerObject(context-&gt;hasPendingActivity());
+    }
+
+private:
+    RefPtr&lt;SerializedScriptValue&gt; m_message;
+    std::unique_ptr&lt;MessagePortChannelArray&gt; m_channels;
+};
+
+class MessageWorkerTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;MessageWorkerTask&gt; create(PassRefPtr&lt;SerializedScriptValue&gt; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels, WorkerMessagingProxy* messagingProxy)
+    {
+        return adoptPtr(new MessageWorkerTask(message, std::move(channels), messagingProxy));
+    }
+
+private:
+    MessageWorkerTask(PassRefPtr&lt;SerializedScriptValue&gt; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels, WorkerMessagingProxy* messagingProxy)
+        : m_message(message)
+        , m_channels(std::move(channels))
+        , m_messagingProxy(messagingProxy)
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext* scriptContext)
+    {
+        Worker* workerObject = m_messagingProxy-&gt;workerObject();
+        if (!workerObject || m_messagingProxy-&gt;askedToTerminate())
+            return;
+
+        std::unique_ptr&lt;MessagePortArray&gt; ports = MessagePort::entanglePorts(*scriptContext, std::move(m_channels));
+        workerObject-&gt;dispatchEvent(MessageEvent::create(std::move(ports), m_message));
+    }
+
+private:
+    RefPtr&lt;SerializedScriptValue&gt; m_message;
+    std::unique_ptr&lt;MessagePortChannelArray&gt; m_channels;
+    WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerExceptionTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;WorkerExceptionTask&gt; create(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL, WorkerMessagingProxy* messagingProxy)
+    {
+        return adoptPtr(new WorkerExceptionTask(errorMessage, lineNumber, columnNumber, sourceURL, messagingProxy));
+    }
+
+private:
+    WorkerExceptionTask(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL, WorkerMessagingProxy* messagingProxy)
+        : m_errorMessage(errorMessage.isolatedCopy())
+        , m_lineNumber(lineNumber)
+        , m_columnNumber(columnNumber)
+        , m_sourceURL(sourceURL.isolatedCopy())
+        , m_messagingProxy(messagingProxy)
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext* context)
+    {
+        Worker* workerObject = m_messagingProxy-&gt;workerObject();
+        if (!workerObject)
+            return;
+
+        // We don't bother checking the askedToTerminate() flag here, because exceptions should *always* be reported even if the thread is terminated.
+        // This is intentionally different than the behavior in MessageWorkerTask, because terminated workers no longer deliver messages (section 4.6 of the WebWorker spec), but they do report exceptions.
+
+        bool errorHandled = !workerObject-&gt;dispatchEvent(ErrorEvent::create(m_errorMessage, m_sourceURL, m_lineNumber, m_columnNumber));
+        if (!errorHandled)
+            context-&gt;reportException(m_errorMessage, m_lineNumber, m_columnNumber, m_sourceURL, 0);
+    }
+
+    String m_errorMessage;
+    int m_lineNumber;
+    int m_columnNumber;
+    String m_sourceURL;
+    WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerGlobalScopeDestroyedTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;WorkerGlobalScopeDestroyedTask&gt; create(WorkerMessagingProxy* messagingProxy)
+    {
+        return adoptPtr(new WorkerGlobalScopeDestroyedTask(messagingProxy));
+    }
+
+private:
+    WorkerGlobalScopeDestroyedTask(WorkerMessagingProxy* messagingProxy)
+        : m_messagingProxy(messagingProxy)
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        m_messagingProxy-&gt;workerGlobalScopeDestroyedInternal();
+    }
+
+    WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerTerminateTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;WorkerTerminateTask&gt; create(WorkerMessagingProxy* messagingProxy)
+    {
+        return adoptPtr(new WorkerTerminateTask(messagingProxy));
+    }
+
+private:
+    WorkerTerminateTask(WorkerMessagingProxy* messagingProxy)
+        : m_messagingProxy(messagingProxy)
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        m_messagingProxy-&gt;terminateWorkerGlobalScope();
+    }
+
+    WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerThreadActivityReportTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;WorkerThreadActivityReportTask&gt; create(WorkerMessagingProxy* messagingProxy, bool confirmingMessage, bool hasPendingActivity)
+    {
+        return adoptPtr(new WorkerThreadActivityReportTask(messagingProxy, confirmingMessage, hasPendingActivity));
+    }
+
+private:
+    WorkerThreadActivityReportTask(WorkerMessagingProxy* messagingProxy, bool confirmingMessage, bool hasPendingActivity)
+        : m_messagingProxy(messagingProxy)
+        , m_confirmingMessage(confirmingMessage)
+        , m_hasPendingActivity(hasPendingActivity)
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+        m_messagingProxy-&gt;reportPendingActivityInternal(m_confirmingMessage, m_hasPendingActivity);
+    }
+
+    WorkerMessagingProxy* m_messagingProxy;
+    bool m_confirmingMessage;
+    bool m_hasPendingActivity;
+};
+
+class PostMessageToPageInspectorTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;PostMessageToPageInspectorTask&gt; create(WorkerMessagingProxy* messagingProxy, const String&amp; message)
+    {
+        return adoptPtr(new PostMessageToPageInspectorTask(messagingProxy, message));
+    }
+
+private:
+    PostMessageToPageInspectorTask(WorkerMessagingProxy* messagingProxy, const String&amp; message)
+        : m_messagingProxy(messagingProxy)
+        , m_message(message.isolatedCopy())
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext*)
+    {
+#if ENABLE(INSPECTOR)
+        if (WorkerGlobalScopeProxy::PageInspector* pageInspector = m_messagingProxy-&gt;m_pageInspector)
+            pageInspector-&gt;dispatchMessageFromWorker(m_message);
+#endif
+    }
+
+    WorkerMessagingProxy* m_messagingProxy;
+    String m_message;
+};
+
+class NotifyNetworkStateChangeTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;NotifyNetworkStateChangeTask&gt; create(bool isOnLine)
+    {
+        return adoptPtr(new NotifyNetworkStateChangeTask(isOnLine));
+    }
+
+private:
+    NotifyNetworkStateChangeTask(bool isOnLine)
+        : m_isOnLine(isOnLine)
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext *context)
+    {
+        AtomicString eventName = m_isOnLine ? eventNames().onlineEvent : eventNames().offlineEvent;
+        toWorkerGlobalScope(context)-&gt;dispatchEvent(Event::create(eventName, false, false));
+    }
+
+    bool m_isOnLine;
+};
+
+
</ins><span class="cx"> WorkerGlobalScopeProxy* WorkerGlobalScopeProxy::create(Worker* worker)
</span><span class="cx"> {
</span><span class="cx">     return new WorkerMessagingProxy(worker);
</span><span class="lines">@@ -97,15 +310,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::postMessageToWorkerObject(PassRefPtr&lt;SerializedScriptValue&gt; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels)
</span><span class="cx"> {
</span><del>-    MessagePortChannelArray* channelsPtr = channels.release();
-    m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext* context) {
-        Worker* workerObject = this-&gt;workerObject();
-        if (!workerObject || this-&gt;askedToTerminate())
-            return;
-
-        std::unique_ptr&lt;MessagePortArray&gt; ports = MessagePort::entanglePorts(*context, std::unique_ptr&lt;MessagePortChannelArray&gt;(channelsPtr));
-        workerObject-&gt;dispatchEvent(MessageEvent::create(std::move(ports), message));
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(MessageWorkerTask::create(message, std::move(channels), this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::postMessageToWorkerGlobalScope(PassRefPtr&lt;SerializedScriptValue&gt; message, std::unique_ptr&lt;MessagePortChannelArray&gt; channels)
</span><span class="lines">@@ -113,55 +318,33 @@
</span><span class="cx">     if (m_askedToTerminate)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    MessagePortChannelArray* channelsPtr = channels.release();
-    ScriptExecutionContext::Task task([=] (ScriptExecutionContext* scriptContext) {
-        ASSERT_WITH_SECURITY_IMPLICATION(scriptContext-&gt;isWorkerGlobalScope());
-        DedicatedWorkerGlobalScope* context = static_cast&lt;DedicatedWorkerGlobalScope*&gt;(scriptContext);
-        std::unique_ptr&lt;MessagePortArray&gt; ports = MessagePort::entanglePorts(*scriptContext, std::unique_ptr&lt;MessagePortChannelArray&gt;(channelsPtr));
-        context-&gt;dispatchEvent(MessageEvent::create(std::move(ports), message));
-        context-&gt;thread().workerObjectProxy().confirmMessageFromWorkerObject(context-&gt;hasPendingActivity());
-    });
-
</del><span class="cx">     if (m_workerThread) {
</span><span class="cx">         ++m_unconfirmedMessageCount;
</span><del>-        m_workerThread-&gt;runLoop().postTask(std::move(task));
</del><ins>+        m_workerThread-&gt;runLoop().postTask(MessageWorkerGlobalScopeTask::create(message, std::move(channels)));
</ins><span class="cx">     } else
</span><del>-        m_queuedEarlyTasks.append(std::make_unique&lt;ScriptExecutionContext::Task&gt;(std::move(task)));
</del><ins>+        m_queuedEarlyTasks.append(MessageWorkerGlobalScopeTask::create(message, std::move(channels)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WorkerMessagingProxy::postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task task, const String&amp; mode)
</del><ins>+bool WorkerMessagingProxy::postTaskForModeToWorkerGlobalScope(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task, const String&amp; mode)
</ins><span class="cx"> {
</span><span class="cx">     if (m_askedToTerminate)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(m_workerThread);
</span><del>-    m_workerThread-&gt;runLoop().postTaskForMode(std::move(task), mode);
</del><ins>+    m_workerThread-&gt;runLoop().postTaskForMode(task, mode);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerMessagingProxy::postTaskToLoader(ScriptExecutionContext::Task task)
</del><ins>+void WorkerMessagingProxy::postTaskToLoader(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task)
</ins><span class="cx"> {
</span><span class="cx">     // FIXME: In case of nested workers, this should go directly to the root Document context.
</span><span class="cx">     ASSERT(m_scriptExecutionContext-&gt;isDocument());
</span><del>-    m_scriptExecutionContext-&gt;postTask(std::move(task));
</del><ins>+    m_scriptExecutionContext-&gt;postTask(task);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::postExceptionToWorkerObject(const String&amp; errorMessage, int lineNumber, int columnNumber, const String&amp; sourceURL)
</span><span class="cx"> {
</span><del>-    String errorMessageCopy = errorMessage.isolatedCopy();
-    String sourceURLCopy = sourceURL.isolatedCopy();
-    m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext* context) {
-        Worker* workerObject = this-&gt;workerObject();
-        if (!workerObject)
-            return;
-
-        // We don't bother checking the askedToTerminate() flag here, because exceptions should *always* be reported even if the thread is terminated.
-        // This is intentionally different than the behavior in MessageWorkerTask, because terminated workers no longer deliver messages (section 4.6 of the WebWorker spec), but they do report exceptions.
-
-        bool errorHandled = !workerObject-&gt;dispatchEvent(ErrorEvent::create(errorMessageCopy, sourceURLCopy, lineNumber, columnNumber));
-        if (!errorHandled)
-            context-&gt;reportException(errorMessageCopy, lineNumber, columnNumber, sourceURLCopy, 0);
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(WorkerExceptionTask::create(errorMessage, lineNumber, columnNumber, sourceURL, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void postConsoleMessageTask(ScriptExecutionContext* context, WorkerMessagingProxy* messagingProxy, MessageSource source, MessageLevel level, const String&amp; message, unsigned lineNumber, unsigned columnNumber, const String&amp; sourceURL)
</span><span class="lines">@@ -184,13 +367,14 @@
</span><span class="cx">         // Worker.terminate() could be called from JS before the thread was created.
</span><span class="cx">         m_workerThread-&gt;stop();
</span><span class="cx">     } else {
</span><ins>+        unsigned taskCount = m_queuedEarlyTasks.size();
</ins><span class="cx">         ASSERT(!m_unconfirmedMessageCount);
</span><del>-        m_unconfirmedMessageCount = m_queuedEarlyTasks.size();
</del><ins>+        m_unconfirmedMessageCount = taskCount;
</ins><span class="cx">         m_workerThreadHadPendingActivity = true; // Worker initialization means a pending activity.
</span><span class="cx"> 
</span><del>-        auto queuedEarlyTasks = std::move(m_queuedEarlyTasks);
-        for (auto&amp; task : queuedEarlyTasks)
-            m_workerThread-&gt;runLoop().postTask(std::move(*task));
</del><ins>+        for (unsigned i = 0; i &lt; taskCount; ++i)
+            m_workerThread-&gt;runLoop().postTask(m_queuedEarlyTasks[i].release());
+        m_queuedEarlyTasks.clear();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -208,10 +392,7 @@
</span><span class="cx">     if (!m_workerThread)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_workerThread-&gt;runLoop().postTask([=] (ScriptExecutionContext* context) {
-        WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
-        workerGlobalScope-&gt;dispatchEvent(Event::create(isOnline ? eventNames().onlineEvent : eventNames().offlineEvent, false, false));
-    });
</del><ins>+    m_workerThread-&gt;runLoop().postTask(NotifyNetworkStateChangeTask::create(isOnline));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::workerObjectDestroyedInternal(ScriptExecutionContext*, WorkerMessagingProxy* proxy)
</span><span class="lines">@@ -267,18 +448,14 @@
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::workerGlobalScopeDestroyed()
</span><span class="cx"> {
</span><del>-    m_scriptExecutionContext-&gt;postTask([this] (ScriptExecutionContext*) {
-        workerGlobalScopeDestroyedInternal();
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(WorkerGlobalScopeDestroyedTask::create(this));
</ins><span class="cx">     // Will execute workerGlobalScopeDestroyedInternal() on context's thread.
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::workerGlobalScopeClosed()
</span><span class="cx"> {
</span><span class="cx">     // Executes terminateWorkerGlobalScope() on parent context's thread.
</span><del>-    m_scriptExecutionContext-&gt;postTask([this] (ScriptExecutionContext*) {
-        terminateWorkerGlobalScope();
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(WorkerTerminateTask::create(this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::workerGlobalScopeDestroyedInternal()
</span><span class="lines">@@ -309,26 +486,19 @@
</span><span class="cx"> #if ENABLE(INSPECTOR)
</span><span class="cx"> void WorkerMessagingProxy::postMessageToPageInspector(const String&amp; message)
</span><span class="cx"> {
</span><del>-    String messageCopy = message.isolatedCopy();
-    m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext*) {
-        this-&gt;m_pageInspector-&gt;dispatchMessageFromWorker(messageCopy);
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(PostMessageToPageInspectorTask::create(this, message));
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::confirmMessageFromWorkerObject(bool hasPendingActivity)
</span><span class="cx"> {
</span><del>-    m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext*) {
-        this-&gt;reportPendingActivityInternal(true, hasPendingActivity);
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(WorkerThreadActivityReportTask::create(this, true, hasPendingActivity));
</ins><span class="cx">     // Will execute reportPendingActivityInternal() on context's thread.
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerMessagingProxy::reportPendingActivity(bool hasPendingActivity)
</span><span class="cx"> {
</span><del>-    m_scriptExecutionContext-&gt;postTask([=] (ScriptExecutionContext*) {
-        this-&gt;reportPendingActivityInternal(false, hasPendingActivity);
-    });
</del><ins>+    m_scriptExecutionContext-&gt;postTask(WorkerThreadActivityReportTask::create(this, false, hasPendingActivity));
</ins><span class="cx">     // Will execute reportPendingActivityInternal() on context's thread.
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerMessagingProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerMessagingProxy.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerMessagingProxy.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerMessagingProxy.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -80,8 +80,8 @@
</span><span class="cx">         // Implementation of WorkerLoaderProxy.
</span><span class="cx">         // These methods are called on different threads to schedule loading
</span><span class="cx">         // requests and to send callbacks back to WorkerGlobalScope.
</span><del>-        virtual void postTaskToLoader(ScriptExecutionContext::Task) override;
-        virtual bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task, const String&amp; mode) override;
</del><ins>+        virtual void postTaskToLoader(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;) override;
+        virtual bool postTaskForModeToWorkerGlobalScope(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;, const String&amp; mode) override;
</ins><span class="cx"> 
</span><span class="cx">         void workerThreadCreated(PassRefPtr&lt;DedicatedWorkerThread&gt;);
</span><span class="cx"> 
</span><span class="lines">@@ -113,7 +113,7 @@
</span><span class="cx"> 
</span><span class="cx">         bool m_askedToTerminate;
</span><span class="cx"> 
</span><del>-        Vector&lt;std::unique_ptr&lt;ScriptExecutionContext::Task&gt;&gt; m_queuedEarlyTasks; // Tasks are queued here until there's a thread object created.
</del><ins>+        Vector&lt;OwnPtr&lt;ScriptExecutionContext::Task&gt;&gt; m_queuedEarlyTasks; // Tasks are queued here until there's a thread object created.
</ins><span class="cx"> #if ENABLE(INSPECTOR)
</span><span class="cx">         WorkerGlobalScopeProxy::PageInspector* m_pageInspector;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerRunLoopcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerRunLoop.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerRunLoop.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerRunLoop.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -192,34 +192,34 @@
</span><span class="cx">     m_messageQueue.kill();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerRunLoop::postTask(ScriptExecutionContext::Task task)
</del><ins>+void WorkerRunLoop::postTask(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task)
</ins><span class="cx"> {
</span><del>-    postTaskForMode(std::move(task), defaultMode());
</del><ins>+    postTaskForMode(task, defaultMode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerRunLoop::postTaskAndTerminate(ScriptExecutionContext::Task task)
</del><ins>+void WorkerRunLoop::postTaskAndTerminate(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task)
</ins><span class="cx"> {
</span><del>-    m_messageQueue.appendAndKill(Task::create(std::move(task), defaultMode().isolatedCopy()));
</del><ins>+    m_messageQueue.appendAndKill(Task::create(task, defaultMode().isolatedCopy()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerRunLoop::postTaskForMode(ScriptExecutionContext::Task task, const String&amp; mode)
</del><ins>+void WorkerRunLoop::postTaskForMode(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task, const String&amp; mode)
</ins><span class="cx"> {
</span><del>-    m_messageQueue.append(Task::create(std::move(task), mode.isolatedCopy()));
</del><ins>+    m_messageQueue.append(Task::create(task, mode.isolatedCopy()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;WorkerRunLoop::Task&gt; WorkerRunLoop::Task::create(ScriptExecutionContext::Task task, const String&amp; mode)
</del><ins>+std::unique_ptr&lt;WorkerRunLoop::Task&gt; WorkerRunLoop::Task::create(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task, const String&amp; mode)
</ins><span class="cx"> {
</span><del>-    return std::unique_ptr&lt;Task&gt;(new Task(std::move(task), mode));
</del><ins>+    return std::unique_ptr&lt;Task&gt;(new Task(task, mode));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerRunLoop::Task::performTask(const WorkerRunLoop&amp; runLoop, ScriptExecutionContext* context)
</span><span class="cx"> {
</span><del>-    if ((!toWorkerGlobalScope(context)-&gt;isClosing() &amp;&amp; !runLoop.terminated()) || m_task.isCleanupTask())
-        m_task.performTask(context);
</del><ins>+    if ((!toWorkerGlobalScope(context)-&gt;isClosing() &amp;&amp; !runLoop.terminated()) || m_task-&gt;isCleanupTask())
+        m_task-&gt;performTask(context);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-WorkerRunLoop::Task::Task(ScriptExecutionContext::Task task, const String&amp; mode)
-    : m_task(std::move(task))
</del><ins>+WorkerRunLoop::Task::Task(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task, const String&amp; mode)
+    : m_task(task)
</ins><span class="cx">     , m_mode(mode.isolatedCopy())
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerRunLooph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerRunLoop.h (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerRunLoop.h        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerRunLoop.h        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -58,9 +58,9 @@
</span><span class="cx">         void terminate();
</span><span class="cx">         bool terminated() const { return m_messageQueue.killed(); }
</span><span class="cx"> 
</span><del>-        void postTask(ScriptExecutionContext::Task);
-        void postTaskAndTerminate(ScriptExecutionContext::Task);
-        void postTaskForMode(ScriptExecutionContext::Task, const String&amp; mode);
</del><ins>+        void postTask(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;);
+        void postTaskAndTerminate(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;);
+        void postTaskForMode(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;, const String&amp; mode);
</ins><span class="cx"> 
</span><span class="cx">         unsigned long createUniqueId() { return ++m_uniqueId; }
</span><span class="cx"> 
</span><span class="lines">@@ -69,15 +69,15 @@
</span><span class="cx">         class Task {
</span><span class="cx">             WTF_MAKE_NONCOPYABLE(Task); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx">         public:
</span><del>-            static std::unique_ptr&lt;Task&gt; create(ScriptExecutionContext::Task, const String&amp; mode);
</del><ins>+            static std::unique_ptr&lt;Task&gt; create(PassOwnPtr&lt;ScriptExecutionContext::Task&gt;, const String&amp; mode);
</ins><span class="cx">             ~Task() { }
</span><span class="cx">             const String&amp; mode() const { return m_mode; }
</span><span class="cx">             void performTask(const WorkerRunLoop&amp;, ScriptExecutionContext*);
</span><span class="cx"> 
</span><span class="cx">         private:
</span><del>-            Task(ScriptExecutionContext::Task task, const String&amp; mode);
</del><ins>+            Task(PassOwnPtr&lt;ScriptExecutionContext::Task&gt; task, const String&amp; mode);
</ins><span class="cx">         
</span><del>-            ScriptExecutionContext::Task m_task;
</del><ins>+            OwnPtr&lt;ScriptExecutionContext::Task&gt; m_task;
</ins><span class="cx">             String m_mode;
</span><span class="cx">         };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerThread.cpp (167903 => 167904)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerThread.cpp        2014-04-28 20:50:47 UTC (rev 167903)
+++ trunk/Source/WebCore/workers/WorkerThread.cpp        2014-04-28 20:55:09 UTC (rev 167904)
</span><span class="lines">@@ -205,63 +205,89 @@
</span><span class="cx">     m_runLoop.run(m_workerGlobalScope.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerThread::stop()
-{
-    // Mutex protection is necessary because stop() can be called before the context is fully created.
-    MutexLocker lock(m_threadCreationMutex);
</del><ins>+class WorkerThreadShutdownFinishTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;WorkerThreadShutdownFinishTask&gt; create()
+    {
+        return adoptPtr(new WorkerThreadShutdownFinishTask());
+    }
</ins><span class="cx"> 
</span><del>-    // Ensure that tasks are being handled by thread event loop. If script execution weren't forbidden, a while(1) loop in JS could keep the thread alive forever.
-    if (m_workerGlobalScope) {
-        m_workerGlobalScope-&gt;script()-&gt;scheduleExecutionTermination();
</del><ins>+    virtual void performTask(ScriptExecutionContext *context)
+    {
+        // It's not safe to call clearScript until all the cleanup tasks posted by functions initiated by WorkerThreadShutdownStartTask have completed.
+        toWorkerGlobalScope(context)-&gt;clearScript();
+    }
</ins><span class="cx"> 
</span><ins>+    virtual bool isCleanupTask() const { return true; }
+};
+
+class WorkerThreadShutdownStartTask : public ScriptExecutionContext::Task {
+public:
+    static PassOwnPtr&lt;WorkerThreadShutdownStartTask&gt; create()
+    {
+        return adoptPtr(new WorkerThreadShutdownStartTask());
+    }
+
+    virtual void performTask(ScriptExecutionContext *context)
+    {
+        WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
+
</ins><span class="cx"> #if ENABLE(SQL_DATABASE)
</span><del>-        DatabaseManager::manager().interruptAllDatabasesForContext(m_workerGlobalScope.get());
</del><ins>+        // FIXME: Should we stop the databases as part of stopActiveDOMObjects() below?
+        DatabaseTaskSynchronizer cleanupSync;
+        DatabaseManager::manager().stopDatabases(workerGlobalScope, &amp;cleanupSync);
</ins><span class="cx"> #endif
</span><del>-        m_runLoop.postTaskAndTerminate({ ScriptExecutionContext::Task::CleanupTask, [] (ScriptExecutionContext* context ) {
-            WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
</del><span class="cx"> 
</span><ins>+        workerGlobalScope-&gt;stopActiveDOMObjects();
+
+        workerGlobalScope-&gt;notifyObserversOfStop();
+
+        // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
+        // which become dangling once Heap is destroyed.
+        workerGlobalScope-&gt;removeAllEventListeners();
+
</ins><span class="cx"> #if ENABLE(SQL_DATABASE)
</span><del>-            // FIXME: Should we stop the databases as part of stopActiveDOMObjects() below?
-            DatabaseTaskSynchronizer cleanupSync;
-            DatabaseManager::manager().stopDatabases(workerGlobalScope, &amp;cleanupSync);
</del><ins>+        // We wait for the database thread to clean up all its stuff so that we
+        // can do more stringent leak checks as we exit.
+        cleanupSync.waitForTaskCompletion();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-            workerGlobalScope-&gt;stopActiveDOMObjects();
</del><ins>+        // Stick a shutdown command at the end of the queue, so that we deal
+        // with all the cleanup tasks the databases post first.
+        workerGlobalScope-&gt;postTask(WorkerThreadShutdownFinishTask::create());
+    }
</ins><span class="cx"> 
</span><del>-            workerGlobalScope-&gt;notifyObserversOfStop();
</del><ins>+    virtual bool isCleanupTask() const { return true; }
+};
</ins><span class="cx"> 
</span><del>-            // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
-            // which become dangling once Heap is destroyed.
-            workerGlobalScope-&gt;removeAllEventListeners();
</del><ins>+void WorkerThread::stop()
+{
+    // Mutex protection is necessary because stop() can be called before the context is fully created.
+    MutexLocker lock(m_threadCreationMutex);
</ins><span class="cx"> 
</span><ins>+    // Ensure that tasks are being handled by thread event loop. If script execution weren't forbidden, a while(1) loop in JS could keep the thread alive forever.
+    if (m_workerGlobalScope) {
+        m_workerGlobalScope-&gt;script()-&gt;scheduleExecutionTermination();
+
</ins><span class="cx"> #if ENABLE(SQL_DATABASE)
</span><del>-            // We wait for the database thread to clean up all its stuff so that we
-            // can do more stringent leak checks as we exit.
-            cleanupSync.waitForTaskCompletion();
</del><ins>+        DatabaseManager::manager().interruptAllDatabasesForContext(m_workerGlobalScope.get());
</ins><span class="cx"> #endif
</span><del>-
-            // Stick a shutdown command at the end of the queue, so that we deal
-            // with all the cleanup tasks the databases post first.
-            workerGlobalScope-&gt;postTask({ ScriptExecutionContext::Task::CleanupTask, [] (ScriptExecutionContext* context) {
-                WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
-                // It's not safe to call clearScript until all the cleanup tasks posted by functions initiated by WorkerThreadShutdownStartTask have completed.
-                workerGlobalScope-&gt;clearScript();
-            } });
-
-        } });
</del><ins>+        m_runLoop.postTaskAndTerminate(WorkerThreadShutdownStartTask::create());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_runLoop.terminate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class ReleaseFastMallocFreeMemoryTask : public ScriptExecutionContext::Task {
+    virtual void performTask(ScriptExecutionContext*) override { WTF::releaseFastMallocFreeMemory(); }
+};
+
</ins><span class="cx"> void WorkerThread::releaseFastMallocFreeMemoryInAllThreads()
</span><span class="cx"> {
</span><span class="cx">     std::lock_guard&lt;std::mutex&gt; lock(threadSetMutex());
</span><span class="cx"> 
</span><span class="cx">     for (auto* workerThread : workerThreads())
</span><del>-        workerThread-&gt;runLoop().postTask([] (ScriptExecutionContext*) {
-            WTF::releaseFastMallocFreeMemory();
-        });
</del><ins>+        workerThread-&gt;runLoop().postTask(adoptPtr(new ReleaseFastMallocFreeMemoryTask));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>