<!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>[201482] trunk/Source</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/201482">201482</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-05-27 22:51:42 -0700 (Fri, 27 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>callOnMainThread() should not copy captured lambda variables
https://bugs.webkit.org/show_bug.cgi?id=158166

Reviewed by Brady Eidson.

Source/WebCore:

callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.

This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.

* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::putOrAddOnServer):
* Modules/mediastream/MediaDevicesRequest.cpp:
(WebCore::MediaDevicesRequest::didCompletePermissionCheck):
(WebCore::MediaDevicesRequest::didCompleteTrackSourceInfoRequest):
* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::runTask):
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/UserMediaRequest.cpp:
(WebCore::UserMediaRequest::constraintsValidated):
(WebCore::UserMediaRequest::userMediaAccessGranted):
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::scheduleNodeDeletion):
(WebCore::AudioContext::isPlayingAudioDidChange):
* dom/Document.cpp:
(WebCore::Document::postTask):
(WebCore::Document::pendingTasksTimerFired): Deleted.
* dom/ScriptElement.cpp:
(WebCore::ScriptElement::requestScript):
* fileapi/AsyncFileStream.cpp:
(WebCore::callOnFileThread):
(WebCore::AsyncFileStream::~AsyncFileStream):
(WebCore::AsyncFileStream::perform):
* fileapi/AsyncFileStream.h:
* fileapi/ThreadableBlobRegistry.cpp:
(WebCore::ThreadableBlobRegistry::registerFileBlobURL):
(WebCore::ThreadableBlobRegistry::registerBlobURL):
(WebCore::ThreadableBlobRegistry::registerBlobURLForSlice):
(WebCore::ThreadableBlobRegistry::blobSize):
(WebCore::ThreadableBlobRegistry::unregisterBlobURL):
(WebCore::ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked): Deleted.
* loader/icon/IconDatabase.cpp:
(WebCore::IconDatabase::dispatchDidImportIconURLForPageURLOnMainThread):
(WebCore::IconDatabase::dispatchDidImportIconDataForPageURLOnMainThread):
* page/ResourceUsageThread.cpp:
(WebCore::ResourceUsageThread::notifyObservers):
(WebCore::ResourceUsageThread::threadBody):
* page/ResourceUsageThread.h:
* page/scrolling/ScrollingThread.cpp:
(WebCore::ScrollingThread::dispatch):
(WebCore::ScrollingThread::dispatchBarrier):
(WebCore::ScrollingThread::dispatchFunctionsFromScrollingThread):
* page/scrolling/ScrollingThread.h:
* page/scrolling/ios/ScrollingTreeIOS.cpp:
(WebCore::ScrollingTreeIOS::invalidate):
(WebCore::ScrollingTreeIOS::scrollingTreeNodeDidScroll):
(WebCore::ScrollingTreeIOS::currentSnapPointIndicesDidChange):
(WebCore::ScrollingTreeIOS::createScrollingTreeNode): Deleted.
* page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm:
(WebCore::ScrollingTreeFrameScrollingNodeMac::releaseReferencesToScrollerImpsOnTheMainThread):
* platform/MemoryPressureHandler.cpp:
(WebCore::MemoryPressureHandler::releaseMemory):
* platform/audio/ios/MediaSessionManagerIOS.mm:
(-[WebMediaSessionHelper dealloc]):
(-[WebMediaSessionHelper startMonitoringAirPlayRoutes]):
(-[WebMediaSessionHelper stopMonitoringAirPlayRoutes]):
* platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:
(WebCore::AudioSourceProviderAVFObjC::prepare):
* platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
(WebCore::MediaPlayerPrivateAVFoundation::scheduleMainThreadNotification):
(WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification):
* platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm:
(-[WebCDMSessionAVFoundationObjCListener observeValueForKeyPath:ofObject:change:context:]):
* platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
(-[WebAVOutputDeviceMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer):
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
(-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForResponseToAuthenticationChallenge:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::CMTimebaseEffectiveRateChangedCallback):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::play):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::pause):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask):
* platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
(-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:]):
(-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:withDiscontinuity:]):
(-[WebAVStreamDataParserListener streamDataParser:didFailToParseStreamDataWithError:]):
(-[WebAVStreamDataParserListener streamDataParser:didProvideMediaData:forTrackID:mediaType:flags:]):
(-[WebAVStreamDataParserListener streamDataParser:didReachEndOfTrackWithTrackID:mediaType:]):
(-[WebAVStreamDataParserListener streamDataParser:didProvideContentKeyRequestInitializationData:forTrackID:]):
(-[WebAVSampleBufferErrorListener observeValueForKeyPath:ofObject:change:context:]):
(-[WebAVSampleBufferErrorListener layerFailedToDecode:]):
* platform/graphics/cg/GraphicsContextCG.cpp:
(WebCore::patternReleaseCallback):
* platform/graphics/cg/PatternCG.cpp:
(WebCore::patternReleaseCallback):
* platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:
(WebCore::MediaPlayerPrivateMediaFoundation::endCreatedMediaSource):
(WebCore::MediaPlayerPrivateMediaFoundation::endGetEvent):
(WebCore::MediaPlayerPrivateMediaFoundation::CustomVideoPresenter::processInputNotify):
* platform/mediastream/MediaStreamPrivate.cpp:
(WebCore::MediaStreamPrivate::scheduleDeferredTask):
* platform/mediastream/MediaStreamPrivate.h:
* platform/mediastream/mac/AVMediaCaptureSource.h:
* platform/mediastream/mac/AVMediaCaptureSource.mm:
(WebCore::AVMediaCaptureSource::scheduleDeferredTask):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
(WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources):
* platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
(WebCore::WebAudioSourceProviderAVFObjC::prepare):
* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
* platform/network/BlobResourceHandle.cpp:
(WebCore::BlobResourceHandle::start):
(WebCore::BlobResourceHandle::notifyFinish):
* platform/network/DataURLDecoder.cpp:
(WebCore::DataURLDecoder::decode):
* platform/network/DataURLDecoder.h:
* platform/network/cocoa/WebCoreNSURLSession.mm:
(-[WebCoreNSURLSession dealloc]):
(-[WebCoreNSURLSessionDataTask cancel]):
(-[WebCoreNSURLSessionDataTask suspend]):
(-[WebCoreNSURLSessionDataTask resume]):
* platform/network/curl/CurlDownload.cpp:
(WebCore::CurlDownload::didReceiveHeader):
(WebCore::CurlDownload::didReceiveData): Deleted.

Source/WebKit:

callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.

This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.

* Storage/StorageAreaSync.cpp:
(WebCore::StorageAreaSync::deleteEmptyDatabase):
* Storage/StorageSyncManager.cpp:
(WebCore::StorageSyncManager::dispatch):
* Storage/StorageSyncManager.h:
* Storage/StorageThread.cpp:
(WebCore::StorageThread::dispatch):
(WebCore::StorageThread::terminate):
(WebCore::StorageThread::releaseFastMallocFreeMemoryInAllThreads):
* Storage/StorageThread.h:
* Storage/StorageTracker.cpp:
(WebCore::StorageTracker::syncFileSystemAndTrackerDatabase):
(WebCore::StorageTracker::setOriginDetails):

Source/WebKit/mac:

callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.

This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.

* Storage/WebDatabaseManagerClient.mm:
(DidModifyOriginData::dispatchToMainThread):
(DidModifyOriginData::DidModifyOriginData): Deleted.
* Storage/WebStorageTrackerClient.mm:
(WebStorageTrackerClient::dispatchDidModifyOrigin):

Source/WTF:

callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.

This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.

* WTF.xcodeproj/project.pbxproj:

* wtf/FunctionDispatcher.h:
* wtf/NoncopyableFunction.h:
- Moved NoncopyableFunction from FunctionDispatcher.h to
  NoncopyableFunction.h.
- Add a new operator=(nullptr_t) operator to NoncopyableFunction to
  match std::function, as one of the call sites needed it.

* wtf/MainThread.cpp:
(WTF::functionQueue):
(WTF::dispatchFunctionsFromMainThread):
(WTF::callOnMainThread):
* wtf/MainThread.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFWTFxcodeprojprojectpbxproj">trunk/Source/WTF/WTF.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWTFwtfFunctionDispatcherh">trunk/Source/WTF/wtf/FunctionDispatcher.h</a></li>
<li><a href="#trunkSourceWTFwtfMainThreadcpp">trunk/Source/WTF/wtf/MainThread.cpp</a></li>
<li><a href="#trunkSourceWTFwtfMainThreadh">trunk/Source/WTF/wtf/MainThread.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBTransactioncpp">trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaDevicesRequestcpp">trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp">trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioContextcpp">trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomScriptElementcpp">trunk/Source/WebCore/dom/ScriptElement.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiAsyncFileStreamcpp">trunk/Source/WebCore/fileapi/AsyncFileStream.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiAsyncFileStreamh">trunk/Source/WebCore/fileapi/AsyncFileStream.h</a></li>
<li><a href="#trunkSourceWebCorefileapiThreadableBlobRegistrycpp">trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadericonIconDatabasecpp">trunk/Source/WebCore/loader/icon/IconDatabase.cpp</a></li>
<li><a href="#trunkSourceWebCorepageResourceUsageThreadcpp">trunk/Source/WebCore/page/ResourceUsageThread.cpp</a></li>
<li><a href="#trunkSourceWebCorepageResourceUsageThreadh">trunk/Source/WebCore/page/ResourceUsageThread.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingThreadcpp">trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingThreadh">trunk/Source/WebCore/page/scrolling/ScrollingThread.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingiosScrollingTreeIOScpp">trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingmacScrollingTreeFrameScrollingNodeMacmm">trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformMemoryPressureHandlercpp">trunk/Source/WebCore/platform/MemoryPressureHandler.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioiosMediaSessionManagerIOSmm">trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationAudioSourceProviderAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp">trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcCDMSessionAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMacmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcSourceBufferPrivateAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp">trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgPatternCGcpp">trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswinMediaPlayerPrivateMediaFoundationcpp">trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivatecpp">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourceh">trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourcemm">trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp">trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacWebAudioSourceProviderAVFObjCmm">trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkBlobResourceHandlecpp">trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkDataURLDecodercpp">trunk/Source/WebCore/platform/network/DataURLDecoder.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkDataURLDecoderh">trunk/Source/WebCore/platform/network/DataURLDecoder.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcocoaWebCoreNSURLSessionmm">trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlDownloadcpp">trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitStorageStorageAreaSynccpp">trunk/Source/WebKit/Storage/StorageAreaSync.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageSyncManagercpp">trunk/Source/WebKit/Storage/StorageSyncManager.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageSyncManagerh">trunk/Source/WebKit/Storage/StorageSyncManager.h</a></li>
<li><a href="#trunkSourceWebKitStorageStorageThreadcpp">trunk/Source/WebKit/Storage/StorageThread.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageThreadh">trunk/Source/WebKit/Storage/StorageThread.h</a></li>
<li><a href="#trunkSourceWebKitStorageStorageTrackercpp">trunk/Source/WebKit/Storage/StorageTracker.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseManagerClientmm">trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebStorageTrackerClientmm">trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWTFwtfNoncopyableFunctionh">trunk/Source/WTF/wtf/NoncopyableFunction.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2016-05-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        callOnMainThread() should not copy captured lambda variables
+        https://bugs.webkit.org/show_bug.cgi?id=158166
+
+        Reviewed by Brady Eidson.
+
+        callOnMainThread() should not copy captured lambda variables. This
+        function is usually called cross-thread with a lambda and copying
+        the lambda (and its captured variables) can lead to thread-safety
+        issues.
+
+        This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
+        in parameter instead of a std::function. The call sites of
+        callOnMainThread() have also been updated to use C++14's lambda
+        capture with initializer.
+
+        * WTF.xcodeproj/project.pbxproj:
+
+        * wtf/FunctionDispatcher.h:
+        * wtf/NoncopyableFunction.h:
+        - Moved NoncopyableFunction from FunctionDispatcher.h to
+          NoncopyableFunction.h.
+        - Add a new operator=(nullptr_t) operator to NoncopyableFunction to
+          match std::function, as one of the call sites needed it.
+
+        * wtf/MainThread.cpp:
+        (WTF::functionQueue):
+        (WTF::dispatchFunctionsFromMainThread):
+        (WTF::callOnMainThread):
+        * wtf/MainThread.h:
+
</ins><span class="cx"> 2016-05-27  Yusuke Suzuki  &lt;utatane.tea@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, build fix for JSCOnly port.
</span></span></pre></div>
<a id="trunkSourceWTFWTFxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.xcodeproj/project.pbxproj (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -114,6 +114,7 @@
</span><span class="cx">                 7E29C33E15FFD79B00516D61 /* ObjcRuntimeExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E29C33D15FFD79B00516D61 /* ObjcRuntimeExtras.h */; };
</span><span class="cx">                 8134013815B092FD001FF0B8 /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8134013615B092FD001FF0B8 /* Base64.cpp */; };
</span><span class="cx">                 8134013915B092FD001FF0B8 /* Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8134013715B092FD001FF0B8 /* Base64.h */; };
</span><ins>+                83F2BADF1CF9524E003E99C3 /* NoncopyableFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F2BADE1CF9524E003E99C3 /* NoncopyableFunction.h */; };
</ins><span class="cx">                 83FBA93219DF459700F30ADB /* TypeCasts.h in Headers */ = {isa = PBXBuildFile; fileRef = 83FBA93119DF459700F30ADB /* TypeCasts.h */; };
</span><span class="cx">                 86F46F611A2840EE00CCBF22 /* RefCounter.h in Headers */ = {isa = PBXBuildFile; fileRef = 86F46F5F1A2840EE00CCBF22 /* RefCounter.h */; };
</span><span class="cx">                 93934BD318A1E8C300D0D6A1 /* StringViewObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93934BD218A1E8C300D0D6A1 /* StringViewObjC.mm */; };
</span><span class="lines">@@ -437,6 +438,7 @@
</span><span class="cx">                 7E29C33D15FFD79B00516D61 /* ObjcRuntimeExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjcRuntimeExtras.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 8134013615B092FD001FF0B8 /* Base64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Base64.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 8134013715B092FD001FF0B8 /* Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Base64.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                83F2BADE1CF9524E003E99C3 /* NoncopyableFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoncopyableFunction.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 83FBA93119DF459700F30ADB /* TypeCasts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeCasts.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 86F46F5F1A2840EE00CCBF22 /* RefCounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RefCounter.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 93934BD218A1E8C300D0D6A1 /* StringViewObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = StringViewObjC.mm; path = mac/StringViewObjC.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -869,6 +871,7 @@
</span><span class="cx">                                 1A3F6BE6174ADA2100B2EEA7 /* NeverDestroyed.h */,
</span><span class="cx">                                 0F0D85B317234CB100338210 /* NoLock.h */,
</span><span class="cx">                                 A8A472D0151A825B004123FF /* Noncopyable.h */,
</span><ins>+                                83F2BADE1CF9524E003E99C3 /* NoncopyableFunction.h */,
</ins><span class="cx">                                 A8A472D5151A825B004123FF /* NumberOfCores.cpp */,
</span><span class="cx">                                 A8A472D6151A825B004123FF /* NumberOfCores.h */,
</span><span class="cx">                                 7E29C33D15FFD79B00516D61 /* ObjcRuntimeExtras.h */,
</span><span class="lines">@@ -1231,6 +1234,7 @@
</span><span class="cx">                                 A8A473D9151A825B004123FF /* HashTable.h in Headers */,
</span><span class="cx">                                 A8A473DA151A825B004123FF /* HashTraits.h in Headers */,
</span><span class="cx">                                 A8A473DB151A825B004123FF /* HexNumber.h in Headers */,
</span><ins>+                                83F2BADF1CF9524E003E99C3 /* NoncopyableFunction.h in Headers */,
</ins><span class="cx">                                 2684D4361C000D400081D663 /* IndexSparseSet.h in Headers */,
</span><span class="cx">                                 A8A473DC151A825B004123FF /* InlineASM.h in Headers */,
</span><span class="cx">                                 A70DA0841799F04D00529A9B /* Insertion.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWTFwtfFunctionDispatcherh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/FunctionDispatcher.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/FunctionDispatcher.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/wtf/FunctionDispatcher.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -27,66 +27,11 @@
</span><span class="cx"> #define FunctionDispatcher_h
</span><span class="cx"> 
</span><span class="cx"> #include &lt;functional&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/ThreadSafeRefCounted.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><del>-// FIXME: Move this to its own header (e.g. Functional.h).
-// FIXME: We could make this templated to support other lambdas than void() and make this more reusable.
-class NoncopyableFunction {
-public:
-    NoncopyableFunction() = default;
-
-    template&lt;typename CallableType, class = typename std::enable_if&lt;std::is_rvalue_reference&lt;CallableType&amp;&amp;&gt;::value&gt;::type&gt;
-    NoncopyableFunction(CallableType&amp;&amp; callable)
-        : m_callableWrapper(std::make_unique&lt;CallableWrapper&lt;CallableType&gt;&gt;(WTFMove(callable)))
-    {
-    }
-
-    void operator()() const
-    {
-        if (m_callableWrapper)
-            m_callableWrapper-&gt;call();
-    }
-
-    explicit operator bool() const { return !!m_callableWrapper; }
-
-    template&lt;typename CallableType, class = typename std::enable_if&lt;std::is_rvalue_reference&lt;CallableType&amp;&amp;&gt;::value&gt;::type&gt;
-    NoncopyableFunction&amp; operator=(CallableType&amp;&amp; callable)
-    {
-        m_callableWrapper = std::make_unique&lt;CallableWrapper&lt;CallableType&gt;&gt;(WTFMove(callable));
-        return *this;
-    }
-
-private:
-    class CallableWrapperBase {
-        WTF_MAKE_FAST_ALLOCATED;
-    public:
-        virtual ~CallableWrapperBase() { }
-
-        virtual void call() = 0;
-    };
-
-    template&lt;typename CallableType&gt;
-    class CallableWrapper final : public CallableWrapperBase {
-    public:
-        explicit CallableWrapper(CallableType&amp;&amp; callable)
-            : m_callable(WTFMove(callable))
-        {
-        }
-
-        CallableWrapper(const CallableWrapper&amp;) = delete;
-        CallableWrapper&amp; operator=(const CallableWrapper&amp;) = delete;
-
-        void call() final { m_callable(); }
-
-    private:
-        CallableType m_callable;
-    };
-
-    std::unique_ptr&lt;CallableWrapperBase&gt; m_callableWrapper;
-};
-
</del><span class="cx"> // FunctionDispatcher is an abstract representation of something that functions can be
</span><span class="cx"> // dispatched to. This can for example be a run loop or a work queue.
</span><span class="cx"> 
</span><span class="lines">@@ -103,6 +48,5 @@
</span><span class="cx"> } // namespace WTF
</span><span class="cx"> 
</span><span class="cx"> using WTF::FunctionDispatcher;
</span><del>-using WTF::NoncopyableFunction;
</del><span class="cx"> 
</span><span class="cx"> #endif // FunctionDispatcher_h
</span></span></pre></div>
<a id="trunkSourceWTFwtfMainThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/MainThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/MainThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/wtf/MainThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx"> 
</span><span class="cx"> static StaticLock mainThreadFunctionQueueMutex;
</span><span class="cx"> 
</span><del>-static Deque&lt;std::function&lt;void ()&gt;&gt;&amp; functionQueue()
</del><ins>+static Deque&lt;NoncopyableFunction&gt;&amp; functionQueue()
</ins><span class="cx"> {
</span><del>-    static NeverDestroyed&lt;Deque&lt;std::function&lt;void ()&gt;&gt;&gt; functionQueue;
</del><ins>+    static NeverDestroyed&lt;Deque&lt;NoncopyableFunction&gt;&gt; functionQueue;
</ins><span class="cx">     return functionQueue;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -120,7 +120,7 @@
</span><span class="cx"> 
</span><span class="cx">     auto startTime = std::chrono::steady_clock::now();
</span><span class="cx"> 
</span><del>-    std::function&lt;void ()&gt; function;
</del><ins>+    NoncopyableFunction function;
</ins><span class="cx"> 
</span><span class="cx">     while (true) {
</span><span class="cx">         {
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void callOnMainThread(std::function&lt;void ()&gt; function)
</del><ins>+void callOnMainThread(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(function);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtfMainThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/MainThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/MainThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/wtf/MainThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;functional&gt;
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><span class="lines">@@ -40,7 +41,7 @@
</span><span class="cx"> // Must be called from the main thread.
</span><span class="cx"> WTF_EXPORT_PRIVATE void initializeMainThread();
</span><span class="cx"> 
</span><del>-WTF_EXPORT_PRIVATE void callOnMainThread(std::function&lt;void ()&gt;);
</del><ins>+WTF_EXPORT_PRIVATE void callOnMainThread(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> WTF_EXPORT_PRIVATE void callOnWebThreadOrDispatchAsyncOnMainThread(void (^block)());
</span></span></pre></div>
<a id="trunkSourceWTFwtfNoncopyableFunctionhfromrev201481trunkSourceWTFwtfFunctionDispatcherh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WTF/wtf/NoncopyableFunction.h (from rev 201481, trunk/Source/WTF/wtf/FunctionDispatcher.h) (0 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/NoncopyableFunction.h                                (rev 0)
+++ trunk/Source/WTF/wtf/NoncopyableFunction.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -0,0 +1,95 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &lt;memory&gt;
+
+namespace WTF {
+
+// FIXME: We could make this templated to support other lambdas than void() and make this more reusable.
+class NoncopyableFunction {
+public:
+    NoncopyableFunction() = default;
+
+    template&lt;typename CallableType, class = typename std::enable_if&lt;std::is_rvalue_reference&lt;CallableType&amp;&amp;&gt;::value&gt;::type&gt;
+    NoncopyableFunction(CallableType&amp;&amp; callable)
+        : m_callableWrapper(std::make_unique&lt;CallableWrapper&lt;CallableType&gt;&gt;(WTFMove(callable)))
+    {
+    }
+
+    void operator()() const
+    {
+        if (m_callableWrapper)
+            m_callableWrapper-&gt;call();
+    }
+
+    explicit operator bool() const { return !!m_callableWrapper; }
+
+    template&lt;typename CallableType, class = typename std::enable_if&lt;std::is_rvalue_reference&lt;CallableType&amp;&amp;&gt;::value&gt;::type&gt;
+    NoncopyableFunction&amp; operator=(CallableType&amp;&amp; callable)
+    {
+        m_callableWrapper = std::make_unique&lt;CallableWrapper&lt;CallableType&gt;&gt;(WTFMove(callable));
+        return *this;
+    }
+
+    NoncopyableFunction&amp; operator=(std::nullptr_t)
+    {
+        m_callableWrapper = nullptr;
+        return *this;
+    }
+
+private:
+    class CallableWrapperBase {
+        WTF_MAKE_FAST_ALLOCATED;
+    public:
+        virtual ~CallableWrapperBase() { }
+
+        virtual void call() = 0;
+    };
+
+    template&lt;typename CallableType&gt;
+    class CallableWrapper final : public CallableWrapperBase {
+    public:
+        explicit CallableWrapper(CallableType&amp;&amp; callable)
+            : m_callable(WTFMove(callable))
+        {
+        }
+
+        CallableWrapper(const CallableWrapper&amp;) = delete;
+        CallableWrapper&amp; operator=(const CallableWrapper&amp;) = delete;
+
+        void call() final { m_callable(); }
+
+    private:
+        CallableType m_callable;
+    };
+
+    std::unique_ptr&lt;CallableWrapperBase&gt; m_callableWrapper;
+};
+
+} // namespace WTF
+
+using WTF::NoncopyableFunction;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,143 @@
</span><ins>+2016-05-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        callOnMainThread() should not copy captured lambda variables
+        https://bugs.webkit.org/show_bug.cgi?id=158166
+
+        Reviewed by Brady Eidson.
+
+        callOnMainThread() should not copy captured lambda variables. This 
+        function is usually called cross-thread with a lambda and copying
+        the lambda (and its captured variables) can lead to thread-safety
+        issues.
+
+        This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
+        in parameter instead of a std::function. The call sites of
+        callOnMainThread() have also been updated to use C++14's lambda
+        capture with initializer.
+
+        * Modules/indexeddb/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::putOrAddOnServer):
+        * Modules/mediastream/MediaDevicesRequest.cpp:
+        (WebCore::MediaDevicesRequest::didCompletePermissionCheck):
+        (WebCore::MediaDevicesRequest::didCompleteTrackSourceInfoRequest):
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::MediaEndpointPeerConnection::runTask):
+        * Modules/mediastream/MediaEndpointPeerConnection.h:
+        * Modules/mediastream/UserMediaRequest.cpp:
+        (WebCore::UserMediaRequest::constraintsValidated):
+        (WebCore::UserMediaRequest::userMediaAccessGranted):
+        * Modules/webaudio/AudioContext.cpp:
+        (WebCore::AudioContext::scheduleNodeDeletion):
+        (WebCore::AudioContext::isPlayingAudioDidChange):
+        * dom/Document.cpp:
+        (WebCore::Document::postTask):
+        (WebCore::Document::pendingTasksTimerFired): Deleted.
+        * dom/ScriptElement.cpp:
+        (WebCore::ScriptElement::requestScript):
+        * fileapi/AsyncFileStream.cpp:
+        (WebCore::callOnFileThread):
+        (WebCore::AsyncFileStream::~AsyncFileStream):
+        (WebCore::AsyncFileStream::perform):
+        * fileapi/AsyncFileStream.h:
+        * fileapi/ThreadableBlobRegistry.cpp:
+        (WebCore::ThreadableBlobRegistry::registerFileBlobURL):
+        (WebCore::ThreadableBlobRegistry::registerBlobURL):
+        (WebCore::ThreadableBlobRegistry::registerBlobURLForSlice):
+        (WebCore::ThreadableBlobRegistry::blobSize):
+        (WebCore::ThreadableBlobRegistry::unregisterBlobURL):
+        (WebCore::ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked): Deleted.
+        * loader/icon/IconDatabase.cpp:
+        (WebCore::IconDatabase::dispatchDidImportIconURLForPageURLOnMainThread):
+        (WebCore::IconDatabase::dispatchDidImportIconDataForPageURLOnMainThread):
+        * page/ResourceUsageThread.cpp:
+        (WebCore::ResourceUsageThread::notifyObservers):
+        (WebCore::ResourceUsageThread::threadBody):
+        * page/ResourceUsageThread.h:
+        * page/scrolling/ScrollingThread.cpp:
+        (WebCore::ScrollingThread::dispatch):
+        (WebCore::ScrollingThread::dispatchBarrier):
+        (WebCore::ScrollingThread::dispatchFunctionsFromScrollingThread):
+        * page/scrolling/ScrollingThread.h:
+        * page/scrolling/ios/ScrollingTreeIOS.cpp:
+        (WebCore::ScrollingTreeIOS::invalidate):
+        (WebCore::ScrollingTreeIOS::scrollingTreeNodeDidScroll):
+        (WebCore::ScrollingTreeIOS::currentSnapPointIndicesDidChange):
+        (WebCore::ScrollingTreeIOS::createScrollingTreeNode): Deleted.
+        * page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm:
+        (WebCore::ScrollingTreeFrameScrollingNodeMac::releaseReferencesToScrollerImpsOnTheMainThread):
+        * platform/MemoryPressureHandler.cpp:
+        (WebCore::MemoryPressureHandler::releaseMemory):
+        * platform/audio/ios/MediaSessionManagerIOS.mm:
+        (-[WebMediaSessionHelper dealloc]):
+        (-[WebMediaSessionHelper startMonitoringAirPlayRoutes]):
+        (-[WebMediaSessionHelper stopMonitoringAirPlayRoutes]):
+        * platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:
+        (WebCore::AudioSourceProviderAVFObjC::prepare):
+        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
+        (WebCore::MediaPlayerPrivateAVFoundation::scheduleMainThreadNotification):
+        (WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification):
+        * platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm:
+        (-[WebCDMSessionAVFoundationObjCListener observeValueForKeyPath:ofObject:change:context:]):
+        * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
+        (-[WebAVOutputDeviceMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer):
+        (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
+        (-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
+        (-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
+        (-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForResponseToAuthenticationChallenge:]):
+        (-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
+        (WebCore::CMTimebaseEffectiveRateChangedCallback):
+        (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::play):
+        (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::pause):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask):
+        * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
+        (-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:]):
+        (-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:withDiscontinuity:]):
+        (-[WebAVStreamDataParserListener streamDataParser:didFailToParseStreamDataWithError:]):
+        (-[WebAVStreamDataParserListener streamDataParser:didProvideMediaData:forTrackID:mediaType:flags:]):
+        (-[WebAVStreamDataParserListener streamDataParser:didReachEndOfTrackWithTrackID:mediaType:]):
+        (-[WebAVStreamDataParserListener streamDataParser:didProvideContentKeyRequestInitializationData:forTrackID:]):
+        (-[WebAVSampleBufferErrorListener observeValueForKeyPath:ofObject:change:context:]):
+        (-[WebAVSampleBufferErrorListener layerFailedToDecode:]):
+        * platform/graphics/cg/GraphicsContextCG.cpp:
+        (WebCore::patternReleaseCallback):
+        * platform/graphics/cg/PatternCG.cpp:
+        (WebCore::patternReleaseCallback):
+        * platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:
+        (WebCore::MediaPlayerPrivateMediaFoundation::endCreatedMediaSource):
+        (WebCore::MediaPlayerPrivateMediaFoundation::endGetEvent):
+        (WebCore::MediaPlayerPrivateMediaFoundation::CustomVideoPresenter::processInputNotify):
+        * platform/mediastream/MediaStreamPrivate.cpp:
+        (WebCore::MediaStreamPrivate::scheduleDeferredTask):
+        * platform/mediastream/MediaStreamPrivate.h:
+        * platform/mediastream/mac/AVMediaCaptureSource.h:
+        * platform/mediastream/mac/AVMediaCaptureSource.mm:
+        (WebCore::AVMediaCaptureSource::scheduleDeferredTask):
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+        (WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources):
+        * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
+        (WebCore::WebAudioSourceProviderAVFObjC::prepare):
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
+        * platform/network/BlobResourceHandle.cpp:
+        (WebCore::BlobResourceHandle::start):
+        (WebCore::BlobResourceHandle::notifyFinish):
+        * platform/network/DataURLDecoder.cpp:
+        (WebCore::DataURLDecoder::decode):
+        * platform/network/DataURLDecoder.h:
+        * platform/network/cocoa/WebCoreNSURLSession.mm:
+        (-[WebCoreNSURLSession dealloc]):
+        (-[WebCoreNSURLSessionDataTask cancel]):
+        (-[WebCoreNSURLSessionDataTask suspend]):
+        (-[WebCoreNSURLSessionDataTask resume]):
+        * platform/network/curl/CurlDownload.cpp:
+        (WebCore::CurlDownload::didReceiveHeader):
+        (WebCore::CurlDownload::didReceiveData): Deleted.
+
</ins><span class="cx"> 2016-05-27  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r190574): Swipe snapshots are always black on iPhone 5
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -979,7 +979,7 @@
</span><span class="cx">         // If the IDBValue doesn't have any data, then something went wrong writing the blobs to disk.
</span><span class="cx">         // In that case, we cannot successfully store this record, so we callback with an error.
</span><span class="cx">         auto result = IDBResultData::error(protectedOperation-&gt;identifier(), { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Error preparing Blob/File data to be stored in object store&quot;) });
</span><del>-        callOnMainThread([protectedThis = WTFMove(protectedThis), this, protectedOperation = WTFMove(protectedOperation), result = WTFMove(result)]() {
</del><ins>+        callOnMainThread([protectedThis = WTFMove(protectedThis), protectedOperation = WTFMove(protectedOperation), result = WTFMove(result)]() {
</ins><span class="cx">             protectedOperation-&gt;completed(result);
</span><span class="cx">         });
</span><span class="cx">     });
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">     m_idHashSalt = salt;
</span><span class="cx">     m_havePersistentPermission = canAccess;
</span><span class="cx"> 
</span><del>-    callOnMainThread([this, permissionCheckProtector] {
</del><ins>+    callOnMainThread([this, permissionCheckProtector = WTFMove(permissionCheckProtector)] {
</ins><span class="cx">         RealtimeMediaSourceCenter::singleton().getMediaStreamTrackSources(this);
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -160,8 +160,7 @@
</span><span class="cx">         devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RefPtr&lt;MediaDevicesRequest&gt; protectedThis(this);
-    callOnMainThread([protectedThis, devices] {
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;MediaDevicesRequest&gt;(*this), devices = WTFMove(devices)]() mutable {
</ins><span class="cx">         protectedThis-&gt;m_promise.resolve(devices);
</span><span class="cx">     });
</span><span class="cx">     m_protector = nullptr;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -95,14 +95,14 @@
</span><span class="cx">     m_mediaEndpoint-&gt;generateDtlsInfo();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointPeerConnection::runTask(std::function&lt;void()&gt; task)
</del><ins>+void MediaEndpointPeerConnection::runTask(NoncopyableFunction&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     if (m_dtlsFingerprint.isNull()) {
</span><span class="cx">         // Only one task needs to be deferred since it will hold off any others until completed.
</span><span class="cx">         ASSERT(!m_initialDeferredTask);
</span><del>-        m_initialDeferredTask = task;
</del><ins>+        m_initialDeferredTask = WTFMove(task);
</ins><span class="cx">     } else
</span><del>-        callOnMainThread(task);
</del><ins>+        callOnMainThread(WTFMove(task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::startRunningTasks()
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="cx"> #include &quot;PeerConnectionBackend.h&quot;
</span><span class="cx"> #include &quot;RTCSessionDescription.h&quot;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -77,7 +78,7 @@
</span><span class="cx">     void clearNegotiationNeededState() override { notImplemented(); };
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    void runTask(std::function&lt;void()&gt;);
</del><ins>+    void runTask(NoncopyableFunction&amp;&amp;);
</ins><span class="cx">     void startRunningTasks();
</span><span class="cx"> 
</span><span class="cx">     void createOfferTask(RTCOfferOptions&amp;, PeerConnection::SessionDescriptionPromise&amp;);
</span><span class="lines">@@ -91,7 +92,7 @@
</span><span class="cx">     PeerConnectionBackendClient* m_client;
</span><span class="cx">     std::unique_ptr&lt;MediaEndpoint&gt; m_mediaEndpoint;
</span><span class="cx"> 
</span><del>-    std::function&lt;void()&gt; m_initialDeferredTask;
</del><ins>+    NoncopyableFunction m_initialDeferredTask;
</ins><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;SDPProcessor&gt; m_sdpProcessor;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -135,11 +135,10 @@
</span><span class="cx">     for (auto&amp; videoTrack : videoTracks)
</span><span class="cx">         m_videoDeviceUIDs.append(videoTrack-&gt;persistentID());
</span><span class="cx"> 
</span><del>-    RefPtr&lt;UserMediaRequest&gt; protectedThis(this);
-    callOnMainThread([protectedThis] {
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;UserMediaRequest&gt;(*this)]() mutable {
</ins><span class="cx">         // 2 - The constraints are valid, ask the user for access to media.
</span><span class="cx">         if (UserMediaController* controller = protectedThis-&gt;m_controller)
</span><del>-            controller-&gt;requestUserMediaAccess(*protectedThis.get());
</del><ins>+            controller-&gt;requestUserMediaAccess(protectedThis.get());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -148,10 +147,9 @@
</span><span class="cx">     m_allowedVideoDeviceUID = videoDeviceUID;
</span><span class="cx">     m_audioDeviceUIDAllowed = audioDeviceUID;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;UserMediaRequest&gt; protectedThis(this);
-    callOnMainThread([protectedThis, audioDeviceUID, videoDeviceUID] {
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;UserMediaRequest&gt;(*this), audioDeviceUID, videoDeviceUID]() mutable {
</ins><span class="cx">         // 3 - the user granted access, ask platform to create the media stream descriptors.
</span><del>-        RealtimeMediaSourceCenter::singleton().createMediaStream(protectedThis.get(), audioDeviceUID, videoDeviceUID);
</del><ins>+        RealtimeMediaSourceCenter::singleton().createMediaStream(protectedThis.ptr(), audioDeviceUID, videoDeviceUID);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -797,8 +797,7 @@
</span><span class="cx"> 
</span><span class="cx">         m_isDeletionScheduled = true;
</span><span class="cx"> 
</span><del>-        RefPtr&lt;AudioContext&gt; protectedThis(this);
-        callOnMainThread([protectedThis] {
</del><ins>+        callOnMainThread([protectedThis = Ref&lt;AudioContext&gt;(*this)]() mutable {
</ins><span class="cx">             protectedThis-&gt;deleteMarkedNodes();
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="lines">@@ -1002,8 +1001,7 @@
</span><span class="cx"> {
</span><span class="cx">     // Make sure to call Document::updateIsPlayingMedia() on the main thread, since
</span><span class="cx">     // we could be on the audio I/O thread here and the call into WebCore could block.
</span><del>-    RefPtr&lt;AudioContext&gt; protectedThis(this);
-    callOnMainThread([protectedThis] {
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;AudioContext&gt;(*this)] {
</ins><span class="cx">         if (protectedThis-&gt;document())
</span><span class="cx">             protectedThis-&gt;document()-&gt;updateIsPlayingMedia();
</span><span class="cx">     });
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -5386,12 +5386,8 @@
</span><span class="cx"> 
</span><span class="cx"> void Document::postTask(Task task)
</span><span class="cx"> {
</span><del>-    Task* taskPtr = std::make_unique&lt;Task&gt;(WTFMove(task)).release();
-    WeakPtr&lt;Document&gt; documentReference(m_weakFactory.createWeakPtr());
-
-    callOnMainThread([=] {
</del><ins>+    callOnMainThread([documentReference = m_weakFactory.createWeakPtr(), task = WTFMove(task)]() mutable {
</ins><span class="cx">         ASSERT(isMainThread());
</span><del>-        std::unique_ptr&lt;Task&gt; task(taskPtr);
</del><span class="cx"> 
</span><span class="cx">         Document* document = documentReference.get();
</span><span class="cx">         if (!document)
</span><span class="lines">@@ -5399,9 +5395,9 @@
</span><span class="cx"> 
</span><span class="cx">         Page* page = document-&gt;page();
</span><span class="cx">         if ((page &amp;&amp; page-&gt;defersLoading() &amp;&amp; document-&gt;activeDOMObjectsAreSuspended()) || !document-&gt;m_pendingTasks.isEmpty())
</span><del>-            document-&gt;m_pendingTasks.append(WTFMove(*task.release()));
</del><ins>+            document-&gt;m_pendingTasks.append(WTFMove(task));
</ins><span class="cx">         else
</span><del>-            task-&gt;performTask(*document);
</del><ins>+            task.performTask(*document);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptElement.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptElement.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/dom/ScriptElement.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -280,8 +280,7 @@
</span><span class="cx">     if (m_cachedScript)
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;Element&gt; element = &amp;m_element;
-    callOnMainThread([this, element] {
</del><ins>+    callOnMainThread([this, element = Ref&lt;Element&gt;(m_element)] {
</ins><span class="cx">         dispatchErrorEvent();
</span><span class="cx">     });
</span><span class="cx">     return false;
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiAsyncFileStreamcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/AsyncFileStream.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/AsyncFileStream.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/fileapi/AsyncFileStream.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/MessageQueue.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -63,12 +64,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void callOnFileThread(std::function&lt;void()&gt;&amp;&amp; function)
</del><ins>+static void callOnFileThread(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     ASSERT(function);
</span><span class="cx"> 
</span><del>-    static NeverDestroyed&lt;MessageQueue&lt;std::function&lt;void()&gt;&gt;&gt; queue;
</del><ins>+    static NeverDestroyed&lt;MessageQueue&lt;NoncopyableFunction&gt;&gt; queue;
</ins><span class="cx"> 
</span><span class="cx">     static std::once_flag createFileThreadOnce;
</span><span class="cx">     std::call_once(createFileThreadOnce, [] {
</span><span class="lines">@@ -89,7 +90,7 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><del>-    queue.get().append(std::make_unique&lt;std::function&lt;void()&gt;&gt;(WTFMove(function)));
</del><ins>+    queue.get().append(std::make_unique&lt;NoncopyableFunction&gt;(WTFMove(function)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AsyncFileStream::AsyncFileStream(FileStreamClient&amp; client)
</span><span class="lines">@@ -102,33 +103,28 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><del>-    // Release so that we can control the timing of deletion below.
-    auto&amp; internals = *m_internals.release();
-
</del><span class="cx">     // Set flag to prevent client callbacks and also prevent queued operations from starting.
</span><del>-    internals.destroyed = true;
</del><ins>+    m_internals-&gt;destroyed = true;
</ins><span class="cx"> 
</span><span class="cx">     // Call through file thread and back to main thread to make sure deletion happens
</span><span class="cx">     // after all file thread functions and all main thread functions called from them.
</span><del>-    callOnFileThread([&amp;internals] {
-        callOnMainThread([&amp;internals] {
-            delete &amp;internals;
</del><ins>+    callOnFileThread([internals = WTFMove(m_internals)]() mutable {
+        callOnMainThread([internals = WTFMove(internals)] {
</ins><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncFileStream::perform(std::function&lt;std::function&lt;void(FileStreamClient&amp;)&gt;(FileStream&amp;)&gt; operation)
</del><ins>+void AsyncFileStream::perform(std::function&lt;std::function&lt;void(FileStreamClient&amp;)&gt;(FileStream&amp;)&gt;&amp;&amp; operation)
</ins><span class="cx"> {
</span><span class="cx">     auto&amp; internals = *m_internals;
</span><del>-    callOnFileThread([&amp;internals, operation] {
</del><ins>+    callOnFileThread([&amp;internals, operation = WTFMove(operation)] {
</ins><span class="cx">         // Don't do the operation if stop was already called on the main thread. Note that there is
</span><span class="cx">         // a race here, but since skipping the operation is an optimization it's OK that we can't
</span><span class="cx">         // guarantee exactly which operations are skipped. Note that this is also the only reason
</span><span class="cx">         // we use an atomic_bool rather than just a bool for destroyed.
</span><span class="cx">         if (internals.destroyed)
</span><span class="cx">             return;
</span><del>-        auto mainThreadWork = operation(internals.stream);
-        callOnMainThread([&amp;internals, mainThreadWork] {
</del><ins>+        callOnMainThread([&amp;internals, mainThreadWork = operation(internals.stream)] {
</ins><span class="cx">             if (internals.destroyed)
</span><span class="cx">                 return;
</span><span class="cx">             mainThreadWork(internals.client);
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiAsyncFileStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/AsyncFileStream.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/AsyncFileStream.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/fileapi/AsyncFileStream.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void start();
</span><del>-    void perform(std::function&lt;std::function&lt;void(FileStreamClient&amp;)&gt;(FileStream&amp;)&gt;);
</del><ins>+    void perform(std::function&lt;std::function&lt;void(FileStreamClient&amp;)&gt;(FileStream&amp;)&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     struct Internals;
</span><span class="cx">     std::unique_ptr&lt;Internals&gt; m_internals;
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiThreadableBlobRegistrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -117,10 +117,8 @@
</span><span class="cx">         blobRegistry().registerFileBlobURL(url, BlobDataFileReference::create(path), contentType);
</span><span class="cx">     else {
</span><span class="cx">         // BlobRegistryContext performs an isolated copy of data.
</span><del>-        BlobRegistryContext* context = new BlobRegistryContext(url, path, contentType);
-        callOnMainThread([context] {
-            std::unique_ptr&lt;BlobRegistryContext&gt; blobRegistryContext(context);
-            blobRegistry().registerFileBlobURL(blobRegistryContext-&gt;url, BlobDataFileReference::create(blobRegistryContext-&gt;path), blobRegistryContext-&gt;contentType);
</del><ins>+        callOnMainThread([context = std::make_unique&lt;BlobRegistryContext&gt;(url, path, contentType)] {
+            blobRegistry().registerFileBlobURL(context-&gt;url, BlobDataFileReference::create(context-&gt;path), context-&gt;contentType);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -131,10 +129,8 @@
</span><span class="cx">         blobRegistry().registerBlobURL(url, WTFMove(blobParts), contentType);
</span><span class="cx">     else {
</span><span class="cx">         // BlobRegistryContext performs an isolated copy of data.
</span><del>-        BlobRegistryContext* context = new BlobRegistryContext(url, WTFMove(blobParts), contentType);
-        callOnMainThread([context] {
-            std::unique_ptr&lt;BlobRegistryContext&gt; blobRegistryContext(context);
-            blobRegistry().registerBlobURL(blobRegistryContext-&gt;url, WTFMove(blobRegistryContext-&gt;blobParts), blobRegistryContext-&gt;contentType);
</del><ins>+        callOnMainThread([context = std::make_unique&lt;BlobRegistryContext&gt;(url, WTFMove(blobParts), contentType)] {
+            blobRegistry().registerBlobURL(context-&gt;url, WTFMove(context-&gt;blobParts), context-&gt;contentType);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -149,10 +145,8 @@
</span><span class="cx">         blobRegistry().registerBlobURL(url, srcURL);
</span><span class="cx">     else {
</span><span class="cx">         // BlobRegistryContext performs an isolated copy of data.
</span><del>-        BlobRegistryContext* context = new BlobRegistryContext(url, srcURL);
-        callOnMainThread([context] {
-            std::unique_ptr&lt;BlobRegistryContext&gt; blobRegistryContext(context);
-            blobRegistry().registerBlobURL(blobRegistryContext-&gt;url, blobRegistryContext-&gt;srcURL);
</del><ins>+        callOnMainThread([context = std::make_unique&lt;BlobRegistryContext&gt;(url, srcURL)] {
+            blobRegistry().registerBlobURL(context-&gt;url, context-&gt;srcURL);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -178,10 +172,8 @@
</span><span class="cx">         blobRegistry().registerBlobURLForSlice(newURL, srcURL, start, end);
</span><span class="cx">     else {
</span><span class="cx">         // BlobRegistryContext performs an isolated copy of data.
</span><del>-        BlobRegistryContext* context = new BlobRegistryContext(newURL, srcURL);
-        callOnMainThread([context, start, end] {
-            std::unique_ptr&lt;BlobRegistryContext&gt; blobRegistryContext(context);
-            blobRegistry().registerBlobURLForSlice(blobRegistryContext-&gt;url, blobRegistryContext-&gt;srcURL, start, end);
</del><ins>+        callOnMainThread([context = std::make_unique&lt;BlobRegistryContext&gt;(newURL, srcURL), start, end] {
+            blobRegistry().registerBlobURLForSlice(context-&gt;url, context-&gt;srcURL, start, end);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -193,11 +185,9 @@
</span><span class="cx">         resultSize = blobRegistry().blobSize(url);
</span><span class="cx">     else {
</span><span class="cx">         // BlobRegistryContext performs an isolated copy of data.
</span><del>-        BlobRegistryContext* context = new BlobRegistryContext(url);
</del><span class="cx">         BinarySemaphore semaphore;
</span><del>-        callOnMainThread([context, &amp;semaphore, &amp;resultSize] {
-            std::unique_ptr&lt;BlobRegistryContext&gt; blobRegistryContext(context);
-            resultSize = blobRegistry().blobSize(blobRegistryContext-&gt;url);
</del><ins>+        callOnMainThread([context = std::make_unique&lt;BlobRegistryContext&gt;(url), &amp;semaphore, &amp;resultSize] {
+            resultSize = blobRegistry().blobSize(context-&gt;url);
</ins><span class="cx">             semaphore.signal();
</span><span class="cx">         });
</span><span class="cx">         semaphore.wait(std::numeric_limits&lt;double&gt;::max());
</span><span class="lines">@@ -214,10 +204,8 @@
</span><span class="cx">         blobRegistry().unregisterBlobURL(url);
</span><span class="cx">     else {
</span><span class="cx">         // BlobRegistryContext performs an isolated copy of data.
</span><del>-        BlobRegistryContext* context = new BlobRegistryContext(url);
-        callOnMainThread([context] {
-            std::unique_ptr&lt;BlobRegistryContext&gt; blobRegistryContext(context);
-            blobRegistry().unregisterBlobURL(blobRegistryContext-&gt;url);
</del><ins>+        callOnMainThread([context = std::make_unique&lt;BlobRegistryContext&gt;(url)] {
+            blobRegistry().unregisterBlobURL(context-&gt;url);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloadericonIconDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/icon/IconDatabase.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/icon/IconDatabase.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/loader/icon/IconDatabase.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -2090,10 +2090,9 @@
</span><span class="cx">     ASSERT_ICON_SYNC_THREAD();
</span><span class="cx">     ++m_mainThreadCallbackCount;
</span><span class="cx"> 
</span><del>-    String pageURLCopy = pageURL.isolatedCopy();
-    callOnMainThread([this, pageURLCopy] {
</del><ins>+    callOnMainThread([this, pageURL = pageURL.isolatedCopy()] {
</ins><span class="cx">         if (m_client)
</span><del>-            m_client-&gt;didImportIconURLForPageURL(pageURLCopy);
</del><ins>+            m_client-&gt;didImportIconURLForPageURL(pageURL);
</ins><span class="cx">         checkClosedAfterMainThreadCallback();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -2103,10 +2102,9 @@
</span><span class="cx">     ASSERT_ICON_SYNC_THREAD();
</span><span class="cx">     ++m_mainThreadCallbackCount;
</span><span class="cx"> 
</span><del>-    String pageURLCopy = pageURL.isolatedCopy();
-    callOnMainThread([this, pageURLCopy] {
</del><ins>+    callOnMainThread([this, pageURL = pageURL.isolatedCopy()] {
</ins><span class="cx">         if (m_client)
</span><del>-            m_client-&gt;didImportIconDataForPageURL(pageURLCopy);
</del><ins>+            m_client-&gt;didImportIconDataForPageURL(pageURL);
</ins><span class="cx">         checkClosedAfterMainThreadCallback();
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageResourceUsageThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ResourceUsageThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ResourceUsageThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/ResourceUsageThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -77,9 +77,9 @@
</span><span class="cx">         m_condition.wait(m_lock);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceUsageThread::notifyObservers(ResourceUsageData&amp; data)
</del><ins>+void ResourceUsageThread::notifyObservers(ResourceUsageData&amp;&amp; data)
</ins><span class="cx"> {
</span><del>-    callOnMainThread([data]() mutable {
</del><ins>+    callOnMainThread([data = WTFMove(data)]() mutable {
</ins><span class="cx">         Vector&lt;std::function&lt;void (const ResourceUsageData&amp;)&gt;&gt; functions;
</span><span class="cx">         
</span><span class="cx">         {
</span><span class="lines">@@ -117,7 +117,7 @@
</span><span class="cx"> 
</span><span class="cx">         ResourceUsageData data;
</span><span class="cx">         platformThreadBody(m_vm, data);
</span><del>-        notifyObservers(data);
</del><ins>+        notifyObservers(WTFMove(data));
</ins><span class="cx"> 
</span><span class="cx">         auto duration = std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(std::chrono::system_clock::now() - start);
</span><span class="cx">         auto difference = std::chrono::milliseconds(500) - duration;
</span></span></pre></div>
<a id="trunkSourceWebCorepageResourceUsageThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ResourceUsageThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ResourceUsageThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/ResourceUsageThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">     static ResourceUsageThread&amp; singleton();
</span><span class="cx"> 
</span><span class="cx">     void waitUntilObservers();
</span><del>-    void notifyObservers(ResourceUsageData&amp;);
</del><ins>+    void notifyObservers(ResourceUsageData&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void createThreadIfNeeded();
</span><span class="cx">     static void threadCallback(void* scrollingThread);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -45,22 +45,22 @@
</span><span class="cx">     return threadIdentifier &amp;&amp; currentThread() == threadIdentifier;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScrollingThread::dispatch(std::function&lt;void ()&gt; function)
</del><ins>+void ScrollingThread::dispatch(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     auto&amp; scrollingThread = ScrollingThread::singleton();
</span><span class="cx">     scrollingThread.createThreadIfNeeded();
</span><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         std::lock_guard&lt;Lock&gt; lock(scrollingThread.m_functionsMutex);
</span><del>-        scrollingThread.m_functions.append(function);
</del><ins>+        scrollingThread.m_functions.append(WTFMove(function));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     scrollingThread.wakeUpRunLoop();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScrollingThread::dispatchBarrier(std::function&lt;void ()&gt; function)
</del><ins>+void ScrollingThread::dispatchBarrier(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><del>-    dispatch([function]() mutable {
</del><ins>+    dispatch([function = WTFMove(function)]() mutable {
</ins><span class="cx">         callOnMainThread(WTFMove(function));
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isCurrentThread());
</span><span class="cx"> 
</span><del>-    Vector&lt;std::function&lt;void ()&gt;&gt; functions;
</del><ins>+    Vector&lt;NoncopyableFunction&gt; functions;
</ins><span class="cx">     
</span><span class="cx">     {
</span><span class="cx">         std::lock_guard&lt;Lock&gt; lock(m_functionsMutex);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/ScrollingThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/Threading.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -47,11 +48,11 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     static bool isCurrentThread();
</span><del>-    WEBCORE_EXPORT static void dispatch(std::function&lt;void ()&gt;);
</del><ins>+    WEBCORE_EXPORT static void dispatch(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // Will dispatch the given function on the main thread once all pending functions
</span><span class="cx">     // on the scrolling thread have finished executing. Used for synchronization purposes.
</span><del>-    WEBCORE_EXPORT static void dispatchBarrier(std::function&lt;void ()&gt;);
</del><ins>+    WEBCORE_EXPORT static void dispatchBarrier(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     friend NeverDestroyed&lt;ScrollingThread&gt;;
</span><span class="lines">@@ -79,7 +80,7 @@
</span><span class="cx">     Lock m_initializeRunLoopMutex;
</span><span class="cx"> 
</span><span class="cx">     Lock m_functionsMutex;
</span><del>-    Vector&lt;std::function&lt;void ()&gt;&gt; m_functions;
</del><ins>+    Vector&lt;NoncopyableFunction&gt; m_functions;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     // FIXME: We should use WebCore::RunLoop here.
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingiosScrollingTreeIOScpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -67,9 +67,7 @@
</span><span class="cx">     // Since this can potentially be the last reference to the scrolling coordinator,
</span><span class="cx">     // we need to release it on the main thread since it has member variables (such as timers)
</span><span class="cx">     // that expect to be destroyed from the main thread.
</span><del>-    ScrollingCoordinator* scrollingCoordinator = m_scrollingCoordinator.release().leakRef();
-    callOnMainThread([scrollingCoordinator] {
-        scrollingCoordinator-&gt;deref();
</del><ins>+    callOnMainThread([scrollingCoordinator = WTFMove(m_scrollingCoordinator)] {
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -86,10 +84,7 @@
</span><span class="cx">     if (nodeID == rootNode()-&gt;scrollingNodeID())
</span><span class="cx">         setMainFrameScrollPosition(scrollPosition);
</span><span class="cx"> 
</span><del>-    RefPtr&lt;AsyncScrollingCoordinator&gt; scrollingCoordinator = m_scrollingCoordinator;
-    bool localIsHandlingProgrammaticScroll = isHandlingProgrammaticScroll();
-
-    callOnMainThread([scrollingCoordinator, nodeID, scrollPosition, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction] {
</del><ins>+    callOnMainThread([scrollingCoordinator = m_scrollingCoordinator, nodeID, scrollPosition, localIsHandlingProgrammaticScroll = isHandlingProgrammaticScroll(), scrollingLayerPositionAction] {
</ins><span class="cx">         scrollingCoordinator-&gt;scheduleUpdateScrollPositionAfterAsyncScroll(nodeID, scrollPosition, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction);
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -123,8 +118,7 @@
</span><span class="cx">     if (!m_scrollingCoordinator)
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    RefPtr&lt;AsyncScrollingCoordinator&gt; scrollingCoordinator = m_scrollingCoordinator;
-    callOnMainThread([scrollingCoordinator, nodeID, horizontal, vertical] {
</del><ins>+    callOnMainThread([scrollingCoordinator = m_scrollingCoordinator, nodeID, horizontal, vertical] {
</ins><span class="cx">         scrollingCoordinator-&gt;setActiveScrollSnapIndices(nodeID, horizontal, vertical);
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingmacScrollingTreeFrameScrollingNodeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -75,11 +75,7 @@
</span><span class="cx">     if (m_verticalScrollerImp || m_horizontalScrollerImp) {
</span><span class="cx">         // FIXME: This is a workaround in place for the time being since NSScrollerImps cannot be deallocated
</span><span class="cx">         // on a non-main thread. rdar://problem/24535055
</span><del>-        NSScrollerImp *retainedVerticalScrollerImp = m_verticalScrollerImp.leakRef();
-        NSScrollerImp *retainedHorizontalScrollerImp = m_horizontalScrollerImp.leakRef();
-        WTF::callOnMainThread([retainedVerticalScrollerImp, retainedHorizontalScrollerImp] {
-            [retainedVerticalScrollerImp release];
-            [retainedHorizontalScrollerImp release];
</del><ins>+        WTF::callOnMainThread([verticalScrollerImp = WTFMove(m_verticalScrollerImp), horizontalScrollerImp = WTFMove(m_horizontalScrollerImp)] {
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformMemoryPressureHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/MemoryPressureHandler.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -172,7 +172,9 @@
</span><span class="cx">         // FastMalloc has lock-free thread specific caches that can only be cleared from the thread itself.
</span><span class="cx">         WorkerThread::releaseFastMallocFreeMemoryInAllThreads();
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING) &amp;&amp; !PLATFORM(IOS)
</span><del>-        ScrollingThread::dispatch(WTF::releaseFastMallocFreeMemory);
</del><ins>+        ScrollingThread::dispatch([]() {
+            WTF::releaseFastMallocFreeMemory();
+        });
</ins><span class="cx"> #endif
</span><span class="cx">         WTF::releaseFastMallocFreeMemory();
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioiosMediaSessionManagerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -396,10 +396,7 @@
</span><span class="cx">     LOG(Media, &quot;-[WebMediaSessionHelper dealloc]&quot;);
</span><span class="cx"> 
</span><span class="cx">     if (!isMainThread()) {
</span><del>-        auto volumeView = WTFMove(_volumeView);
-        auto routingController = WTFMove(_airPlayPresenceRoutingController);
-
-        callOnMainThread([volumeView, routingController] () mutable {
</del><ins>+        callOnMainThread([volumeView = WTFMove(_volumeView), routingController = WTFMove(_airPlayPresenceRoutingController)] () mutable {
</ins><span class="cx">             LOG(Media, &quot;-[WebMediaSessionHelper dealloc] - dipatched to MainThread&quot;);
</span><span class="cx"> 
</span><span class="cx">             volumeView.clear();
</span><span class="lines">@@ -435,15 +432,14 @@
</span><span class="cx"> 
</span><span class="cx">     LOG(Media, &quot;-[WebMediaSessionHelper startMonitoringAirPlayRoutes]&quot;);
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebMediaSessionHelper&gt; strongSelf = self;
-    callOnMainThread([strongSelf] () {
</del><ins>+    callOnMainThread([protectedSelf = RetainPtr&lt;WebMediaSessionHelper&gt;(self)] () {
</ins><span class="cx">         LOG(Media, &quot;-[WebMediaSessionHelper startMonitoringAirPlayRoutes] - dipatched to MainThread&quot;);
</span><span class="cx"> 
</span><del>-        if (strongSelf-&gt;_airPlayPresenceRoutingController)
</del><ins>+        if (protectedSelf-&gt;_airPlayPresenceRoutingController)
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        strongSelf-&gt;_airPlayPresenceRoutingController = adoptNS([allocMPAVRoutingControllerInstance() initWithName:@&quot;WebCore - HTML media element checking for AirPlay route presence&quot;]);
-        [strongSelf-&gt;_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModePresence];
</del><ins>+        protectedSelf-&gt;_airPlayPresenceRoutingController = adoptNS([allocMPAVRoutingControllerInstance() initWithName:@&quot;WebCore - HTML media element checking for AirPlay route presence&quot;]);
+        [protectedSelf-&gt;_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModePresence];
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -454,15 +450,14 @@
</span><span class="cx"> 
</span><span class="cx">     LOG(Media, &quot;-[WebMediaSessionHelper stopMonitoringAirPlayRoutes]&quot;);
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebMediaSessionHelper&gt; strongSelf = self;
-    callOnMainThread([strongSelf] () {
</del><ins>+    callOnMainThread([protectedSelf = RetainPtr&lt;WebMediaSessionHelper&gt;(self)] () {
</ins><span class="cx">         LOG(Media, &quot;-[WebMediaSessionHelper stopMonitoringAirPlayRoutes] - dipatched to MainThread&quot;);
</span><span class="cx"> 
</span><del>-        if (!strongSelf-&gt;_airPlayPresenceRoutingController)
</del><ins>+        if (!protectedSelf-&gt;_airPlayPresenceRoutingController)
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        [strongSelf-&gt;_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModeDisabled];
-        strongSelf-&gt;_airPlayPresenceRoutingController = nil;
</del><ins>+        [protectedSelf-&gt;_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModeDisabled];
+        protectedSelf-&gt;_airPlayPresenceRoutingController = nil;
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationAudioSourceProviderAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -323,9 +323,8 @@
</span><span class="cx">     memset(m_list.get(), 0, bufferListSize);
</span><span class="cx">     m_list-&gt;mNumberBuffers = numberOfChannels;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;AudioSourceProviderAVFObjC&gt; strongThis = this;
-    callOnMainThread([strongThis, numberOfChannels, sampleRate] {
-        strongThis-&gt;m_client-&gt;setFormat(numberOfChannels, sampleRate);
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;AudioSourceProviderAVFObjC&gt;(*this), numberOfChannels, sampleRate] {
+        protectedThis-&gt;m_client-&gt;setFormat(numberOfChannels, sampleRate);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -806,8 +806,7 @@
</span><span class="cx">     if (delayDispatch &amp;&amp; !m_mainThreadCallPending) {
</span><span class="cx">         m_mainThreadCallPending = true;
</span><span class="cx"> 
</span><del>-        auto weakThis = createWeakPtr();
-        callOnMainThread([weakThis] {
</del><ins>+        callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx">             if (!weakThis)
</span><span class="cx">                 return;
</span><span class="cx"> 
</span><span class="lines">@@ -844,8 +843,7 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         if (!m_queuedNotifications.isEmpty() &amp;&amp; !m_mainThreadCallPending) {
</span><del>-            auto weakThis = createWeakPtr();
-            callOnMainThread([weakThis] {
</del><ins>+            callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx">                 if (!weakThis)
</span><span class="cx">                     return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcCDMSessionAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -84,10 +84,10 @@
</span><span class="cx">     if ([keyPath isEqualTo:@&quot;outputObscuredDueToInsufficientExternalProtection&quot;]) {
</span><span class="cx">         if ([[change valueForKey:NSKeyValueChangeNewKey] intValue] == 1) {
</span><span class="cx">             RetainPtr&lt;NSError&gt; error = [NSError errorWithDomain:@&quot;com.apple.WebKit&quot; code:'HDCP' userInfo:nil];
</span><del>-            RetainPtr&lt;WebCDMSessionAVFoundationObjCListener&gt; strongSelf = { self };
-            callOnMainThread([strongSelf, error] {
-                if (strongSelf-&gt;_parent)
-                    strongSelf-&gt;_parent-&gt;playerDidReceiveError(error.get());
</del><ins>+            RetainPtr&lt;WebCDMSessionAVFoundationObjCListener&gt; protectedSelf = { self };
+            callOnMainThread([protectedSelf = WTFMove(protectedSelf), error = WTFMove(error)] {
+                if (protectedSelf-&gt;_parent)
+                    protectedSelf-&gt;_parent-&gt;playerDidReceiveError(error.get());
</ins><span class="cx">             });
</span><span class="cx">         }
</span><span class="cx">     } else
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -185,16 +185,16 @@
</span><span class="cx">     if (![keyPath isEqualToString:externalOutputDeviceAvailableKeyName] &amp;&amp; ![keyPath isEqualToString:externalOutputDevicePickedKeyName])
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebAVOutputDeviceMenuControllerHelper&gt; strongSelf = self;
-    RetainPtr&lt;NSString&gt; strongKeyPath = keyPath;
-    callOnMainThread([strongSelf, strongKeyPath] {
-        MediaPlaybackTargetPickerMac* callback = strongSelf-&gt;m_callback;
</del><ins>+    RetainPtr&lt;WebAVOutputDeviceMenuControllerHelper&gt; protectedSelf = self;
+    RetainPtr&lt;NSString&gt; protectedKeyPath = keyPath;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedKeyPath = WTFMove(protectedKeyPath)] {
+        MediaPlaybackTargetPickerMac* callback = protectedSelf-&gt;m_callback;
</ins><span class="cx">         if (!callback)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        if ([strongKeyPath isEqualToString:externalOutputDeviceAvailableKeyName])
</del><ins>+        if ([protectedKeyPath isEqualToString:externalOutputDeviceAvailableKeyName])
</ins><span class="cx">             callback-&gt;availableDevicesDidChange();
</span><del>-        else if ([strongKeyPath isEqualToString:externalOutputDevicePickedKeyName])
</del><ins>+        else if ([protectedKeyPath isEqualToString:externalOutputDevicePickedKeyName])
</ins><span class="cx">             callback-&gt;currentDeviceDidChange();
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -701,8 +701,7 @@
</span><span class="cx">     if (!m_avPlayer || m_haveBeenAskedToCreateLayer)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    auto weakThis = createWeakPtr();
-    callOnMainThread([this, weakThis] {
</del><ins>+    callOnMainThread([this, weakThis = createWeakPtr()] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="lines">@@ -3441,15 +3440,15 @@
</span><span class="cx">     if (!m_callback)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebCoreAVFMovieObserver&gt; strongSelf = self;
-    RetainPtr&lt;NSArray&gt; strongStrings = strings;
-    RetainPtr&lt;NSArray&gt; strongSamples = nativeSamples;
-    callOnMainThread([strongSelf, strongStrings, strongSamples, itemTime] {
-        MediaPlayerPrivateAVFoundationObjC* callback = strongSelf-&gt;m_callback;
</del><ins>+    RetainPtr&lt;WebCoreAVFMovieObserver&gt; protectedSelf = self;
+    RetainPtr&lt;NSArray&gt; protectedStrings = strings;
+    RetainPtr&lt;NSArray&gt; protectedNativeSamples = nativeSamples;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedStrings = WTFMove(protectedStrings), protectedNativeSamples = WTFMove(protectedNativeSamples), itemTime] {
+        MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf-&gt;m_callback;
</ins><span class="cx">         if (!callback)
</span><span class="cx">             return;
</span><span class="cx">         MediaTime time = std::max(toMediaTime(itemTime), MediaTime::zeroTime());
</span><del>-        callback-&gt;processCue(strongStrings.get(), strongSamples.get(), time);
</del><ins>+        callback-&gt;processCue(protectedStrings.get(), protectedNativeSamples.get(), time);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3460,9 +3459,8 @@
</span><span class="cx">     if (!m_callback)
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    RetainPtr&lt;WebCoreAVFMovieObserver&gt; strongSelf = self;
-    callOnMainThread([strongSelf] {
-        if (MediaPlayerPrivateAVFoundationObjC* callback = strongSelf-&gt;m_callback)
</del><ins>+    callOnMainThread([protectedSelf = RetainPtr&lt;WebCoreAVFMovieObserver&gt;(self)] {
+        if (MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf-&gt;m_callback)
</ins><span class="cx">             callback-&gt;flushCues();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -3488,17 +3486,17 @@
</span><span class="cx">     if (!m_callback)
</span><span class="cx">         return NO;
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebCoreAVFLoaderDelegate&gt; strongSelf = self;
-    RetainPtr&lt;AVAssetResourceLoadingRequest&gt; strongRequest = loadingRequest;
-    callOnMainThread([strongSelf, strongRequest] {
-        MediaPlayerPrivateAVFoundationObjC* callback = strongSelf-&gt;m_callback;
</del><ins>+    RetainPtr&lt;WebCoreAVFLoaderDelegate&gt; protectedSelf = self;
+    RetainPtr&lt;AVAssetResourceLoadingRequest&gt; protectedLoadingRequest = loadingRequest;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedLoadingRequest = WTFMove(protectedLoadingRequest)] {
+        MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf-&gt;m_callback;
</ins><span class="cx">         if (!callback) {
</span><del>-            [strongRequest finishLoadingWithError:nil];
</del><ins>+            [protectedLoadingRequest finishLoadingWithError:nil];
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!callback-&gt;shouldWaitForLoadingOfResource(strongRequest.get()))
-            [strongRequest finishLoadingWithError:nil];
</del><ins>+        if (!callback-&gt;shouldWaitForLoadingOfResource(protectedLoadingRequest.get()))
+            [protectedLoadingRequest finishLoadingWithError:nil];
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     return YES;
</span><span class="lines">@@ -3513,17 +3511,17 @@
</span><span class="cx">     if ([[[challenge protectionSpace] authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust])
</span><span class="cx">         return NO;
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebCoreAVFLoaderDelegate&gt; strongSelf = self;
-    RetainPtr&lt;NSURLAuthenticationChallenge&gt; strongChallenge = challenge;
-    callOnMainThread([strongSelf, strongChallenge] {
-        MediaPlayerPrivateAVFoundationObjC* callback = strongSelf-&gt;m_callback;
</del><ins>+    RetainPtr&lt;WebCoreAVFLoaderDelegate&gt; protectedSelf = self;
+    RetainPtr&lt;NSURLAuthenticationChallenge&gt; protectedChallenge = challenge;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedChallenge = WTFMove(protectedChallenge)] {
+        MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf-&gt;m_callback;
</ins><span class="cx">         if (!callback) {
</span><del>-            [[strongChallenge sender] cancelAuthenticationChallenge:strongChallenge.get()];
</del><ins>+            [[protectedChallenge sender] cancelAuthenticationChallenge:protectedChallenge.get()];
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!callback-&gt;shouldWaitForResponseToAuthenticationChallenge(strongChallenge.get()))
-            [[strongChallenge sender] cancelAuthenticationChallenge:strongChallenge.get()];
</del><ins>+        if (!callback-&gt;shouldWaitForResponseToAuthenticationChallenge(protectedChallenge.get()))
+            [[protectedChallenge sender] cancelAuthenticationChallenge:protectedChallenge.get()];
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     return YES;
</span><span class="lines">@@ -3535,12 +3533,12 @@
</span><span class="cx">     if (!m_callback)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebCoreAVFLoaderDelegate&gt; strongSelf = self;
-    RetainPtr&lt;AVAssetResourceLoadingRequest&gt; strongRequest = loadingRequest;
-    callOnMainThread([strongSelf, strongRequest] {
-        MediaPlayerPrivateAVFoundationObjC* callback = strongSelf-&gt;m_callback;
</del><ins>+    RetainPtr&lt;WebCoreAVFLoaderDelegate&gt; protectedSelf = self;
+    RetainPtr&lt;AVAssetResourceLoadingRequest&gt; protectedLoadingRequest = loadingRequest;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedLoadingRequest = WTFMove(protectedLoadingRequest)] {
+        MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf-&gt;m_callback;
</ins><span class="cx">         if (callback)
</span><del>-            callback-&gt;didCancelLoadingRequest(strongRequest.get());
</del><ins>+            callback-&gt;didCancelLoadingRequest(protectedLoadingRequest.get());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -129,8 +129,7 @@
</span><span class="cx"> static void CMTimebaseEffectiveRateChangedCallback(CMNotificationCenterRef, const void *listener, CFStringRef, const void *, CFTypeRef)
</span><span class="cx"> {
</span><span class="cx">     MediaPlayerPrivateMediaSourceAVFObjC* player = (MediaPlayerPrivateMediaSourceAVFObjC*)listener;
</span><del>-    auto weakThis = player-&gt;createWeakPtr();
-    callOnMainThread([weakThis]{
</del><ins>+    callOnMainThread([weakThis = player-&gt;createWeakPtr()] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx">         weakThis.get()-&gt;effectiveRateChanged();
</span><span class="lines">@@ -312,8 +311,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateMediaSourceAVFObjC::play()
</span><span class="cx"> {
</span><del>-    auto weakThis = createWeakPtr();
-    callOnMainThread([weakThis]{
</del><ins>+    callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx">         weakThis.get()-&gt;playInternal();
</span><span class="lines">@@ -332,8 +330,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateMediaSourceAVFObjC::pause()
</span><span class="cx"> {
</span><del>-    auto weakThis = createWeakPtr();
-    callOnMainThread([weakThis]{
</del><ins>+    callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx">         weakThis.get()-&gt;pauseInternal();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;MediaPlayerPrivate.h&quot;
</span><span class="cx"> #include &quot;MediaStreamPrivate.h&quot;
</span><span class="cx"> #include &lt;wtf/MediaTime.h&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> #include &lt;wtf/WeakPtr.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -142,7 +143,7 @@
</span><span class="cx">     void updateTracks();
</span><span class="cx">     void renderingModeChanged();
</span><span class="cx"> 
</span><del>-    void scheduleDeferredTask(std::function&lt;void()&gt;);
</del><ins>+    void scheduleDeferredTask(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     enum DisplayMode {
</span><span class="cx">         None,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -624,11 +624,10 @@
</span><span class="cx">     m_player-&gt;networkStateChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask(std::function&lt;void()&gt; function)
</del><ins>+void MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(function);
</span><del>-    auto weakThis = createWeakPtr();
-    callOnMainThread([weakThis, function] {
</del><ins>+    callOnMainThread([weakThis = createWeakPtr(), function = WTFMove(function)] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcSourceBufferPrivateAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -179,12 +179,12 @@
</span><span class="cx">     UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(streamDataParser == _parser);
</span><del>-    RetainPtr&lt;WebAVStreamDataParserListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVStreamDataParserListener&gt; protectedSelf = self;
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;AVAsset*&gt; strongAsset = asset;
-    callOnMainThread([strongSelf, strongAsset] {
-        if (strongSelf-&gt;_parent)
-            strongSelf-&gt;_parent-&gt;didParseStreamDataAsAsset(strongAsset.get());
</del><ins>+    RetainPtr&lt;AVAsset*&gt; protectedAsset = asset;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedAsset = WTFMove(protectedAsset)] {
+        if (protectedSelf-&gt;_parent)
+            protectedSelf-&gt;_parent-&gt;didParseStreamDataAsAsset(protectedAsset.get());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -195,12 +195,12 @@
</span><span class="cx">     UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(streamDataParser == _parser);
</span><del>-    RetainPtr&lt;WebAVStreamDataParserListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVStreamDataParserListener&gt; protectedSelf = self;
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;AVAsset*&gt; strongAsset = asset;
-    callOnMainThread([strongSelf, strongAsset] {
-        if (strongSelf-&gt;_parent)
-            strongSelf-&gt;_parent-&gt;didParseStreamDataAsAsset(strongAsset.get());
</del><ins>+    RetainPtr&lt;AVAsset*&gt; protectedAsset = asset;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedAsset = WTFMove(protectedAsset)] {
+        if (protectedSelf-&gt;_parent)
+            protectedSelf-&gt;_parent-&gt;didParseStreamDataAsAsset(protectedAsset.get());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -210,12 +210,12 @@
</span><span class="cx">     UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(streamDataParser == _parser);
</span><del>-    RetainPtr&lt;WebAVStreamDataParserListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVStreamDataParserListener&gt; protectedSelf = self;
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;NSError&gt; strongError = error;
-    callOnMainThread([strongSelf, strongError] {
-        if (strongSelf-&gt;_parent)
-            strongSelf-&gt;_parent-&gt;didFailToParseStreamDataWithError(strongError.get());
</del><ins>+    RetainPtr&lt;NSError&gt; protectedError = error;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedError = WTFMove(protectedError)] {
+        if (protectedSelf-&gt;_parent)
+            protectedSelf-&gt;_parent-&gt;didFailToParseStreamDataWithError(protectedError.get());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -225,13 +225,13 @@
</span><span class="cx">     UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(streamDataParser == _parser);
</span><del>-    RetainPtr&lt;WebAVStreamDataParserListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVStreamDataParserListener&gt; protectedSelf = self;
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;CMSampleBufferRef&gt; strongSample = sample;
</del><ins>+    RetainPtr&lt;CMSampleBufferRef&gt; protectedSample = sample;
</ins><span class="cx">     String mediaType = nsMediaType;
</span><del>-    callOnMainThread([strongSelf, strongSample, trackID, mediaType, flags] {
-        if (strongSelf-&gt;_parent)
-            strongSelf-&gt;_parent-&gt;didProvideMediaDataForTrackID(trackID, strongSample.get(), mediaType, flags);
</del><ins>+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedSample = WTFMove(protectedSample), trackID, mediaType, flags] {
+        if (protectedSelf-&gt;_parent)
+            protectedSelf-&gt;_parent-&gt;didProvideMediaDataForTrackID(trackID, protectedSample.get(), mediaType, flags);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -241,12 +241,12 @@
</span><span class="cx">     UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(streamDataParser == _parser);
</span><del>-    RetainPtr&lt;WebAVStreamDataParserListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVStreamDataParserListener&gt; protectedSelf = self;
</ins><span class="cx"> 
</span><span class="cx">     String mediaType = nsMediaType;
</span><del>-    callOnMainThread([strongSelf, trackID, mediaType] {
-        if (strongSelf-&gt;_parent)
-            strongSelf-&gt;_parent-&gt;didReachEndOfTrackWithTrackID(trackID, mediaType);
</del><ins>+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), trackID, mediaType] {
+        if (protectedSelf-&gt;_parent)
+            protectedSelf-&gt;_parent-&gt;didReachEndOfTrackWithTrackID(trackID, mediaType);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -272,13 +272,12 @@
</span><span class="cx">     UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(streamDataParser == _parser);
</span><del>-    RetainPtr&lt;WebAVStreamDataParserListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVStreamDataParserListener&gt; protectedSelf = self;
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;NSData&gt; strongData = initData;
</del><span class="cx">     OSObjectPtr&lt;dispatch_semaphore_t&gt; hasSessionSemaphore = adoptOSObject(dispatch_semaphore_create(0));
</span><del>-    callOnMainThread([strongSelf, strongData, trackID,  hasSessionSemaphore] {
-        if (strongSelf-&gt;_parent)
-            strongSelf-&gt;_parent-&gt;didProvideContentKeyRequestInitializationDataForTrackID(strongData.get(), trackID, hasSessionSemaphore);
</del><ins>+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedInitData = RetainPtr&lt;NSData&gt;(initData), trackID, hasSessionSemaphore = WTFMove(hasSessionSemaphore)] {
+        if (protectedSelf-&gt;_parent)
+            protectedSelf-&gt;_parent-&gt;didProvideContentKeyRequestInitializationDataForTrackID(protectedInitData.get(), trackID, hasSessionSemaphore);
</ins><span class="cx">     });
</span><span class="cx">     dispatch_semaphore_wait(hasSessionSemaphore.get(), DISPATCH_TIME_FOREVER);
</span><span class="cx"> }
</span><span class="lines">@@ -382,21 +381,21 @@
</span><span class="cx">     UNUSED_PARAM(keyPath);
</span><span class="cx">     ASSERT(_parent);
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebAVSampleBufferErrorListener&gt; strongSelf = self;
</del><ins>+    RetainPtr&lt;WebAVSampleBufferErrorListener&gt; protectedSelf = self;
</ins><span class="cx">     if ([object isKindOfClass:getAVSampleBufferDisplayLayerClass()]) {
</span><span class="cx">         RetainPtr&lt;AVSampleBufferDisplayLayer&gt; layer = (AVSampleBufferDisplayLayer *)object;
</span><span class="cx">         ASSERT(_layers.contains(layer.get()));
</span><span class="cx"> 
</span><span class="cx">         if ([keyPath isEqualTo:@&quot;error&quot;]) {
</span><span class="cx">             RetainPtr&lt;NSError&gt; error = [change valueForKey:NSKeyValueChangeNewKey];
</span><del>-            callOnMainThread([strongSelf, layer, error] {
-                strongSelf-&gt;_parent-&gt;layerDidReceiveError(layer.get(), error.get());
</del><ins>+            callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
+                protectedSelf-&gt;_parent-&gt;layerDidReceiveError(layer.get(), error.get());
</ins><span class="cx">             });
</span><span class="cx">         } else if ([keyPath isEqualTo:@&quot;outputObscuredDueToInsufficientExternalProtection&quot;]) {
</span><span class="cx">             if ([[change valueForKey:NSKeyValueChangeNewKey] boolValue]) {
</span><span class="cx">                 RetainPtr&lt;NSError&gt; error = [NSError errorWithDomain:@&quot;com.apple.WebKit&quot; code:'HDCP' userInfo:nil];
</span><del>-                callOnMainThread([strongSelf, layer, error] {
-                    strongSelf-&gt;_parent-&gt;layerDidReceiveError(layer.get(), error.get());
</del><ins>+                callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
+                    protectedSelf-&gt;_parent-&gt;layerDidReceiveError(layer.get(), error.get());
</ins><span class="cx">                 });
</span><span class="cx">             }
</span><span class="cx">         } else
</span><span class="lines">@@ -409,8 +408,8 @@
</span><span class="cx">         ASSERT(_renderers.contains(renderer.get()));
</span><span class="cx">         ASSERT([keyPath isEqualTo:@&quot;error&quot;]);
</span><span class="cx"> 
</span><del>-        callOnMainThread([strongSelf, renderer, error] {
-            strongSelf-&gt;_parent-&gt;rendererDidReceiveError(renderer.get(), error.get());
</del><ins>+        callOnMainThread([protectedSelf = WTFMove(protectedSelf), renderer = WTFMove(renderer), error = WTFMove(error)] {
+            protectedSelf-&gt;_parent-&gt;rendererDidReceiveError(renderer.get(), error.get());
</ins><span class="cx">         });
</span><span class="cx">     } else
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -421,11 +420,11 @@
</span><span class="cx">     RetainPtr&lt;AVSampleBufferDisplayLayer&gt; layer = (AVSampleBufferDisplayLayer *)[note object];
</span><span class="cx">     RetainPtr&lt;NSError&gt; error = [[note userInfo] valueForKey:AVSampleBufferDisplayLayerFailedToDecodeNotificationErrorKey];
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebAVSampleBufferErrorListener&gt; strongSelf = self;
-    callOnMainThread([strongSelf, layer, error] {
-        if (!strongSelf-&gt;_parent || !strongSelf-&gt;_layers.contains(layer.get()))
</del><ins>+    RetainPtr&lt;WebAVSampleBufferErrorListener&gt; protectedSelf = self;
+    callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
+        if (!protectedSelf-&gt;_parent || !protectedSelf-&gt;_layers.contains(layer.get()))
</ins><span class="cx">             return;
</span><del>-        strongSelf-&gt;_parent-&gt;layerDidReceiveError(layer.get(), error.get());
</del><ins>+        protectedSelf-&gt;_parent-&gt;layerDidReceiveError(layer.get(), error.get());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -295,8 +295,7 @@
</span><span class="cx"> 
</span><span class="cx"> static void patternReleaseCallback(void* info)
</span><span class="cx"> {
</span><del>-    auto image = static_cast&lt;CGImageRef&gt;(info);
-    callOnMainThread([image] {
</del><ins>+    callOnMainThread([image = static_cast&lt;CGImageRef&gt;(info)] {
</ins><span class="cx">         CGImageRelease(image);
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgPatternCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -56,9 +56,7 @@
</span><span class="cx"> 
</span><span class="cx"> static void patternReleaseCallback(void* info)
</span><span class="cx"> {
</span><del>-    auto image = static_cast&lt;CGImageRef&gt;(info);
-
-    callOnMainThread([image] {
</del><ins>+    callOnMainThread([image = static_cast&lt;CGImageRef&gt;(info)] {
</ins><span class="cx">         CGImageRelease(image);
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswinMediaPlayerPrivateMediaFoundationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -486,8 +486,7 @@
</span><span class="cx">     hr = asyncResult-&gt;GetStatus();
</span><span class="cx">     m_loadingProgress = SUCCEEDED(hr);
</span><span class="cx"> 
</span><del>-    auto weakPtr = m_weakPtrFactory.createWeakPtr();
-    callOnMainThread([weakPtr] {
</del><ins>+    callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx">         if (!weakPtr)
</span><span class="cx">             return;
</span><span class="cx">         weakPtr-&gt;onCreatedMediaSource();
</span><span class="lines">@@ -516,8 +515,7 @@
</span><span class="cx"> 
</span><span class="cx">     switch (mediaEventType) {
</span><span class="cx">     case MESessionTopologySet: {
</span><del>-        auto weakPtr = m_weakPtrFactory.createWeakPtr();
-        callOnMainThread([weakPtr] {
</del><ins>+        callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx">             if (!weakPtr)
</span><span class="cx">                 return;
</span><span class="cx">             weakPtr-&gt;onTopologySet();
</span><span class="lines">@@ -526,8 +524,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     case MEBufferingStarted: {
</span><del>-        auto weakPtr = m_weakPtrFactory.createWeakPtr();
-        callOnMainThread([weakPtr] {
</del><ins>+        callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx">             if (!weakPtr)
</span><span class="cx">                 return;
</span><span class="cx">             weakPtr-&gt;onBufferingStarted();
</span><span class="lines">@@ -536,8 +533,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     case MEBufferingStopped: {
</span><del>-        auto weakPtr = m_weakPtrFactory.createWeakPtr();
-        callOnMainThread([weakPtr] {
</del><ins>+        callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx">             if (!weakPtr)
</span><span class="cx">                 return;
</span><span class="cx">             weakPtr-&gt;onBufferingStopped();
</span><span class="lines">@@ -546,8 +542,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     case MESessionEnded: {
</span><del>-        auto weakPtr = m_weakPtrFactory.createWeakPtr();
-        callOnMainThread([weakPtr] {
</del><ins>+        callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx">             if (!weakPtr)
</span><span class="cx">                 return;
</span><span class="cx">             weakPtr-&gt;onSessionEnded();
</span><span class="lines">@@ -1675,8 +1670,7 @@
</span><span class="cx">     
</span><span class="cx">     // Invalidate the video area
</span><span class="cx">     if (m_mediaPlayer) {
</span><del>-        auto weakPtr = m_mediaPlayer-&gt;m_weakPtrFactory.createWeakPtr();
-        callOnMainThread([weakPtr] {
</del><ins>+        callOnMainThread([weakPtr = m_mediaPlayer-&gt;m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx">             if (weakPtr)
</span><span class="cx">                 weakPtr-&gt;invalidateFrameView();
</span><span class="cx">         });
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -299,11 +299,10 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaStreamPrivate::scheduleDeferredTask(std::function&lt;void()&gt; function)
</del><ins>+void MediaStreamPrivate::scheduleDeferredTask(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(function);
</span><del>-    auto weakThis = createWeakPtr();
-    callOnMainThread([weakThis, function] {
</del><ins>+    callOnMainThread([weakThis = createWeakPtr(), function = WTFMove(function)] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;MediaStreamTrackPrivate.h&quot;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/MediaTime.h&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="lines">@@ -111,7 +112,7 @@
</span><span class="cx">     void characteristicsChanged();
</span><span class="cx">     void updateActiveVideoTrack();
</span><span class="cx"> 
</span><del>-    void scheduleDeferredTask(std::function&lt;void()&gt;);
</del><ins>+    void scheduleDeferredTask(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     WeakPtrFactory&lt;MediaStreamPrivate&gt; m_weakPtrFactory;
</span><span class="cx">     Vector&lt;Observer*&gt; m_observers;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;GenericTaskQueue.h&quot;
</span><span class="cx"> #include &quot;RealtimeMediaSource.h&quot;
</span><span class="cx"> #include &quot;Timer.h&quot;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/WeakPtr.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -85,7 +86,7 @@
</span><span class="cx">     void setVideoSampleBufferDelegate(AVCaptureVideoDataOutput*);
</span><span class="cx">     void setAudioSampleBufferDelegate(AVCaptureAudioDataOutput*);
</span><span class="cx"> 
</span><del>-    void scheduleDeferredTask(std::function&lt;void ()&gt;);
</del><ins>+    void scheduleDeferredTask(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void setupSession();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourcemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -240,12 +240,10 @@
</span><span class="cx">     [audioOutput setSampleBufferDelegate:m_objcObserver.get() queue:globaAudioCaptureSerialQueue()];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AVMediaCaptureSource::scheduleDeferredTask(std::function&lt;void ()&gt; function)
</del><ins>+void AVMediaCaptureSource::scheduleDeferredTask(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(function);
</span><del>-
-    auto weakThis = createWeakPtr();
-    callOnMainThread([weakThis, function] {
</del><ins>+    callOnMainThread([weakThis = createWeakPtr(), function = WTFMove(function)] {
</ins><span class="cx">         if (!weakThis)
</span><span class="cx">             return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -163,10 +163,9 @@
</span><span class="cx"> bool RealtimeMediaSourceCenterMac::getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; prpClient)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; requestClient = prpClient;
</span><del>-
</del><span class="cx">     TrackSourceInfoVector sources = AVCaptureDeviceManager::singleton().getSourcesInfo(requestClient-&gt;requestOrigin());
</span><span class="cx"> 
</span><del>-    callOnMainThread([this, requestClient, sources] {
</del><ins>+    callOnMainThread([this, requestClient = WTFMove(requestClient), sources = WTFMove(sources)] {
</ins><span class="cx">         requestClient-&gt;didCompleteTrackSourceInfoRequest(sources);
</span><span class="cx">     });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacWebAudioSourceProviderAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -214,10 +214,10 @@
</span><span class="cx">     memset(m_list.get(), 0, m_listBufferSize);
</span><span class="cx">     m_list-&gt;mNumberBuffers = numberOfChannels;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;WebAudioSourceProviderAVFObjC&gt; strongThis = this;
-    callOnMainThread([strongThis, numberOfChannels, sampleRate] {
-        if (strongThis-&gt;m_client)
-            strongThis-&gt;m_client-&gt;setFormat(numberOfChannels, sampleRate);
</del><ins>+    RefPtr&lt;WebAudioSourceProviderAVFObjC&gt; protectedThis = this;
+    callOnMainThread([protectedThis = WTFMove(protectedThis), numberOfChannels, sampleRate] {
+        if (protectedThis-&gt;m_client)
+            protectedThis-&gt;m_client-&gt;setFormat(numberOfChannels, sampleRate);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -159,7 +159,7 @@
</span><span class="cx">     sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockAudioSourcePersistentID(), nullptr));
</span><span class="cx">     sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockVideoSourcePersistentID(), nullptr));
</span><span class="cx"> 
</span><del>-    callOnMainThread([this, requestClient, sources] {
</del><ins>+    callOnMainThread([this, requestClient = WTFMove(requestClient), sources = WTFMove(sources)] {
</ins><span class="cx">         requestClient-&gt;didCompleteTrackSourceInfoRequest(sources);
</span><span class="cx">     });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkBlobResourceHandlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -187,10 +187,8 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RefPtr&lt;BlobResourceHandle&gt; protectedThis(this);
-
</del><span class="cx">     // Finish this async call quickly and return.
</span><del>-    callOnMainThread([protectedThis] {
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;BlobResourceHandle&gt;(*this)]() mutable {
</ins><span class="cx">         protectedThis-&gt;doStart();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -665,9 +663,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Schedule to notify the client from a standalone function because the client might dispose the handle immediately from the callback function
</span><span class="cx">     // while we still have BlobResourceHandle calls in the stack.
</span><del>-    RefPtr&lt;BlobResourceHandle&gt; protectedThis(this);
-    callOnMainThread([protectedThis] {
-        doNotifyFinish(*protectedThis);
</del><ins>+    callOnMainThread([protectedThis = Ref&lt;BlobResourceHandle&gt;(*this)]() mutable {
+        doNotifyFinish(protectedThis);
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkDataURLDecodercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/DataURLDecoder.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -168,25 +168,21 @@
</span><span class="cx">     task.result.data = SharedBuffer::adoptVector(buffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void decode(const URL&amp; url, const ScheduleContext&amp; scheduleContext, DecodeCompletionHandler completionHandler)
</del><ins>+void decode(const URL&amp; url, const ScheduleContext&amp; scheduleContext, DecodeCompletionHandler&amp;&amp; completionHandler)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(url.protocolIsData());
</span><span class="cx"> 
</span><span class="cx">     auto decodeTask = createDecodeTask(url, scheduleContext, WTFMove(completionHandler));
</span><del>-    auto* decodeTaskPtr = decodeTask.release();
-    decodeQueue().dispatch([decodeTaskPtr] {
-        auto&amp; decodeTask = *decodeTaskPtr;
-
-        if (decodeTask.isBase64)
-            decodeBase64(decodeTask);
</del><ins>+    decodeQueue().dispatch([decodeTask = WTFMove(decodeTask)]() mutable {
+        if (decodeTask-&gt;isBase64)
+            decodeBase64(*decodeTask);
</ins><span class="cx">         else
</span><del>-            decodeEscaped(decodeTask);
</del><ins>+            decodeEscaped(*decodeTask);
</ins><span class="cx"> 
</span><span class="cx"> #if HAVE(RUNLOOP_TIMER)
</span><del>-        DecodingResultDispatcher::dispatch(std::unique_ptr&lt;DecodeTask&gt;(decodeTaskPtr));
</del><ins>+        DecodingResultDispatcher::dispatch(WTFMove(decodeTask));
</ins><span class="cx"> #else
</span><del>-        callOnMainThread([decodeTaskPtr] {
-            std::unique_ptr&lt;DecodeTask&gt; decodeTask(decodeTaskPtr);
</del><ins>+        callOnMainThread([decodeTask = WTFMove(decodeTask)] {
</ins><span class="cx">             if (!decodeTask-&gt;result.data) {
</span><span class="cx">                 decodeTask-&gt;completionHandler({ });
</span><span class="cx">                 return;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkDataURLDecoderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/DataURLDecoder.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-void decode(const URL&amp;, const ScheduleContext&amp;, DecodeCompletionHandler);
</del><ins>+void decode(const URL&amp;, const ScheduleContext&amp;, DecodeCompletionHandler&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcocoaWebCoreNSURLSessionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -92,10 +92,7 @@
</span><span class="cx">     for (auto&amp; task : _dataTasks)
</span><span class="cx">         task.get().session = nil;
</span><span class="cx"> 
</span><del>-    // FIXME(C++14): When we can move RefPtrs directly into blocks, replace this with a RefPtr&amp;&amp;:
-    WebCore::PlatformMediaResourceLoader* loader = _loader.leakRef();
-    callOnMainThread([loader] {
-        loader-&gt;deref();
</del><ins>+    callOnMainThread([loader = WTFMove(_loader)] {
</ins><span class="cx">     });
</span><span class="cx">     [super dealloc];
</span><span class="cx"> }
</span><span class="lines">@@ -466,34 +463,31 @@
</span><span class="cx"> - (void)cancel
</span><span class="cx"> {
</span><span class="cx">     self.state = NSURLSessionTaskStateCanceling;
</span><del>-    RetainPtr&lt;WebCoreNSURLSessionDataTask&gt; strongSelf { self };
-    callOnMainThread([strongSelf] {
-        [strongSelf _cancel];
-        [strongSelf _finish];
</del><ins>+    callOnMainThread([protectedSelf = RetainPtr&lt;WebCoreNSURLSessionDataTask&gt;(self)] {
+        [protectedSelf _cancel];
+        [protectedSelf _finish];
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)suspend
</span><span class="cx"> {
</span><del>-    RetainPtr&lt;WebCoreNSURLSessionDataTask&gt; strongSelf { self };
-    callOnMainThread([strongSelf] {
</del><ins>+    callOnMainThread([protectedSelf = RetainPtr&lt;WebCoreNSURLSessionDataTask&gt;(self)] {
</ins><span class="cx">         // NSURLSessionDataTasks must start over after suspending, so while
</span><span class="cx">         // we could defer loading at this point, instead cancel and restart
</span><span class="cx">         // upon resume so as to adhere to NSURLSessionDataTask semantics.
</span><del>-        [strongSelf _cancel];
-        strongSelf.get().state = NSURLSessionTaskStateSuspended;
</del><ins>+        [protectedSelf _cancel];
+        protectedSelf.get().state = NSURLSessionTaskStateSuspended;
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)resume
</span><span class="cx"> {
</span><del>-    RetainPtr&lt;WebCoreNSURLSessionDataTask&gt; strongSelf { self };
-    callOnMainThread([strongSelf] {
-        if (strongSelf.get().state != NSURLSessionTaskStateSuspended)
</del><ins>+    callOnMainThread([protectedSelf = RetainPtr&lt;WebCoreNSURLSessionDataTask&gt;(self)] {
+        if (protectedSelf.get().state != NSURLSessionTaskStateSuspended)
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        [strongSelf _restart];
-        strongSelf.get().state = NSURLSessionTaskStateRunning;
</del><ins>+        [protectedSelf _restart];
+        protectedSelf.get().state = NSURLSessionTaskStateRunning;
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlDownloadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -402,11 +402,9 @@
</span><span class="cx">         CURLcode err = curl_easy_getinfo(m_curlHandle, CURLINFO_RESPONSE_CODE, &amp;httpCode);
</span><span class="cx"> 
</span><span class="cx">         if (httpCode &gt;= 200 &amp;&amp; httpCode &lt; 300) {
</span><del>-            URLCapture capturedUrl(getCurlEffectiveURL(m_curlHandle));
-            RefPtr&lt;CurlDownload&gt; protectedThis(this);
-
-            callOnMainThread([this, capturedUrl, protectedThis] {
-                m_response.setURL(capturedUrl.url());
</del><ins>+            URL url = getCurlEffectiveURL(m_curlHandle);
+            callOnMainThread([this, url = url.isolatedCopy(), protectedThis = Ref&lt;CurlDownload&gt;(*this)] {
+                m_response.setURL(url);
</ins><span class="cx">                 m_response.setMimeType(extractMIMETypeFromMediaType(m_response.httpHeaderField(HTTPHeaderName::ContentType)));
</span><span class="cx">                 m_response.setTextEncodingName(extractCharsetFromMediaType(m_response.httpHeaderField(HTTPHeaderName::ContentType)));
</span><span class="cx"> 
</span><span class="lines">@@ -414,14 +412,10 @@
</span><span class="cx">             });
</span><span class="cx">         }
</span><span class="cx">     } else {
</span><del>-        StringCapture capturedHeader(header);
-
-        RefPtr&lt;CurlDownload&gt; protectedThis(this);
-
-        callOnMainThread([this, capturedHeader, protectedThis] {
-            int splitPos = capturedHeader.string().find(&quot;:&quot;);
</del><ins>+        callOnMainThread([this, header = header.isolatedCopy(), protectedThis = Ref&lt;CurlDownload&gt;(*this)] {
+            int splitPos = header.string().find(&quot;:&quot;);
</ins><span class="cx">             if (splitPos != -1)
</span><del>-                m_response.setHTTPHeaderField(capturedHeader.string().left(splitPos), capturedHeader.string().substring(splitPos + 1).stripWhiteSpace());
</del><ins>+                m_response.setHTTPHeaderField(header.string().left(splitPos), header.string().substring(splitPos + 1).stripWhiteSpace());
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2016-05-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        callOnMainThread() should not copy captured lambda variables
+        https://bugs.webkit.org/show_bug.cgi?id=158166
+
+        Reviewed by Brady Eidson.
+
+        callOnMainThread() should not copy captured lambda variables. This 
+        function is usually called cross-thread with a lambda and copying
+        the lambda (and its captured variables) can lead to thread-safety
+        issues.
+
+        This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
+        in parameter instead of a std::function. The call sites of
+        callOnMainThread() have also been updated to use C++14's lambda
+        capture with initializer.
+
+        * Storage/StorageAreaSync.cpp:
+        (WebCore::StorageAreaSync::deleteEmptyDatabase):
+        * Storage/StorageSyncManager.cpp:
+        (WebCore::StorageSyncManager::dispatch):
+        * Storage/StorageSyncManager.h:
+        * Storage/StorageThread.cpp:
+        (WebCore::StorageThread::dispatch):
+        (WebCore::StorageThread::terminate):
+        (WebCore::StorageThread::releaseFastMallocFreeMemoryInAllThreads):
+        * Storage/StorageThread.h:
+        * Storage/StorageTracker.cpp:
+        (WebCore::StorageTracker::syncFileSystemAndTrackerDatabase):
+        (WebCore::StorageTracker::setOriginDetails):
+
</ins><span class="cx"> 2016-05-25  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix CMake build.
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageAreaSynccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageAreaSync.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageAreaSync.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageAreaSync.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -514,10 +514,8 @@
</span><span class="cx">         query.finalize();
</span><span class="cx">         m_database.close();
</span><span class="cx">         if (StorageTracker::tracker().isActive()) {
</span><del>-            StringImpl* databaseIdentifierCopy = &amp;m_databaseIdentifier.impl()-&gt;isolatedCopy().leakRef();
-            callOnMainThread([databaseIdentifierCopy] {
-                StorageTracker::tracker().deleteOriginWithIdentifier(databaseIdentifierCopy);
-                databaseIdentifierCopy-&gt;deref();
</del><ins>+            callOnMainThread([databaseIdentifier = m_databaseIdentifier.isolatedCopy()] {
+                StorageTracker::tracker().deleteOriginWithIdentifier(databaseIdentifier);
</ins><span class="cx">             });
</span><span class="cx">         } else {
</span><span class="cx">             String databaseFilename = m_syncManager-&gt;fullDatabaseFilename(m_databaseIdentifier);
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageSyncManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageSyncManager.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageSyncManager.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageSyncManager.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -63,13 +63,13 @@
</span><span class="cx">     return pathByAppendingComponent(m_path, databaseIdentifier + &quot;.localstorage&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StorageSyncManager::dispatch(const std::function&lt;void ()&gt;&amp; function)
</del><ins>+void StorageSyncManager::dispatch(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     ASSERT(m_thread);
</span><span class="cx"> 
</span><span class="cx">     if (m_thread)
</span><del>-        m_thread-&gt;dispatch(function);
</del><ins>+        m_thread-&gt;dispatch(WTFMove(function));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StorageSyncManager::close()
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageSyncManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageSyncManager.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageSyncManager.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageSyncManager.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;functional&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="lines">@@ -42,7 +43,7 @@
</span><span class="cx">     static Ref&lt;StorageSyncManager&gt; create(const String&amp; path);
</span><span class="cx">     ~StorageSyncManager();
</span><span class="cx"> 
</span><del>-    void dispatch(const std::function&lt;void ()&gt;&amp;);
</del><ins>+    void dispatch(NoncopyableFunction&amp;&amp;);
</ins><span class="cx">     void close();
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -74,11 +74,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StorageThread::dispatch(const std::function&lt;void ()&gt;&amp; function)
</del><ins>+void StorageThread::dispatch(NoncopyableFunction&amp;&amp; function)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     ASSERT(!m_queue.killed() &amp;&amp; m_threadID);
</span><del>-    m_queue.append(std::make_unique&lt;std::function&lt;void ()&gt;&gt;(function));
</del><ins>+    m_queue.append(std::make_unique&lt;NoncopyableFunction&gt;(WTFMove(function)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StorageThread::terminate()
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx">     if (!m_threadID)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_queue.append(std::make_unique&lt;std::function&lt;void ()&gt;&gt;([this] {
</del><ins>+    m_queue.append(std::make_unique&lt;NoncopyableFunction&gt;([this] {
</ins><span class="cx">         performTerminate();
</span><span class="cx">     }));
</span><span class="cx">     waitForThreadCompletion(m_threadID);
</span><span class="lines">@@ -108,8 +108,11 @@
</span><span class="cx"> {
</span><span class="cx">     HashSet&lt;StorageThread*&gt;&amp; threads = activeStorageThreads();
</span><span class="cx"> 
</span><del>-    for (HashSet&lt;StorageThread*&gt;::iterator it = threads.begin(), end = threads.end(); it != end; ++it)
-        (*it)-&gt;dispatch(WTF::releaseFastMallocFreeMemory);
</del><ins>+    for (HashSet&lt;StorageThread*&gt;::iterator it = threads.begin(), end = threads.end(); it != end; ++it) {
+        (*it)-&gt;dispatch([]() {
+            WTF::releaseFastMallocFreeMemory();
+        });
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #include &lt;functional&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/MessageQueue.h&gt;
</span><del>-#include &lt;wtf/PassRefPtr.h&gt;
</del><ins>+#include &lt;wtf/NoncopyableFunction.h&gt;
</ins><span class="cx"> #include &lt;wtf/Threading.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">     bool start();
</span><span class="cx">     void terminate();
</span><span class="cx"> 
</span><del>-    void dispatch(const std::function&lt;void()&gt;&amp;);
</del><ins>+    void dispatch(NoncopyableFunction&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     static void releaseFastMallocFreeMemoryInAllThreads();
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">     void performTerminate();
</span><span class="cx"> 
</span><span class="cx">     ThreadIdentifier m_threadID;
</span><del>-    MessageQueue&lt;std::function&lt;void()&gt;&gt; m_queue;
</del><ins>+    MessageQueue&lt;NoncopyableFunction&gt; m_queue;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageTrackercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageTracker.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageTracker.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageTracker.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -293,9 +293,8 @@
</span><span class="cx">         if (foundOrigins.contains(originIdentifier))
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        String originIdentifierCopy = originIdentifier.isolatedCopy();
-        callOnMainThread([this, originIdentifierCopy] {
-            deleteOriginWithIdentifier(originIdentifierCopy);
</del><ins>+        callOnMainThread([this, originIdentifier = originIdentifier.isolatedCopy()] {
+            deleteOriginWithIdentifier(originIdentifier);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -314,19 +313,17 @@
</span><span class="cx">         m_originSet.add(originIdentifier);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    String originIdentifierCopy = originIdentifier.isolatedCopy();
-    String databaseFileCopy = databaseFile.isolatedCopy();
-    auto function = [this, originIdentifierCopy, databaseFileCopy] {
-        syncSetOriginDetails(originIdentifierCopy, databaseFileCopy);
</del><ins>+    auto function = [this, originIdentifier = originIdentifier.isolatedCopy(), databaseFile = databaseFile.isolatedCopy()] {
+        syncSetOriginDetails(originIdentifier, databaseFile);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     if (isMainThread()) {
</span><span class="cx">         ASSERT(m_thread);
</span><del>-        m_thread-&gt;dispatch(function);
</del><ins>+        m_thread-&gt;dispatch(WTFMove(function));
</ins><span class="cx">     } else {
</span><span class="cx">         // FIXME: This weird ping-ponging was done to fix a deadlock. We should figure out a cleaner way to avoid it instead.
</span><del>-        callOnMainThread([this, function] {
-            m_thread-&gt;dispatch(function);
</del><ins>+        callOnMainThread([this, function = WTFMove(function)]() mutable {
+            m_thread-&gt;dispatch(WTFMove(function));
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2016-05-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        callOnMainThread() should not copy captured lambda variables
+        https://bugs.webkit.org/show_bug.cgi?id=158166
+
+        Reviewed by Brady Eidson.
+
+        callOnMainThread() should not copy captured lambda variables. This 
+        function is usually called cross-thread with a lambda and copying
+        the lambda (and its captured variables) can lead to thread-safety
+        issues.
+
+        This patch updates callOnMainThread() to take a NoncopyableFunction&amp;&amp;
+        in parameter instead of a std::function. The call sites of
+        callOnMainThread() have also been updated to use C++14's lambda
+        capture with initializer.
+
+        * Storage/WebDatabaseManagerClient.mm:
+        (DidModifyOriginData::dispatchToMainThread):
+        (DidModifyOriginData::DidModifyOriginData): Deleted.
+        * Storage/WebStorageTrackerClient.mm:
+        (WebStorageTrackerClient::dispatchDidModifyOrigin):
+
</ins><span class="cx"> 2016-05-27  Caitlin Potter  &lt;caitp@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [JSC] implement async functions proposal
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseManagerClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -103,20 +103,19 @@
</span><span class="cx"> public:
</span><span class="cx">     static void dispatchToMainThread(WebDatabaseManagerClient* client, SecurityOrigin* origin)
</span><span class="cx">     {
</span><del>-        DidModifyOriginData* context = new DidModifyOriginData(client, origin-&gt;isolatedCopy());
-        callOnMainThread([context] {
</del><ins>+        auto context = std::make_unique&lt;DidModifyOriginData&gt;(client, origin-&gt;isolatedCopy());
+        callOnMainThread([context = WTFMove(context)] {
</ins><span class="cx">             context-&gt;client-&gt;dispatchDidModifyOrigin(context-&gt;origin.get());
</span><del>-            delete context;
</del><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-private:
</del><span class="cx">     DidModifyOriginData(WebDatabaseManagerClient* client, PassRefPtr&lt;SecurityOrigin&gt; origin)
</span><span class="cx">         : client(client)
</span><span class="cx">         , origin(origin)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+private:
</ins><span class="cx">     WebDatabaseManagerClient* client;
</span><span class="cx">     RefPtr&lt;SecurityOrigin&gt; origin;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebStorageTrackerClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -58,15 +58,15 @@
</span><span class="cx"> 
</span><span class="cx"> void WebStorageTrackerClient::dispatchDidModifyOrigin(const String&amp; originIdentifier)
</span><span class="cx"> {
</span><del>-    RefPtr&lt;SecurityOrigin&gt; origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
</del><ins>+    auto origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
</ins><span class="cx"> 
</span><span class="cx">     if (isMainThread()) {
</span><del>-        dispatchDidModifyOrigin(origin);
</del><ins>+        dispatchDidModifyOrigin(WTFMove(origin));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    callOnMainThread([origin] {
-        WebStorageTrackerClient::sharedWebStorageTrackerClient()-&gt;dispatchDidModifyOrigin(origin.get());
</del><ins>+    callOnMainThread([origin = WTFMove(origin)]() mutable {
+        WebStorageTrackerClient::sharedWebStorageTrackerClient()-&gt;dispatchDidModifyOrigin(WTFMove(origin));
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>