<!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>[209390] trunk</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/209390">209390</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-12-05 23:59:02 -0800 (Mon, 05 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WebIDL] Add support for converting dictionaries to JS
https://bugs.webkit.org/show_bug.cgi?id=165367

Patch by Sam Weinig &lt;sam@webkit.org&gt; on 2016-12-06
Reviewed by Darin Adler and Alex Christensen.

Source/WebCore:

- Adds support for converting dictionary types to JSValues via JSDOMConvert.
- Adopts that functionality to correct the CryptoKeyPair implementation, which
  is supposed to be a dictionary.
  (While doing this, I also update places that were passing both a CryptoKey
  and CryptoKeyPair to use a Variant, since they always only wanted one.)
- Re-works DOMPromise and DeferredPromise to be based on JSDOMConvert and IDLTypes.

* CMakeLists.txt:
* PlatformEfl.cmake:
* PlatformGTK.cmake:
* PlatformMac.cmake:
* WebCore.xcodeproj/project.pbxproj:
Remove JSCryptoKeyPairCustom.cpp and CryptoKeyPair.cpp.

* Modules/encryptedmedia/legacy/WebKitMediaKeys.cpp:
* Modules/mediasource/MediaSource.cpp:
* Modules/mediasource/SourceBuffer.cpp:
* bindings/js/JSMediaDevicesCustom.cpp:
* html/MediaController.cpp:
* html/track/TextTrack.cpp:
Add some missing includes.

* Modules/applepay/ApplePaySession.cpp:
(WebCore::ApplePaySession::canMakePaymentsWithActiveCard):
(WebCore::ApplePaySession::openPaymentSetup):
* Modules/fetch/FetchBody.cpp:
(WebCore::FetchBody::text):
(WebCore::FetchBody::consume):
(WebCore::FetchBody::loadingFailed):
* Modules/fetch/FetchBodyConsumer.cpp:
(WebCore::FetchBodyConsumer::resolveWithData):
(WebCore::FetchBodyConsumer::resolve):
* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::blob):
(WebCore::FetchBodyOwner::formData):
(WebCore::FetchBodyOwner::text):
* Modules/fetch/FetchResponse.h:
* Modules/mediastream/MediaDevices.h:
* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::replaceTrack):
(WebCore::MediaEndpointPeerConnection::replaceTrackTask):
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::MediaStreamTrack::applyConstraints):
* Modules/mediastream/PeerConnectionBackend.cpp:
(WebCore::PeerConnectionBackend::setLocalDescription):
(WebCore::PeerConnectionBackend::setRemoteDescription):
(WebCore::PeerConnectionBackend::addIceCandidate):
* Modules/mediastream/PeerConnectionBackend.h:
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::queuedSetLocalDescription):
(WebCore::RTCPeerConnection::queuedSetRemoteDescription):
(WebCore::RTCPeerConnection::queuedAddIceCandidate):
(WebCore::RTCPeerConnection::replaceTrack):
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCRtpSender.cpp:
(WebCore::RTCRtpSender::replaceTrack):
* Modules/mediastream/RTCRtpSender.h:
* Modules/mediastream/UserMediaRequest.cpp:
(WebCore::UserMediaRequest::deny):
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::suspend):
(WebCore::AudioContext::resume):
* bindings/js/JSCustomElementRegistryCustom.cpp:
(WebCore::whenDefinedPromise):
* bindings/js/ScriptModuleLoader.cpp:
(WebCore::ScriptModuleLoader::resolve):
(WebCore::ScriptModuleLoader::notifyFinished):
* css/FontFace.h:
* css/FontFaceSet.cpp:
(WebCore::FontFaceSet::load):
* css/FontFaceSet.h:
* dom/CustomElementRegistry.cpp:
(WebCore::CustomElementRegistry::addElementDefinition):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::rejectPendingPlayPromises):
* html/HTMLMediaElement.h:
Update to use new IDLType based promises.

* bindings/generic/IDLTypes.h:
Add a new type, ParameterType, to use as the parameter to
DOMPromise/DeferredPromise.

* bindings/js/JSCryptoKeyPairCustom.cpp:
Removed.

* bindings/js/JSDOMConvert.h:
(WebCore::JSConverter&lt;IDLDictionary&lt;T&gt;&gt;::convert):
Add JSConverter specialization for IDLDictionary. Have it simply forward to a generated
convertDictionaryToJS function, following the convention set in place by IDLEnumeration.

* bindings/js/JSDOMPromise.cpp:
* bindings/js/JSDOMPromise.h:
Re-write to be based on IDLTypes and JSDOMConvert, simplifying the implementation.

* bindings/js/JSSubtleCryptoCustom.cpp:
* bindings/js/JSWebKitSubtleCryptoCustom.cpp:
Update for variant based KeyOrKeyPair.

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateDictionaryHeaderContent):
(GenerateDictionaryImplementationContent):
Add generation of the convertDictionaryToJS function. I made it require the JSGenerateToJSObject
extended attribute for now, as the majority of dictionaries do not need this code generated for them.

* bindings/scripts/test/JS/JSTestObj.cpp:
(WebCore::convertDictionaryToJS):
* bindings/scripts/test/JS/JSTestObj.h:
* bindings/scripts/test/TestObj.idl:
Add JSGenerateToJSObject to a dictionary to test generation in bindings tests.

* crypto/CryptoAlgorithm.h:
Change KeyOrKeyPairCallback to take a Variant&lt;RefPtr&lt;CryptoKey&gt;, CryptoKeyPair&gt;, rather
than two separate arguments.

* crypto/CryptoKeyPair.cpp:
Removed.

* crypto/CryptoKeyPair.h:
Convert to a struct.

* crypto/CryptoKeyPair.idl:
Convert to a dictionary.

* crypto/algorithms/CryptoAlgorithmAES_CBC.cpp:
(WebCore::CryptoAlgorithmAES_CBC::generateKey):
* crypto/algorithms/CryptoAlgorithmAES_KW.cpp:
(WebCore::CryptoAlgorithmAES_KW::generateKey):
* crypto/algorithms/CryptoAlgorithmHMAC.cpp:
(WebCore::CryptoAlgorithmHMAC::generateKey):
* crypto/algorithms/CryptoAlgorithmRSAES_PKCS1_v1_5.cpp:
(WebCore::CryptoAlgorithmRSAES_PKCS1_v1_5::generateKey):
* crypto/algorithms/CryptoAlgorithmRSASSA_PKCS1_v1_5.cpp:
(WebCore::CryptoAlgorithmRSASSA_PKCS1_v1_5::generateKey):
* crypto/algorithms/CryptoAlgorithmRSA_OAEP.cpp:
(WebCore::CryptoAlgorithmRSA_OAEP::generateKey):
* crypto/keys/CryptoKeyRSA.h:
* crypto/mac/CryptoKeyRSAMac.cpp:
(WebCore::CryptoKeyRSA::generatePair):
Update for new signature of KeyOrKeyPairCallback.

Source/WebKit2:

* CMakeLists.txt:
Add missing directories to look in for headers.

LayoutTests:

* crypto/subtle/rsa-oaep-generate-key-expected.txt:
* crypto/subtle/rsa-oaep-generate-key.html:
* crypto/subtle/rsaes-pkcs1-v1_5-generate-key-expected.txt:
* crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable-expected.txt:
* crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable.html:
* crypto/subtle/rsaes-pkcs1-v1_5-generate-key.html:
* crypto/subtle/rsassa-pkcs1-v1_5-generate-key-expected.txt:
* crypto/subtle/rsassa-pkcs1-v1_5-generate-key.html:
* crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key-expected.txt:
* crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key.html:
* crypto/webkitSubtle/rsa-oaep-key-manipulation-expected.txt:
* crypto/webkitSubtle/rsa-oaep-key-manipulation.html:
* crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-expected.txt:
* crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent-expected.txt:
* crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent.html:
* crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key.html:
* crypto/workers/subtle/resources/rsa-generate-key.js:
* crypto/workers/subtle/rsa-generate-key-expected.txt:
Update tests and expected results to show that CryptoKeyPair is now a vanilla object, not a platform object.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersaoaepgeneratekeyexpectedtxt">trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersaoaepgeneratekeyhtml">trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyexpectedtxt">trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyextractableexpectedtxt">trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyextractablehtml">trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyhtml">trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersassapkcs1v1_5generatekeyexpectedtxt">trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptosubtlersassapkcs1v1_5generatekeyhtml">trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key.html</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersaoaepgeneratenonextractablekeyexpectedtxt">trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersaoaepgeneratenonextractablekeyhtml">trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key.html</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersaoaepkeymanipulationexpectedtxt">trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersaoaepkeymanipulationhtml">trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation.html</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeyexpectedtxt">trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeywithleadingzeroesinexponentexpectedtxt">trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent-expected.txt</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeywithleadingzeroesinexponenthtml">trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent.html</a></li>
<li><a href="#trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeyhtml">trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key.html</a></li>
<li><a href="#trunkLayoutTestscryptoworkerssubtleresourcesrsageneratekeyjs">trunk/LayoutTests/crypto/workers/subtle/resources/rsa-generate-key.js</a></li>
<li><a href="#trunkLayoutTestscryptoworkerssubtlersageneratekeyexpectedtxt">trunk/LayoutTests/crypto/workers/subtle/rsa-generate-key-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesapplepayApplePaySessioncpp">trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesencryptedmedialegacyWebKitMediaKeyscpp">trunk/Source/WebCore/Modules/encryptedmedia/legacy/WebKitMediaKeys.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodycpp">trunk/Source/WebCore/Modules/fetch/FetchBody.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyConsumercpp">trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyOwnercpp">trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchResponseh">trunk/Source/WebCore/Modules/fetch/FetchResponse.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasourceMediaSourcecpp">trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasourceSourceBuffercpp">trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaDevicesh">trunk/Source/WebCore/Modules/mediastream/MediaDevices.h</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="#trunkSourceWebCoreModulesmediastreamMediaStreamTrackcpp">trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamPeerConnectionBackendcpp">trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh">trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCPeerConnectionh">trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpSendercpp">trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpSenderh">trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.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="#trunkSourceWebCorePlatformEflcmake">trunk/Source/WebCore/PlatformEfl.cmake</a></li>
<li><a href="#trunkSourceWebCorePlatformGTKcmake">trunk/Source/WebCore/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebCorePlatformMaccmake">trunk/Source/WebCore/PlatformMac.cmake</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsgenericIDLTypesh">trunk/Source/WebCore/bindings/generic/IDLTypes.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCustomElementRegistryCustomcpp">trunk/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMConverth">trunk/Source/WebCore/bindings/js/JSDOMConvert.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMPromisecpp">trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMPromiseh">trunk/Source/WebCore/bindings/js/JSDOMPromise.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMediaDevicesCustomcpp">trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp">trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWebKitSubtleCryptoCustomcpp">trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsScriptModuleLoadercpp">trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjh">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestTestObjidl">trunk/Source/WebCore/bindings/scripts/test/TestObj.idl</a></li>
<li><a href="#trunkSourceWebCorecryptoCryptoAlgorithmh">trunk/Source/WebCore/crypto/CryptoAlgorithm.h</a></li>
<li><a href="#trunkSourceWebCorecryptoCryptoKeyPairh">trunk/Source/WebCore/crypto/CryptoKeyPair.h</a></li>
<li><a href="#trunkSourceWebCorecryptoCryptoKeyPairidl">trunk/Source/WebCore/crypto/CryptoKeyPair.idl</a></li>
<li><a href="#trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmAES_CBCcpp">trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_CBC.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmAES_KWcpp">trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_KW.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmHMACcpp">trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmHMAC.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmRSAES_PKCS1_v1_5cpp">trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSAES_PKCS1_v1_5.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmRSASSA_PKCS1_v1_5cpp">trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSASSA_PKCS1_v1_5.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmRSA_OAEPcpp">trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSA_OAEP.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptokeysCryptoKeyRSAh">trunk/Source/WebCore/crypto/keys/CryptoKeyRSA.h</a></li>
<li><a href="#trunkSourceWebCorecryptomacCryptoKeyRSAMaccpp">trunk/Source/WebCore/crypto/mac/CryptoKeyRSAMac.cpp</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceh">trunk/Source/WebCore/css/FontFace.h</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceSetcpp">trunk/Source/WebCore/css/FontFaceSet.cpp</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceSeth">trunk/Source/WebCore/css/FontFaceSet.h</a></li>
<li><a href="#trunkSourceWebCoredomCustomElementRegistrycpp">trunk/Source/WebCore/dom/CustomElementRegistry.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaControllercpp">trunk/Source/WebCore/html/MediaController.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContextcpp">trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackTextTrackcpp">trunk/Source/WebCore/html/track/TextTrack.cpp</a></li>
<li><a href="#trunkSourceWebKit2CMakeListstxt">trunk/Source/WebKit2/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorebindingsjsJSCryptoKeyPairCustomcpp">trunk/Source/WebCore/bindings/js/JSCryptoKeyPairCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoCryptoKeyPaircpp">trunk/Source/WebCore/crypto/CryptoKeyPair.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/ChangeLog        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2016-12-06  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        [WebIDL] Add support for converting dictionaries to JS
+        https://bugs.webkit.org/show_bug.cgi?id=165367
+
+        Reviewed by Darin Adler and Alex Christensen.
+
+        * crypto/subtle/rsa-oaep-generate-key-expected.txt:
+        * crypto/subtle/rsa-oaep-generate-key.html:
+        * crypto/subtle/rsaes-pkcs1-v1_5-generate-key-expected.txt:
+        * crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable-expected.txt:
+        * crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable.html:
+        * crypto/subtle/rsaes-pkcs1-v1_5-generate-key.html:
+        * crypto/subtle/rsassa-pkcs1-v1_5-generate-key-expected.txt:
+        * crypto/subtle/rsassa-pkcs1-v1_5-generate-key.html:
+        * crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key-expected.txt:
+        * crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key.html:
+        * crypto/webkitSubtle/rsa-oaep-key-manipulation-expected.txt:
+        * crypto/webkitSubtle/rsa-oaep-key-manipulation.html:
+        * crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-expected.txt:
+        * crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent-expected.txt:
+        * crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent.html:
+        * crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key.html:
+        * crypto/workers/subtle/resources/rsa-generate-key.js:
+        * crypto/workers/subtle/rsa-generate-key-expected.txt:
+        Update tests and expected results to show that CryptoKeyPair is now a vanilla object, not a platform object.
+
</ins><span class="cx"> 2016-12-05  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Modern Media Controls] Controls bar in fullscreen cannot be dragged
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersaoaepgeneratekeyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.extractable is true
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSA-OAEP'
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersaoaepgeneratekeyhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsa-oaep-generate-key.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.subtle.generateKey(algorithmKeyGen, nonExtractable, [&quot;decrypt&quot;, &quot;encrypt&quot;, &quot;wrapKey&quot;, &quot;unwrapKey&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.extractable&quot;, &quot;true&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSA-OAEP'&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.extractable is true
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSAES-PKCS1-v1_5'
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyextractableexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.extractable is true
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSAES-PKCS1-v1_5'
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyextractablehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key-extractable.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.subtle.generateKey(algorithmKeyGen, extractable, [&quot;decrypt&quot;, &quot;encrypt&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.extractable&quot;, &quot;true&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSAES-PKCS1-v1_5'&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersaespkcs1v1_5generatekeyhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-generate-key.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.subtle.generateKey(algorithmKeyGen, nonExtractable, [&quot;decrypt&quot;, &quot;encrypt&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.extractable&quot;, &quot;true&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSAES-PKCS1-v1_5'&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersassapkcs1v1_5generatekeyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.extractable is true
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSASSA-PKCS1-v1_5'
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlersassapkcs1v1_5generatekeyhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/subtle/rsassa-pkcs1-v1_5-generate-key.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.subtle.generateKey(algorithmKeyGen, nonExtractable, [&quot;sign&quot;, &quot;verify&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.extractable&quot;, &quot;true&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSASSA-PKCS1-v1_5'&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersaoaepgeneratenonextractablekeyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.extractable is true
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSA-OAEP'
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersaoaepgeneratenonextractablekeyhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-generate-non-extractable-key.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.webkitSubtle.generateKey(algorithmKeyGen, nonExtractable, []).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.extractable&quot;, &quot;true&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSA-OAEP'&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersaoaepkeymanipulationexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSA-OAEP'
</span><span class="cx"> PASS keyPair.publicKey.algorithm.modulusLength is 2048
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersaoaepkeymanipulationhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsa-oaep-key-manipulation.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.webkitSubtle.generateKey(algorithmKeyGen, extractable, [&quot;encrypt&quot;, &quot;decrypt&quot;, &quot;wrapKey&quot;, &quot;unwrapKey&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSA-OAEP'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.modulusLength&quot;, &quot;2048&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSASSA-PKCS1-v1_5'
</span><span class="cx"> PASS keyPair.publicKey.algorithm.modulusLength is 2048
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeywithleadingzeroesinexponentexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Generating a key pair...
</span><del>-PASS keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS keyPair.publicKey.algorithm.name is 'RSASSA-PKCS1-v1_5'
</span><span class="cx"> PASS keyPair.publicKey.algorithm.modulusLength is 2048
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeywithleadingzeroesinexponenthtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key-with-leading-zeroes-in-exponent.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.webkitSubtle.generateKey(algorithmKeyGen, extractable, [&quot;sign&quot;, &quot;verify&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSASSA-PKCS1-v1_5'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.modulusLength&quot;, &quot;2048&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptowebkitSubtlersassapkcs1v1_5generatekeyhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key.html (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key.html        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/webkitSubtle/rsassa-pkcs1-v1_5-generate-key.html        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> debug(&quot;Generating a key pair...&quot;);
</span><span class="cx"> crypto.webkitSubtle.generateKey(algorithmKeyGen, extractable, [&quot;sign&quot;, &quot;verify&quot;]).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSASSA-PKCS1-v1_5'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.modulusLength&quot;, &quot;2048&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptoworkerssubtleresourcesrsageneratekeyjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/workers/subtle/resources/rsa-generate-key.js (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/workers/subtle/resources/rsa-generate-key.js        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/workers/subtle/resources/rsa-generate-key.js        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx">     return crypto.subtle.generateKey({name: &quot;RSA-OAEP&quot;, modulusLength: 2048, publicExponent: publicExponent, hash: 'sha-1'}, extractable, [&quot;decrypt&quot;, &quot;encrypt&quot;, &quot;wrapKey&quot;, &quot;unwrapKey&quot;]);
</span><span class="cx"> }).then(function(result) {
</span><span class="cx">     keyPair = result;
</span><del>-    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object CryptoKeyPair]'&quot;);
</del><ins>+    shouldBe(&quot;keyPair.toString()&quot;, &quot;'[object Object]'&quot;);
</ins><span class="cx">     shouldBe(&quot;keyPair.publicKey.type&quot;, &quot;'public'&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.extractable&quot;, &quot;true&quot;);
</span><span class="cx">     shouldBe(&quot;keyPair.publicKey.algorithm.name&quot;, &quot;'RSA-OAEP'&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestscryptoworkerssubtlersageneratekeyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/workers/subtle/rsa-generate-key-expected.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/workers/subtle/rsa-generate-key-expected.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/LayoutTests/crypto/workers/subtle/rsa-generate-key-expected.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -7,7 +7,7 @@
</span><span class="cx"> PASS [Worker] crypto.subtle.generateKey({name: &quot;RSA-OAEP&quot;, modulusLength: 2048, publicExponent: publicExponent, hash: &quot;sha-1&quot;}, extractable, [&quot;sign&quot;]) rejected promise  with SyntaxError (DOM Exception 12): A required parameter was missing or out-of-range.
</span><span class="cx"> PASS [Worker] crypto.subtle.generateKey({name: &quot;RSASSA-PKCS1-v1_5&quot;, modulusLength: 0, publicExponent: publicExponent, hash: &quot;sha-1&quot;}, extractable, [&quot;sign&quot;, &quot;verify&quot;]) rejected promise  with OperationError (DOM Exception 34): The operation failed for an operation-specific reason.
</span><span class="cx"> [Worker] Generating a key...
</span><del>-PASS [Worker] keyPair.toString() is '[object CryptoKeyPair]'
</del><ins>+PASS [Worker] keyPair.toString() is '[object Object]'
</ins><span class="cx"> PASS [Worker] keyPair.publicKey.type is 'public'
</span><span class="cx"> PASS [Worker] keyPair.publicKey.extractable is true
</span><span class="cx"> PASS [Worker] keyPair.publicKey.algorithm.name is 'RSA-OAEP'
</span></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1105,7 +1105,6 @@
</span><span class="cx">     bindings/js/JSCryptoAlgorithmDictionary.cpp
</span><span class="cx">     bindings/js/JSCryptoCustom.cpp
</span><span class="cx">     bindings/js/JSCryptoKeyCustom.cpp
</span><del>-    bindings/js/JSCryptoKeyPairCustom.cpp
</del><span class="cx">     bindings/js/JSCryptoKeySerializationJWK.cpp
</span><span class="cx">     bindings/js/JSCryptoOperationData.cpp
</span><span class="cx">     bindings/js/JSCustomElementInterface.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/ChangeLog        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1,3 +1,151 @@
</span><ins>+2016-12-06  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        [WebIDL] Add support for converting dictionaries to JS
+        https://bugs.webkit.org/show_bug.cgi?id=165367
+
+        Reviewed by Darin Adler and Alex Christensen.
+
+        - Adds support for converting dictionary types to JSValues via JSDOMConvert.
+        - Adopts that functionality to correct the CryptoKeyPair implementation, which
+          is supposed to be a dictionary.
+          (While doing this, I also update places that were passing both a CryptoKey 
+          and CryptoKeyPair to use a Variant, since they always only wanted one.)
+        - Re-works DOMPromise and DeferredPromise to be based on JSDOMConvert and IDLTypes.
+
+        * CMakeLists.txt:
+        * PlatformEfl.cmake:
+        * PlatformGTK.cmake:
+        * PlatformMac.cmake:
+        * WebCore.xcodeproj/project.pbxproj:
+        Remove JSCryptoKeyPairCustom.cpp and CryptoKeyPair.cpp.
+
+        * Modules/encryptedmedia/legacy/WebKitMediaKeys.cpp:
+        * Modules/mediasource/MediaSource.cpp:
+        * Modules/mediasource/SourceBuffer.cpp:
+        * bindings/js/JSMediaDevicesCustom.cpp:
+        * html/MediaController.cpp:
+        * html/track/TextTrack.cpp:
+        Add some missing includes.
+
+        * Modules/applepay/ApplePaySession.cpp:
+        (WebCore::ApplePaySession::canMakePaymentsWithActiveCard):
+        (WebCore::ApplePaySession::openPaymentSetup):
+        * Modules/fetch/FetchBody.cpp:
+        (WebCore::FetchBody::text):
+        (WebCore::FetchBody::consume):
+        (WebCore::FetchBody::loadingFailed):
+        * Modules/fetch/FetchBodyConsumer.cpp:
+        (WebCore::FetchBodyConsumer::resolveWithData):
+        (WebCore::FetchBodyConsumer::resolve):
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::blob):
+        (WebCore::FetchBodyOwner::formData):
+        (WebCore::FetchBodyOwner::text):
+        * Modules/fetch/FetchResponse.h:
+        * Modules/mediastream/MediaDevices.h:
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::MediaEndpointPeerConnection::replaceTrack):
+        (WebCore::MediaEndpointPeerConnection::replaceTrackTask):
+        * Modules/mediastream/MediaEndpointPeerConnection.h:
+        * Modules/mediastream/MediaStreamTrack.cpp:
+        (WebCore::MediaStreamTrack::applyConstraints):
+        * Modules/mediastream/PeerConnectionBackend.cpp:
+        (WebCore::PeerConnectionBackend::setLocalDescription):
+        (WebCore::PeerConnectionBackend::setRemoteDescription):
+        (WebCore::PeerConnectionBackend::addIceCandidate):
+        * Modules/mediastream/PeerConnectionBackend.h:
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::queuedSetLocalDescription):
+        (WebCore::RTCPeerConnection::queuedSetRemoteDescription):
+        (WebCore::RTCPeerConnection::queuedAddIceCandidate):
+        (WebCore::RTCPeerConnection::replaceTrack):
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCRtpSender.cpp:
+        (WebCore::RTCRtpSender::replaceTrack):
+        * Modules/mediastream/RTCRtpSender.h:
+        * Modules/mediastream/UserMediaRequest.cpp:
+        (WebCore::UserMediaRequest::deny):
+        * Modules/webaudio/AudioContext.cpp:
+        (WebCore::AudioContext::suspend):
+        (WebCore::AudioContext::resume):
+        * bindings/js/JSCustomElementRegistryCustom.cpp:
+        (WebCore::whenDefinedPromise):
+        * bindings/js/ScriptModuleLoader.cpp:
+        (WebCore::ScriptModuleLoader::resolve):
+        (WebCore::ScriptModuleLoader::notifyFinished):
+        * css/FontFace.h:
+        * css/FontFaceSet.cpp:
+        (WebCore::FontFaceSet::load):
+        * css/FontFaceSet.h:
+        * dom/CustomElementRegistry.cpp:
+        (WebCore::CustomElementRegistry::addElementDefinition):
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::rejectPendingPlayPromises):
+        * html/HTMLMediaElement.h:
+        Update to use new IDLType based promises.
+
+        * bindings/generic/IDLTypes.h:
+        Add a new type, ParameterType, to use as the parameter to 
+        DOMPromise/DeferredPromise.
+
+        * bindings/js/JSCryptoKeyPairCustom.cpp:
+        Removed.
+
+        * bindings/js/JSDOMConvert.h:
+        (WebCore::JSConverter&lt;IDLDictionary&lt;T&gt;&gt;::convert):
+        Add JSConverter specialization for IDLDictionary. Have it simply forward to a generated 
+        convertDictionaryToJS function, following the convention set in place by IDLEnumeration.
+
+        * bindings/js/JSDOMPromise.cpp:
+        * bindings/js/JSDOMPromise.h:
+        Re-write to be based on IDLTypes and JSDOMConvert, simplifying the implementation.
+
+        * bindings/js/JSSubtleCryptoCustom.cpp:
+        * bindings/js/JSWebKitSubtleCryptoCustom.cpp:
+        Update for variant based KeyOrKeyPair.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateDictionaryHeaderContent):
+        (GenerateDictionaryImplementationContent):
+        Add generation of the convertDictionaryToJS function. I made it require the JSGenerateToJSObject
+        extended attribute for now, as the majority of dictionaries do not need this code generated for them.
+
+        * bindings/scripts/test/JS/JSTestObj.cpp:
+        (WebCore::convertDictionaryToJS):
+        * bindings/scripts/test/JS/JSTestObj.h:
+        * bindings/scripts/test/TestObj.idl:
+        Add JSGenerateToJSObject to a dictionary to test generation in bindings tests.
+
+        * crypto/CryptoAlgorithm.h:
+        Change KeyOrKeyPairCallback to take a Variant&lt;RefPtr&lt;CryptoKey&gt;, CryptoKeyPair&gt;, rather
+        than two separate arguments.
+
+        * crypto/CryptoKeyPair.cpp:
+        Removed.
+
+        * crypto/CryptoKeyPair.h:
+        Convert to a struct.
+
+        * crypto/CryptoKeyPair.idl:
+        Convert to a dictionary.
+
+        * crypto/algorithms/CryptoAlgorithmAES_CBC.cpp:
+        (WebCore::CryptoAlgorithmAES_CBC::generateKey):
+        * crypto/algorithms/CryptoAlgorithmAES_KW.cpp:
+        (WebCore::CryptoAlgorithmAES_KW::generateKey):
+        * crypto/algorithms/CryptoAlgorithmHMAC.cpp:
+        (WebCore::CryptoAlgorithmHMAC::generateKey):
+        * crypto/algorithms/CryptoAlgorithmRSAES_PKCS1_v1_5.cpp:
+        (WebCore::CryptoAlgorithmRSAES_PKCS1_v1_5::generateKey):
+        * crypto/algorithms/CryptoAlgorithmRSASSA_PKCS1_v1_5.cpp:
+        (WebCore::CryptoAlgorithmRSASSA_PKCS1_v1_5::generateKey):
+        * crypto/algorithms/CryptoAlgorithmRSA_OAEP.cpp:
+        (WebCore::CryptoAlgorithmRSA_OAEP::generateKey):
+        * crypto/keys/CryptoKeyRSA.h:
+        * crypto/mac/CryptoKeyRSAMac.cpp:
+        (WebCore::CryptoKeyRSA::generatePair):
+        Update for new signature of KeyOrKeyPairCallback.
+
</ins><span class="cx"> 2016-12-05  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Parser] Reject invalid hex colors on the fast path
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesapplepayApplePaySessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -735,7 +735,7 @@
</span><span class="cx">         bool canMakePayments = paymentCoordinator.canMakePayments();
</span><span class="cx"> 
</span><span class="cx">         RunLoop::main().dispatch([promise, canMakePayments]() mutable {
</span><del>-            promise-&gt;resolve(canMakePayments);
</del><ins>+            promise-&gt;resolve&lt;IDLBoolean&gt;(canMakePayments);
</ins><span class="cx">         });
</span><span class="cx">         return { };
</span><span class="cx">     }
</span><span class="lines">@@ -743,7 +743,7 @@
</span><span class="cx">     auto&amp; paymentCoordinator = document.frame()-&gt;mainFrame().paymentCoordinator();
</span><span class="cx"> 
</span><span class="cx">     paymentCoordinator.canMakePaymentsWithActiveCard(merchantIdentifier, document.domain(), [promise](bool canMakePayments) mutable {
</span><del>-        promise-&gt;resolve(canMakePayments);
</del><ins>+        promise-&gt;resolve&lt;IDLBoolean&gt;(canMakePayments);
</ins><span class="cx">     });
</span><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="lines">@@ -768,7 +768,7 @@
</span><span class="cx">     auto&amp; paymentCoordinator = document.frame()-&gt;mainFrame().paymentCoordinator();
</span><span class="cx"> 
</span><span class="cx">     paymentCoordinator.openPaymentSetup(merchantIdentifier, document.domain(), [promise](bool result) mutable {
</span><del>-        promise-&gt;resolve(result);
</del><ins>+        promise-&gt;resolve&lt;IDLBoolean&gt;(result);
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     return { };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesencryptedmedialegacyWebKitMediaKeyscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/encryptedmedia/legacy/WebKitMediaKeys.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/encryptedmedia/legacy/WebKitMediaKeys.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/encryptedmedia/legacy/WebKitMediaKeys.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;HTMLMediaElement.h&quot;
</span><span class="cx"> #include &quot;WebKitMediaKeySession.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -107,7 +107,7 @@
</span><span class="cx"> void FetchBody::text(FetchBodyOwner&amp; owner, Ref&lt;DeferredPromise&gt;&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (isText()) {
</span><del>-        promise-&gt;resolve(textBody());
</del><ins>+        promise-&gt;resolve&lt;IDLDOMString&gt;(textBody());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_consumer.setType(FetchBodyConsumer::Type::Text);
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">     }
</span><span class="cx">     if (isFormData()) {
</span><span class="cx">         // FIXME: Support consuming FormData.
</span><del>-        promise-&gt;reject(0);
</del><ins>+        promise-&gt;reject();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_consumer.resolve(WTFMove(promise));
</span><span class="lines">@@ -212,7 +212,7 @@
</span><span class="cx"> void FetchBody::loadingFailed()
</span><span class="cx"> {
</span><span class="cx">     if (m_consumePromise) {
</span><del>-        m_consumePromise-&gt;reject(0);
</del><ins>+        m_consumePromise-&gt;reject();
</ins><span class="cx">         m_consumePromise = nullptr;
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyConsumercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -65,13 +65,13 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(WTFMove(promise), data, length);
</span><span class="cx">         return;
</span><span class="cx">     case Type::Blob:
</span><del>-        promise-&gt;resolveWithNewlyCreated(blobFromData(data, length, m_contentType));
</del><ins>+        promise-&gt;resolveWithNewlyCreated&lt;IDLInterface&lt;Blob&gt;&gt;(blobFromData(data, length, m_contentType).get());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::JSON:
</span><span class="cx">         fulfillPromiseWithJSON(WTFMove(promise), textFromUTF8(data, length));
</span><span class="cx">         return;
</span><span class="cx">     case Type::Text:
</span><del>-        promise-&gt;resolve(textFromUTF8(data, length));
</del><ins>+        promise-&gt;resolve&lt;IDLDOMString&gt;(textFromUTF8(data, length));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::None:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -87,13 +87,13 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(WTFMove(promise), takeAsArrayBuffer().get());
</span><span class="cx">         return;
</span><span class="cx">     case Type::Blob:
</span><del>-        promise-&gt;resolveWithNewlyCreated(takeAsBlob());
</del><ins>+        promise-&gt;resolveWithNewlyCreated&lt;IDLInterface&lt;Blob&gt;&gt;(takeAsBlob().get());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::JSON:
</span><span class="cx">         fulfillPromiseWithJSON(WTFMove(promise), takeAsText());
</span><span class="cx">         return;
</span><span class="cx">     case Type::Text:
</span><del>-        promise-&gt;resolve(takeAsText());
</del><ins>+        promise-&gt;resolve&lt;IDLDOMString&gt;(takeAsText());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::None:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyOwnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> void FetchBodyOwner::blob(Ref&lt;DeferredPromise&gt;&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (isBodyNull()) {
</span><del>-        promise-&gt;resolve(Blob::create(Vector&lt;uint8_t&gt;(), Blob::normalizedContentType(extractMIMETypeFromMediaType(m_contentType))));
</del><ins>+        promise-&gt;resolve&lt;IDLInterface&lt;Blob&gt;&gt;(Blob::create({ }, Blob::normalizedContentType(extractMIMETypeFromMediaType(m_contentType))).get());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><span class="lines">@@ -138,7 +138,7 @@
</span><span class="cx"> void FetchBodyOwner::formData(Ref&lt;DeferredPromise&gt;&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (isBodyNull()) {
</span><del>-        promise-&gt;reject(0);
</del><ins>+        promise-&gt;reject();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><span class="lines">@@ -166,7 +166,7 @@
</span><span class="cx"> void FetchBodyOwner::text(Ref&lt;DeferredPromise&gt;&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (isBodyNull()) {
</span><del>-        promise-&gt;resolve(String());
</del><ins>+        promise-&gt;resolve&lt;IDLDOMString&gt;({ });
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchResponseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">     static Ref&lt;FetchResponse&gt; error(ScriptExecutionContext&amp;);
</span><span class="cx">     static ExceptionOr&lt;Ref&lt;FetchResponse&gt;&gt; redirect(ScriptExecutionContext&amp;, const String&amp; url, int status);
</span><span class="cx"> 
</span><del>-    using FetchPromise = DOMPromise&lt;FetchResponse&gt;;
</del><ins>+    using FetchPromise = DOMPromise&lt;IDLInterface&lt;FetchResponse&gt;&gt;;
</ins><span class="cx">     static void fetch(ScriptExecutionContext&amp;, FetchRequest&amp;, FetchPromise&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     void consume(unsigned, Ref&lt;DeferredPromise&gt;&amp;&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasourceMediaSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;ContentType.h&quot;
</span><span class="cx"> #include &quot;Event.h&quot;
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;HTMLMediaElement.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;MediaSourcePrivate.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasourceSourceBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;BufferSource.h&quot;
</span><span class="cx"> #include &quot;Event.h&quot;
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;GenericEventQueue.h&quot;
</span><span class="cx"> #include &quot;HTMLMediaElement.h&quot;
</span><span class="cx"> #include &quot;InbandTextTrack.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><span class="cx"> 
</span><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;JSDOMPromise.h&quot;
</span><span class="cx"> #include &quot;MediaDeviceInfo.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -48,8 +49,8 @@
</span><span class="cx"> 
</span><span class="cx">     Document* document() const;
</span><span class="cx"> 
</span><del>-    using Promise = DOMPromise&lt;MediaStream&gt;;
-    using EnumerateDevicesPromise = DOMPromise&lt;MediaDeviceInfoVector&gt;;
</del><ins>+    using Promise = DOMPromise&lt;IDLInterface&lt;MediaStream&gt;&gt;;
+    using EnumerateDevicesPromise = DOMPromise&lt;IDLSequence&lt;IDLInterface&lt;MediaDeviceInfo&gt;&gt;&gt;;
</ins><span class="cx"> 
</span><span class="cx">     ExceptionOr&lt;void&gt; getUserMedia(Ref&lt;MediaConstraintsImpl&gt;&amp;&amp; audioConstraints, Ref&lt;MediaConstraintsImpl&gt;&amp;&amp; videoConstraints, Promise&amp;&amp;) const;
</span><span class="cx">     void enumerateDevices(EnumerateDevicesPromise&amp;&amp;) const;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -703,7 +703,7 @@
</span><span class="cx">     return m_mediaEndpoint-&gt;createDataChannelHandler(label, options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender&amp; sender, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender&amp; sender, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&amp;sender] (RTCRtpTransceiver&amp; current) {
</span><span class="cx">         return &amp;current.sender() == &amp;sender;
</span><span class="lines">@@ -723,7 +723,7 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender&amp; sender, const String&amp; mid, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, PeerConnection::VoidPromise&amp; promise)
</del><ins>+void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender&amp; sender, const String&amp; mid, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, DOMPromise&lt;void&gt;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx">     Vector&lt;RefPtr&lt;MediaStream&gt;&gt; getRemoteStreams() const override;
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;RTCRtpReceiver&gt; createReceiver(const String&amp; transceiverMid, const String&amp; trackKind, const String&amp; trackId) override;
</span><del>-    void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;&amp;) override;
</del><ins>+    void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     bool isNegotiationNeeded() const override { return m_negotiationNeeded; };
</span><span class="cx">     void markAsNeedingNegotiation() override;
</span><span class="lines">@@ -96,7 +96,7 @@
</span><span class="cx"> 
</span><span class="cx">     void addIceCandidateTask(RTCIceCandidate&amp;);
</span><span class="cx"> 
</span><del>-    void replaceTrackTask(RTCRtpSender&amp;, const String&amp; mid, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;);
</del><ins>+    void replaceTrackTask(RTCRtpSender&amp;, const String&amp; mid, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     bool localDescriptionTypeValidForState(RTCSessionDescription::SdpType) const;
</span><span class="cx">     bool remoteDescriptionTypeValidForState(RTCSessionDescription::SdpType) const;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx">         if (!weakThis || !weakThis-&gt;m_promise)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        weakThis-&gt;m_promise-&gt;reject(OverconstrainedError::create(failedConstraint, message).get());
</del><ins>+        weakThis-&gt;m_promise-&gt;rejectType&lt;IDLInterface&lt;OverconstrainedError&gt;&gt;(OverconstrainedError::create(failedConstraint, message).get());
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     std::function&lt;void()&gt; successHandler = [weakThis]() {
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PeerConnectionBackend::setLocalDescription(RTCSessionDescription&amp; sessionDescription, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void PeerConnectionBackend::setLocalDescription(RTCSessionDescription&amp; sessionDescription, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_peerConnection.internalSignalingState() != PeerConnectionStates::SignalingState::Closed);
</span><span class="cx"> 
</span><span class="lines">@@ -185,7 +185,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PeerConnectionBackend::setRemoteDescription(RTCSessionDescription&amp; sessionDescription, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void PeerConnectionBackend::setRemoteDescription(RTCSessionDescription&amp; sessionDescription, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_peerConnection.internalSignalingState() != PeerConnectionStates::SignalingState::Closed);
</span><span class="cx"> 
</span><span class="lines">@@ -224,7 +224,7 @@
</span><span class="cx">     m_setDescriptionPromise = std::nullopt;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PeerConnectionBackend::addIceCandidate(RTCIceCandidate&amp; iceCandidate, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void PeerConnectionBackend::addIceCandidate(RTCIceCandidate&amp; iceCandidate, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_peerConnection.internalSignalingState() != PeerConnectionStates::SignalingState::Closed);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -59,9 +59,8 @@
</span><span class="cx"> struct RTCOfferOptions;
</span><span class="cx"> 
</span><span class="cx"> namespace PeerConnection {
</span><del>-typedef DOMPromise&lt;RTCSessionDescription&gt; SessionDescriptionPromise;
-typedef DOMPromise&lt;void&gt; VoidPromise;
-typedef DOMPromise&lt;RTCStatsResponse&gt; StatsPromise;
</del><ins>+using SessionDescriptionPromise = DOMPromise&lt;IDLInterface&lt;RTCSessionDescription&gt;&gt;;
+using StatsPromise = DOMPromise&lt;IDLInterface&lt;RTCStatsResponse&gt;&gt;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> typedef std::unique_ptr&lt;PeerConnectionBackend&gt; (*CreatePeerConnectionBackend)(RTCPeerConnection&amp;);
</span><span class="lines">@@ -75,9 +74,9 @@
</span><span class="cx"> 
</span><span class="cx">     void createOffer(RTCOfferOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;);
</span><span class="cx">     void createAnswer(RTCAnswerOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;);
</span><del>-    void setLocalDescription(RTCSessionDescription&amp;, PeerConnection::VoidPromise&amp;&amp;);
-    void setRemoteDescription(RTCSessionDescription&amp;, PeerConnection::VoidPromise&amp;&amp;);
-    void addIceCandidate(RTCIceCandidate&amp;, PeerConnection::VoidPromise&amp;&amp;);
</del><ins>+    void setLocalDescription(RTCSessionDescription&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
+    void setRemoteDescription(RTCSessionDescription&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
+    void addIceCandidate(RTCIceCandidate&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     virtual std::unique_ptr&lt;RTCDataChannelHandler&gt; createDataChannelHandler(const String&amp;, const RTCDataChannelInit&amp;) = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -98,7 +97,7 @@
</span><span class="cx">     virtual Vector&lt;RefPtr&lt;MediaStream&gt;&gt; getRemoteStreams() const = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual Ref&lt;RTCRtpReceiver&gt; createReceiver(const String&amp; transceiverMid, const String&amp; trackKind, const String&amp; trackId) = 0;
</span><del>-    virtual void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;&amp;) = 0;
</del><ins>+    virtual void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual bool isNegotiationNeeded() const = 0;
</span><span class="cx">     virtual void markAsNeedingNegotiation() = 0;
</span><span class="lines">@@ -140,8 +139,8 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     std::optional&lt;PeerConnection::SessionDescriptionPromise&gt; m_offerAnswerPromise;
</span><del>-    std::optional&lt;PeerConnection::VoidPromise&gt; m_setDescriptionPromise;
-    std::optional&lt;PeerConnection::VoidPromise&gt; m_addIceCandidatePromise;
</del><ins>+    std::optional&lt;DOMPromise&lt;void&gt;&gt; m_setDescriptionPromise;
+    std::optional&lt;DOMPromise&lt;void&gt;&gt; m_addIceCandidatePromise;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -228,7 +228,7 @@
</span><span class="cx">     m_backend-&gt;createAnswer(WTFMove(options), WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RTCPeerConnection::queuedSetLocalDescription(RTCSessionDescription&amp; description, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void RTCPeerConnection::queuedSetLocalDescription(RTCSessionDescription&amp; description, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_signalingState == SignalingState::Closed) {
</span><span class="cx">         promise.reject(INVALID_STATE_ERR);
</span><span class="lines">@@ -253,7 +253,7 @@
</span><span class="cx">     return m_backend-&gt;pendingLocalDescription();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RTCPeerConnection::queuedSetRemoteDescription(RTCSessionDescription&amp; description, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void RTCPeerConnection::queuedSetRemoteDescription(RTCSessionDescription&amp; description, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_signalingState == SignalingState::Closed) {
</span><span class="cx">         promise.reject(INVALID_STATE_ERR);
</span><span class="lines">@@ -278,7 +278,7 @@
</span><span class="cx">     return m_backend-&gt;pendingRemoteDescription();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RTCPeerConnection::queuedAddIceCandidate(RTCIceCandidate&amp; rtcCandidate, VoidPromise&amp;&amp; promise)
</del><ins>+void RTCPeerConnection::queuedAddIceCandidate(RTCIceCandidate&amp; rtcCandidate, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_signalingState == SignalingState::Closed) {
</span><span class="cx">         promise.reject(INVALID_STATE_ERR);
</span><span class="lines">@@ -469,7 +469,7 @@
</span><span class="cx">     dispatchEvent(event);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RTCPeerConnection::replaceTrack(RTCRtpSender&amp; sender, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+void RTCPeerConnection::replaceTrack(RTCRtpSender&amp; sender, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     m_backend-&gt;replaceTrack(sender, WTFMove(withTrack), WTFMove(promise));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -90,12 +90,12 @@
</span><span class="cx">     void queuedCreateOffer(RTCOfferOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;);
</span><span class="cx">     void queuedCreateAnswer(RTCAnswerOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;);
</span><span class="cx"> 
</span><del>-    void queuedSetLocalDescription(RTCSessionDescription&amp;, PeerConnection::VoidPromise&amp;&amp;);
</del><ins>+    void queuedSetLocalDescription(RTCSessionDescription&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
</ins><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; localDescription() const;
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; currentLocalDescription() const;
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; pendingLocalDescription() const;
</span><span class="cx"> 
</span><del>-    void queuedSetRemoteDescription(RTCSessionDescription&amp;, PeerConnection::VoidPromise&amp;&amp;);
</del><ins>+    void queuedSetRemoteDescription(RTCSessionDescription&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
</ins><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; remoteDescription() const;
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; currentRemoteDescription() const;
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; pendingRemoteDescription() const;
</span><span class="lines">@@ -102,7 +102,7 @@
</span><span class="cx"> 
</span><span class="cx">     String signalingState() const;
</span><span class="cx"> 
</span><del>-    void queuedAddIceCandidate(RTCIceCandidate&amp;, PeerConnection::VoidPromise&amp;&amp;);
</del><ins>+    void queuedAddIceCandidate(RTCIceCandidate&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     String iceGatheringState() const;
</span><span class="cx">     String iceConnectionState() const;
</span><span class="lines">@@ -155,7 +155,7 @@
</span><span class="cx">     bool canSuspendForDocumentSuspension() const final;
</span><span class="cx"> 
</span><span class="cx">     // RTCRtpSenderClient
</span><del>-    void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;&amp;) final;
</del><ins>+    void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) final;
</ins><span class="cx"> 
</span><span class="cx">     PeerConnectionStates::SignalingState m_signalingState { PeerConnectionStates::SignalingState::Stable };
</span><span class="cx">     PeerConnectionStates::IceGatheringState m_iceGatheringState { PeerConnectionStates::IceGatheringState::New };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpSendercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">     m_track = WTFMove(track);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ExceptionOr&lt;void&gt; RTCRtpSender::replaceTrack(Ref&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, PeerConnection::VoidPromise&amp;&amp; promise)
</del><ins>+ExceptionOr&lt;void&gt; RTCRtpSender::replaceTrack(Ref&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, DOMPromise&lt;void&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (isStopped()) {
</span><span class="cx">         promise.reject(INVALID_STATE_ERR);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpSenderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> class RTCRtpSenderClient {
</span><span class="cx"> public:
</span><del>-    virtual void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;&amp;) = 0;
</del><ins>+    virtual void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual ~RTCRtpSenderClient() { }
</span><span class="cx"> };
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">     void stop() { m_client = nullptr; }
</span><span class="cx">     void setTrack(RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;);
</span><span class="cx"> 
</span><del>-    ExceptionOr&lt;void&gt; replaceTrack(Ref&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;&amp;);
</del><ins>+    ExceptionOr&lt;void&gt; replaceTrack(Ref&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     RTCRtpSender(RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, const String&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -212,7 +212,7 @@
</span><span class="cx">         m_promise.reject(NOT_FOUND_ERR);
</span><span class="cx">         break;
</span><span class="cx">     case MediaAccessDenialReason::InvalidConstraint:
</span><del>-        m_promise.reject(OverconstrainedError::create(invalidConstraint, ASCIILiteral(&quot;Invalid constraint&quot;)).get());
</del><ins>+        m_promise.rejectType&lt;IDLInterface&lt;OverconstrainedError&gt;&gt;(OverconstrainedError::create(invalidConstraint, ASCIILiteral(&quot;Invalid constraint&quot;)).get());
</ins><span class="cx">         break;
</span><span class="cx">     case MediaAccessDenialReason::HardwareError:
</span><span class="cx">         m_promise.reject(NotReadableError);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1031,7 +1031,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_state == State::Closed || m_state == State::Interrupted || !m_destinationNode) {
</span><del>-        promise.reject(0);
</del><ins>+        promise.reject();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1060,7 +1060,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_state == State::Closed || !m_destinationNode) {
</span><del>-        promise.reject(0);
</del><ins>+        promise.reject();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformEflcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformEfl.cmake (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformEfl.cmake        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/PlatformEfl.cmake        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -407,7 +407,6 @@
</span><span class="cx">         crypto/CryptoAlgorithm.cpp
</span><span class="cx">         crypto/CryptoAlgorithmRegistry.cpp
</span><span class="cx">         crypto/CryptoKey.cpp
</span><del>-        crypto/CryptoKeyPair.cpp
</del><span class="cx">         crypto/SubtleCrypto.cpp
</span><span class="cx">         crypto/WebKitSubtleCrypto.cpp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformGTK.cmake (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformGTK.cmake        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/PlatformGTK.cmake        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -399,7 +399,6 @@
</span><span class="cx">         crypto/CryptoAlgorithm.cpp
</span><span class="cx">         crypto/CryptoAlgorithmRegistry.cpp
</span><span class="cx">         crypto/CryptoKey.cpp
</span><del>-        crypto/CryptoKeyPair.cpp
</del><span class="cx">         crypto/SubtleCrypto.cpp
</span><span class="cx">         crypto/WebKitSubtleCrypto.cpp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformMaccmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformMac.cmake (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformMac.cmake        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/PlatformMac.cmake        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -180,7 +180,6 @@
</span><span class="cx">     crypto/CryptoAlgorithm.cpp
</span><span class="cx">     crypto/CryptoAlgorithmRegistry.cpp
</span><span class="cx">     crypto/CryptoKey.cpp
</span><del>-    crypto/CryptoKeyPair.cpp
</del><span class="cx">     crypto/SubtleCrypto.cpp
</span><span class="cx">     crypto/WebKitSubtleCrypto.cpp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -6261,9 +6261,7 @@
</span><span class="cx">                 E1ED8AC30CC49BE000BFC557 /* CSSPrimitiveValueMappings.h in Headers */ = {isa = PBXBuildFile; fileRef = E1ED8AC20CC49BE000BFC557 /* CSSPrimitiveValueMappings.h */; };
</span><span class="cx">                 E1F1E82F0C3C2BB9006DB391 /* XSLTExtensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1F1E82D0C3C2BB9006DB391 /* XSLTExtensions.cpp */; };
</span><span class="cx">                 E1F1E8300C3C2BB9006DB391 /* XSLTExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = E1F1E82E0C3C2BB9006DB391 /* XSLTExtensions.h */; };
</span><del>-                E1F80B8718317252007885C3 /* CryptoKeyPair.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1F80B8518317252007885C3 /* CryptoKeyPair.cpp */; };
-                E1F80B8818317252007885C3 /* CryptoKeyPair.h in Headers */ = {isa = PBXBuildFile; fileRef = E1F80B8618317252007885C3 /* CryptoKeyPair.h */; };
-                E1F80B8A183172A2007885C3 /* JSCryptoKeyPairCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1F80B89183172A2007885C3 /* JSCryptoKeyPairCustom.cpp */; };
</del><ins>+                E1F80B8818317252007885C3 /* CryptoKeyPair.h in Headers */ = {isa = PBXBuildFile; fileRef = E1F80B8618317252007885C3 /* CryptoKeyPair.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 E1F80B8D183172B5007885C3 /* JSCryptoKeyPair.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1F80B8B183172B5007885C3 /* JSCryptoKeyPair.cpp */; };
</span><span class="cx">                 E1F80B8E183172B5007885C3 /* JSCryptoKeyPair.h in Headers */ = {isa = PBXBuildFile; fileRef = E1F80B8C183172B5007885C3 /* JSCryptoKeyPair.h */; };
</span><span class="cx">                 E1FE13641834351100892F13 /* CryptoDigestCommonCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1FE13621834351100892F13 /* CryptoDigestCommonCrypto.cpp */; };
</span><span class="lines">@@ -9770,8 +9768,8 @@
</span><span class="cx">                 5DB1BC6810715A6400EFAA49 /* TransformSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformSource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5DB1BC6910715A6400EFAA49 /* TransformSourceLibxslt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TransformSourceLibxslt.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5DFEBAB618592B6D00C75BEB /* WebKitAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitAvailability.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                5E16A2E21BFA64FB0029A21E /* MediaEndpointPeerConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaEndpointPeerConnection.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                5E16A2E31BFA64FB0029A21E /* MediaEndpointPeerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaEndpointPeerConnection.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                5E16A2E21BFA64FB0029A21E /* MediaEndpointPeerConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = MediaEndpointPeerConnection.cpp; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
+                5E16A2E31BFA64FB0029A21E /* MediaEndpointPeerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = MediaEndpointPeerConnection.h; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
</ins><span class="cx">                 5E2C434D1BCEE2E50001E2BC /* PeerConnectionBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeerConnectionBackend.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5E2C434F1BCEE2E50001E2BC /* RTCConfiguration.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCConfiguration.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5E2C43541BCEE30D0001E2BC /* RTCPeerConnection.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = RTCPeerConnection.js; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -14261,9 +14259,7 @@
</span><span class="cx">                 E1F1E82D0C3C2BB9006DB391 /* XSLTExtensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XSLTExtensions.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E1F1E82E0C3C2BB9006DB391 /* XSLTExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XSLTExtensions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E1F80B8418317247007885C3 /* CryptoKeyPair.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = CryptoKeyPair.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                E1F80B8518317252007885C3 /* CryptoKeyPair.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CryptoKeyPair.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 E1F80B8618317252007885C3 /* CryptoKeyPair.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoKeyPair.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                E1F80B89183172A2007885C3 /* JSCryptoKeyPairCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCryptoKeyPairCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 E1F80B8B183172B5007885C3 /* JSCryptoKeyPair.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCryptoKeyPair.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E1F80B8C183172B5007885C3 /* JSCryptoKeyPair.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCryptoKeyPair.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E1FE13621834351100892F13 /* CryptoDigestCommonCrypto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CryptoDigestCommonCrypto.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -22050,7 +22046,6 @@
</span><span class="cx">                                 A584FE371864DAC100843B10 /* JSCommandLineAPIHostCustom.cpp */,
</span><span class="cx">                                 7CEF26181D6A92E300BE905D /* JSCryptoCustom.cpp */,
</span><span class="cx">                                 E157A8E618184C67009F821D /* JSCryptoKeyCustom.cpp */,
</span><del>-                                E1F80B89183172A2007885C3 /* JSCryptoKeyPairCustom.cpp */,
</del><span class="cx">                                 BC46C1ED0C0DDBDF0020CFC3 /* JSCSSRuleCustom.cpp */,
</span><span class="cx">                                 AD726FE916D9F40A003A4E6D /* JSCSSRuleCustom.h */,
</span><span class="cx">                                 9392262E10321084006E7D5D /* JSCSSRuleListCustom.cpp */,
</span><span class="lines">@@ -23199,7 +23194,6 @@
</span><span class="cx">                                 E157A8E318173A3A009F821D /* CryptoKey.h */,
</span><span class="cx">                                 E157A8DC18172C2C009F821D /* CryptoKey.idl */,
</span><span class="cx">                                 E125F85D182C2DF600D84CD9 /* CryptoKeyData.h */,
</span><del>-                                E1F80B8518317252007885C3 /* CryptoKeyPair.cpp */,
</del><span class="cx">                                 E1F80B8618317252007885C3 /* CryptoKeyPair.h */,
</span><span class="cx">                                 E1F80B8418317247007885C3 /* CryptoKeyPair.idl */,
</span><span class="cx">                                 E125F855182C0F8300D84CD9 /* CryptoKeySerialization.h */,
</span><span class="lines">@@ -29032,7 +29026,6 @@
</span><span class="cx">                                 E1C266DE18319F31003F8B33 /* CryptoKeyDataRSAComponents.cpp in Sources */,
</span><span class="cx">                                 E125F8351822F18A00D84CD9 /* CryptoKeyHMAC.cpp in Sources */,
</span><span class="cx">                                 E19AC3F9182566F700349426 /* CryptoKeyMac.cpp in Sources */,
</span><del>-                                E1F80B8718317252007885C3 /* CryptoKeyPair.cpp in Sources */,
</del><span class="cx">                                 57E2336B1DCC262400F28D01 /* CryptoKeyRSA.cpp in Sources */,
</span><span class="cx">                                 E164FAA518315E1A00DB4E61 /* CryptoKeyRSAMac.cpp in Sources */,
</span><span class="cx">                                 E125F859182C1AA600D84CD9 /* CryptoKeySerializationRaw.cpp in Sources */,
</span><span class="lines">@@ -29813,7 +29806,6 @@
</span><span class="cx">                                 E157A8E01817331C009F821D /* JSCryptoKey.cpp in Sources */,
</span><span class="cx">                                 E157A8E818184C67009F821D /* JSCryptoKeyCustom.cpp in Sources */,
</span><span class="cx">                                 E1F80B8D183172B5007885C3 /* JSCryptoKeyPair.cpp in Sources */,
</span><del>-                                E1F80B8A183172A2007885C3 /* JSCryptoKeyPairCustom.cpp in Sources */,
</del><span class="cx">                                 E125F85118283A5600D84CD9 /* JSCryptoKeySerializationJWK.cpp in Sources */,
</span><span class="cx">                                 E125F83D182411E700D84CD9 /* JSCryptoOperationData.cpp in Sources */,
</span><span class="cx">                                 409EBDC516B7F3CA00CBA3FC /* JSCSSFontFaceLoadEvent.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsgenericIDLTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/generic/IDLTypes.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -40,15 +40,12 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class Dictionary;
-class EventListener;
-class XPathNSResolver;
</del><ins>+template&lt;typename&gt; class DOMPromise;
</ins><span class="cx"> 
</span><del>-template &lt;typename Value&gt; class DOMPromise;
-
</del><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> struct IDLType {
</span><span class="cx">     using ImplementationType = T;
</span><ins>+    using ParameterType = T;
</ins><span class="cx"> 
</span><span class="cx">     using NullableType = std::optional&lt;ImplementationType&gt;;
</span><span class="cx">     static NullableType nullValue() { return std::nullopt; }
</span><span class="lines">@@ -87,6 +84,8 @@
</span><span class="cx"> struct IDLUnrestrictedDouble : IDLFloatingPoint&lt;double, true&gt; { };
</span><span class="cx"> 
</span><span class="cx"> struct IDLString : IDLType&lt;String&gt; {
</span><ins>+    using ParameterType = const String&amp;;
+
</ins><span class="cx">     using NullableType = String;
</span><span class="cx">     static String nullValue() { return String(); }
</span><span class="cx">     static bool isNullValue(const String&amp; value) { return value.isNull(); }
</span><span class="lines">@@ -100,8 +99,10 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt; struct IDLWrapper : IDLType&lt;RefPtr&lt;T&gt;&gt; {
</span><span class="cx">     using RawType = T;
</span><ins>+
+    using ParameterType = T&amp;;
+
</ins><span class="cx">     using NullableType = RefPtr&lt;T&gt;;
</span><del>-
</del><span class="cx">     static inline std::nullptr_t nullValue() { return nullptr; }
</span><span class="cx">     template&lt;typename U&gt; static inline bool isNullValue(U&amp;&amp; value) { return !value; }
</span><span class="cx">     template&lt;typename U&gt; static inline U&amp;&amp; extractValueFromNullable(U&amp;&amp; value) { return std::forward&lt;U&gt;(value); }
</span><span class="lines">@@ -111,7 +112,10 @@
</span><span class="cx"> template&lt;typename T&gt; struct IDLCallbackInterface : IDLWrapper&lt;T&gt; { };
</span><span class="cx"> template&lt;typename T&gt; struct IDLCallbackFunction : IDLWrapper&lt;T&gt; { };
</span><span class="cx"> 
</span><del>-template&lt;typename T&gt; struct IDLDictionary : IDLType&lt;T&gt; { };
</del><ins>+template&lt;typename T&gt; struct IDLDictionary : IDLType&lt;T&gt; {
+    using ParameterType = const T&amp;;
+};
+
</ins><span class="cx"> template&lt;typename T&gt; struct IDLEnumeration : IDLType&lt;T&gt; { };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt; struct IDLNullable : IDLType&lt;typename T::NullableType&gt; {
</span><span class="lines">@@ -120,15 +124,21 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt; struct IDLSequence : IDLType&lt;Vector&lt;typename T::ImplementationType&gt;&gt; {
</span><span class="cx">     using InnerType = T;
</span><ins>+
+    using ParameterType = const Vector&lt;typename T::ImplementationType&gt;&amp;;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt; struct IDLFrozenArray : IDLType&lt;Vector&lt;typename T::ImplementationType&gt;&gt; {
</span><span class="cx">     using InnerType = T;
</span><ins>+
+    using ParameterType = const Vector&lt;typename T::ImplementationType&gt;&amp;;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename K, typename V&gt; struct IDLRecord : IDLType&lt;HashMap&lt;typename K::ImplementationType, typename V::ImplementationType&gt;&gt; {
</span><span class="cx">     using KeyType = K;
</span><span class="cx">     using ValueType = V;
</span><ins>+
+    using ParameterType = const HashMap&lt;typename K::ImplementationType, typename V::ImplementationType&gt;&amp;;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt; struct IDLPromise : IDLType&lt;DOMPromise&lt;T&gt;&gt; {
</span><span class="lines">@@ -141,6 +151,8 @@
</span><span class="cx"> template&lt;typename... Ts&gt;
</span><span class="cx"> struct IDLUnion : IDLType&lt;Variant&lt;typename Ts::ImplementationType...&gt;&gt; {
</span><span class="cx">     using TypeList = brigand::list&lt;Ts...&gt;;
</span><ins>+
+    using ParameterType = const Variant&lt;typename Ts::ImplementationType...&gt;&amp;;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // Non-WebIDL extensions
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCryptoKeyPairCustomcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/bindings/js/JSCryptoKeyPairCustom.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCryptoKeyPairCustom.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSCryptoKeyPairCustom.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1,43 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 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.
- */
-
-#include &quot;config.h&quot;
-#include &quot;JSCryptoKeyPair.h&quot;
-
-#include &lt;heap/SlotVisitorInlines.h&gt;
-
-#if ENABLE(SUBTLE_CRYPTO)
-
-namespace WebCore {
-
-void JSCryptoKeyPair::visitAdditionalChildren(JSC::SlotVisitor&amp; visitor)
-{
-    visitor.addOpaqueRoot(wrapped().publicKey());
-    visitor.addOpaqueRoot(wrapped().privateKey());
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(SUBTLE_CRYPTO)
</del></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCustomElementRegistryCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -171,7 +171,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (registry.findInterface(localName)) {
</span><del>-        DeferredPromise::create(globalObject, promiseDeferred)-&gt;resolve(nullptr);
</del><ins>+        DeferredPromise::create(globalObject, promiseDeferred)-&gt;resolve();
</ins><span class="cx">         return promiseDeferred.promise();
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMConverth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMConvert.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1066,6 +1066,16 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;typename T&gt; struct JSConverter&lt;IDLDictionary&lt;T&gt;&gt; {
+    static constexpr bool needsState = true;
+    static constexpr bool needsGlobalObject = true;
+
+    static JSC::JSValue convert(JSC::ExecState&amp; state, JSDOMGlobalObject&amp; globalObject, const T&amp; dictionary)
+    {
+        return convertDictionaryToJS(state, globalObject, dictionary);
+    }
+};
+
</ins><span class="cx"> // MARK: -
</span><span class="cx"> // MARK: Enumeration type
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromisecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -89,6 +89,30 @@
</span><span class="cx">     clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DeferredPromise::reject()
+{
+    if (isSuspended())
+        return;
+
+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
+    auto&amp; state = *m_globalObject-&gt;globalExec();
+    JSC::JSLockHolder locker(&amp;state);
+    reject(state, JSC::jsUndefined());
+}
+
+void DeferredPromise::reject(std::nullptr_t)
+{
+    if (isSuspended())
+        return;
+
+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
+    auto&amp; state = *m_globalObject-&gt;globalExec();
+    JSC::JSLockHolder locker(&amp;state);
+    reject(state, JSC::jsNull());
+}
+
</ins><span class="cx"> void DeferredPromise::reject(Exception&amp;&amp; exception)
</span><span class="cx"> {
</span><span class="cx">     if (isSuspended())
</span><span class="lines">@@ -113,6 +137,18 @@
</span><span class="cx">     reject(*state, createDOMException(state, ec, message));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DeferredPromise::reject(const JSC::PrivateName&amp; privateName)
+{
+    if (isSuspended())
+        return;
+
+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
+    JSC::ExecState* state = m_globalObject-&gt;globalExec();
+    JSC::JSLockHolder locker(state);
+    reject(*state, toJS(state, m_globalObject.get(), privateName));
+}
+
</ins><span class="cx"> void rejectPromiseWithExceptionIfAny(JSC::ExecState&amp; state, JSDOMGlobalObject&amp; globalObject, JSPromiseDeferred&amp; promiseDeferred)
</span><span class="cx"> {
</span><span class="cx">     VM&amp; vm = state.vm();
</span><span class="lines">@@ -124,7 +160,7 @@
</span><span class="cx">     JSValue error = scope.exception()-&gt;value();
</span><span class="cx">     scope.clearException();
</span><span class="cx"> 
</span><del>-    DeferredPromise::create(globalObject, promiseDeferred)-&gt;reject(error);
</del><ins>+    DeferredPromise::create(globalObject, promiseDeferred)-&gt;reject&lt;IDLAny&gt;(error);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;DeferredPromise&gt; createDeferredPromise(JSC::ExecState&amp; state, JSDOMWindow&amp; domWindow)
</span><span class="lines">@@ -166,16 +202,16 @@
</span><span class="cx">     if (!value)
</span><span class="cx">         promise-&gt;reject(SYNTAX_ERR);
</span><span class="cx">     else
</span><del>-        promise-&gt;resolve(value);
</del><ins>+        promise-&gt;resolve&lt;IDLAny&gt;(value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void fulfillPromiseWithArrayBuffer(Ref&lt;DeferredPromise&gt;&amp;&amp; promise, ArrayBuffer* arrayBuffer)
</span><span class="cx"> {
</span><span class="cx">     if (!arrayBuffer) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createOutOfMemoryError(promise-&gt;globalObject()-&gt;globalExec()));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createOutOfMemoryError(promise-&gt;globalObject()-&gt;globalExec()));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><del>-    promise-&gt;resolve(arrayBuffer);
</del><ins>+    promise-&gt;resolve&lt;IDLInterface&lt;ArrayBuffer&gt;&gt;(*arrayBuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void fulfillPromiseWithArrayBuffer(Ref&lt;DeferredPromise&gt;&amp;&amp; promise, const void* data, size_t length)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromiseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -26,81 +26,12 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ActiveDOMCallback.h&quot;
</span><del>-#include &quot;JSDOMBinding.h&quot;
</del><ins>+#include &quot;JSDOMConvert.h&quot;
</ins><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSPromiseDeferred.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-template&lt;typename DOMClass&gt;
-struct TypeInspector {
-private:
-    template&lt;typename T&gt; static constexpr auto testIsVector(int) -&gt; decltype(std::declval&lt;T&gt;().shrinkToFit(), bool()) { return true; }
-    template&lt;typename T&gt; static constexpr bool testIsVector(...) { return false; }
-
-    template&lt;typename T&gt; static constexpr auto testIsRef(int) -&gt; decltype(T::isRef) { return true; }
-    template&lt;typename T&gt; static constexpr bool testIsRef(...) { return false; }
-
-    template&lt;typename T&gt; static constexpr auto testIsRefPtr(int) -&gt; decltype(T::isRefPtr) { return true; }
-    template&lt;typename T&gt; static constexpr bool testIsRefPtr(...) { return false; }
-
-public:
-    static constexpr bool isRefOrRefPtr = testIsRef&lt;DOMClass&gt;(0) || testIsRefPtr&lt;DOMClass&gt;(0);
-    static constexpr bool isPassByValueType = std::is_pointer&lt;DOMClass&gt;::value
-        || std::is_same&lt;DOMClass, std::nullptr_t&gt;::value
-        || std::is_same&lt;DOMClass, JSC::JSValue&gt;::value
-        || std::is_same&lt;DOMClass, bool&gt;::value;
-    static constexpr bool isPassByConstRefType = testIsVector&lt;DOMClass&gt;(0)
-        || std::is_same&lt;DOMClass, String&gt;::value;
-};
-
-template&lt;typename DOMClass, typename Enable = void&gt;
-struct PromiseResultInspector {
-public:
-    static constexpr bool passByValue = false;
-    static constexpr bool passByRef = true;
-    static constexpr bool passByURef = false;
-    static constexpr bool passByConstRef = false;
-
-    typedef DOMClass&amp; Type;
-};
-
-template&lt;&gt;
-struct PromiseResultInspector&lt;void&gt; {
-public:
-    typedef int Type;
-};
-
-template&lt;typename DOMClass&gt;
-struct PromiseResultInspector&lt;DOMClass, typename std::enable_if&lt;TypeInspector&lt;DOMClass&gt;::isPassByValueType&gt;::type&gt; {
-public:
-    static constexpr bool passByValue = true;
-    static constexpr bool passByRef = false;
-    static constexpr bool passByURef = false;
-    static constexpr bool passByConstRef = false;
-
-    typedef DOMClass Type;
-};
-
-template&lt;typename DOMClass&gt;
-struct PromiseResultInspector&lt;DOMClass, typename std::enable_if&lt;TypeInspector&lt;DOMClass&gt;::isPassByConstRefType&gt;::type&gt; {
-public:
-    static constexpr bool passByValue = false;
-    static constexpr bool passByRef = false;
-    static constexpr bool passByURef = false;
-    static constexpr bool passByConstRef = true;
-
-    typedef const DOMClass&amp; Type;
-};
-
-template&lt;typename DOMClass&gt;
-struct PromiseResultInspector&lt;DOMClass, typename std::enable_if&lt;TypeInspector&lt;DOMClass&gt;::isRefOrRefPtr&gt;::type&gt; {
-    static constexpr bool passByValue = false;
-    static constexpr bool passByRef = false;
-    static constexpr bool passByURef = true;
-    static constexpr bool passByConstRef = false;
-};
-
</del><span class="cx"> class DeferredPromise : public RefCounted&lt;DeferredPromise&gt;, public ActiveDOMCallback {
</span><span class="cx"> public:
</span><span class="cx">     static Ref&lt;DeferredPromise&gt; create(JSDOMGlobalObject&amp; globalObject, JSC::JSPromiseDeferred&amp; deferred)
</span><span class="lines">@@ -110,28 +41,58 @@
</span><span class="cx"> 
</span><span class="cx">     ~DeferredPromise();
</span><span class="cx"> 
</span><del>-    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByValue, void&gt;::type
-    resolve(ResolveResultType result) { resolveWithValue(result); }
-    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByRef, void&gt;::type
-    resolve(ResolveResultType&amp; result) { resolveWithValue(result); }
-    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByURef, void&gt;::type
-    resolve(ResolveResultType&amp;&amp; result) { resolveWithValue(std::forward&lt;ResolveResultType&gt;(result)); }
-    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByConstRef, void&gt;::type
-    resolve(const ResolveResultType&amp; result) { resolveWithValue(result); }
</del><ins>+    template&lt;class IDLType&gt; 
+    void resolve(typename IDLType::ParameterType value)
+    {
+        if (isSuspended())
+            return;
+        ASSERT(m_deferred);
+        ASSERT(m_globalObject);
+        JSC::ExecState* exec = m_globalObject-&gt;globalExec();
+        JSC::JSLockHolder locker(exec);
+        resolve(*exec, toJS&lt;IDLType&gt;(*exec, *m_globalObject.get(), std::forward&lt;typename IDLType::ParameterType&gt;(value)));
+    }
</ins><span class="cx"> 
</span><del>-    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByValue, void&gt;::type
-    reject(RejectResultType result) { rejectWithValue(result); }
-    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByRef, void&gt;::type
-    reject(RejectResultType&amp; result) { rejectWithValue(result); }
-    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByURef, void&gt;::type
-    reject(RejectResultType&amp;&amp; result) { rejectWithValue(std::forward&lt;RejectResultType&gt;(result)); }
-    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByConstRef, void&gt;::type
-    reject(const RejectResultType&amp; result) { rejectWithValue(result); }
</del><ins>+    void resolve()
+    {
+        if (isSuspended())
+            return;
+        ASSERT(m_deferred);
+        ASSERT(m_globalObject);
+        JSC::ExecState* exec = m_globalObject-&gt;globalExec();
+        JSC::JSLockHolder locker(exec);
+        resolve(*exec, JSC::jsUndefined());
+    }
</ins><span class="cx"> 
</span><del>-    template&lt;class ResolveResultType&gt; void resolveWithNewlyCreated(Ref&lt;ResolveResultType&gt;&amp;&amp;);
</del><ins>+    template&lt;class IDLType&gt;
+    void resolveWithNewlyCreated(typename IDLType::ParameterType value)
+    {
+        if (isSuspended())
+            return;
+        ASSERT(m_deferred);
+        ASSERT(m_globalObject);
+        JSC::ExecState* exec = m_globalObject-&gt;globalExec();
+        JSC::JSLockHolder locker(exec);
+        resolve(*exec, toJSNewlyCreated&lt;IDLType&gt;(*exec, *m_globalObject.get(), std::forward&lt;typename IDLType::ParameterType&gt;(value)));
+    }
</ins><span class="cx"> 
</span><ins>+    template&lt;class IDLType&gt; 
+    void reject(typename IDLType::ParameterType value)
+    {
+        if (isSuspended())
+            return;
+        ASSERT(m_deferred);
+        ASSERT(m_globalObject);
+        JSC::ExecState* exec = m_globalObject-&gt;globalExec();
+        JSC::JSLockHolder locker(exec);
+        reject(*exec, toJS&lt;IDLType&gt;(*exec, *m_globalObject.get(), std::forward&lt;typename IDLType::ParameterType&gt;(value)));
+    }
+
+    void reject();
+    void reject(std::nullptr_t);
</ins><span class="cx">     void reject(Exception&amp;&amp;);
</span><span class="cx">     void reject(ExceptionCode, const String&amp; = { });
</span><ins>+    void reject(const JSC::PrivateName&amp;);
</ins><span class="cx"> 
</span><span class="cx">     JSC::JSValue promise() const;
</span><span class="cx"> 
</span><span class="lines">@@ -150,13 +111,90 @@
</span><span class="cx">     void resolve(JSC::ExecState&amp; state, JSC::JSValue resolution) { callFunction(state, m_deferred-&gt;resolve(), resolution); }
</span><span class="cx">     void reject(JSC::ExecState&amp; state, JSC::JSValue resolution) { callFunction(state, m_deferred-&gt;reject(), resolution); }
</span><span class="cx"> 
</span><del>-    template&lt;class RejectResultType&gt; void rejectWithValue(RejectResultType&amp;&amp;);
-    template&lt;class ResolveResultType&gt; void resolveWithValue(ResolveResultType&amp;&amp;);
-
</del><span class="cx">     JSC::Weak&lt;JSC::JSPromiseDeferred&gt; m_deferred;
</span><span class="cx">     JSC::Weak&lt;JSDOMGlobalObject&gt; m_globalObject;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class DOMPromiseBase {
+public:
+    DOMPromiseBase(Ref&lt;DeferredPromise&gt;&amp;&amp; genericPromise)
+        : m_promiseDeferred(WTFMove(genericPromise))
+    {
+    }
+
+    DOMPromiseBase(DOMPromiseBase&amp;&amp; promise)
+        : m_promiseDeferred(WTFMove(promise.m_promiseDeferred))
+    {
+    }
+
+    DOMPromiseBase(const DOMPromiseBase&amp; other)
+        : m_promiseDeferred(other.m_promiseDeferred.copyRef())
+    {
+    }
+
+    DOMPromiseBase&amp; operator=(const DOMPromiseBase&amp; other)
+    {
+        m_promiseDeferred = other.m_promiseDeferred.copyRef();
+        return *this;
+    }
+
+    DOMPromiseBase&amp; operator=(DOMPromiseBase&amp;&amp; other)
+    {
+        m_promiseDeferred = WTFMove(other.m_promiseDeferred);
+        return *this;
+    }
+
+    void reject()
+    {
+        m_promiseDeferred-&gt;reject();
+    }
+
+    template&lt;typename... ErrorType&gt; 
+    void reject(ErrorType&amp;&amp;... error)
+    {
+        m_promiseDeferred-&gt;reject(std::forward&lt;ErrorType&gt;(error)...);
+    }
+
+    template&lt;typename IDLType&gt;
+    void rejectType(typename IDLType::ParameterType value)
+    {
+        m_promiseDeferred-&gt;reject&lt;IDLType&gt;(std::forward&lt;typename IDLType::ParameterType&gt;(value));
+    }
+
+    JSC::JSValue promise() const { return m_promiseDeferred-&gt;promise(); };
+
+protected:
+    Ref&lt;DeferredPromise&gt; m_promiseDeferred;
+};
+
+template&lt;typename IDLType&gt; 
+class DOMPromise : public DOMPromiseBase {
+public:
+    using DOMPromiseBase::DOMPromiseBase;
+    using DOMPromiseBase::operator=;
+    using DOMPromiseBase::promise;
+    using DOMPromiseBase::reject;
+
+    void resolve(typename IDLType::ParameterType value)
+    { 
+        m_promiseDeferred-&gt;resolve&lt;IDLType&gt;(std::forward&lt;typename IDLType::ParameterType&gt;(value));
+    }
+};
+
+template&lt;&gt; class DOMPromise&lt;void&gt; : public DOMPromiseBase {
+public:
+    using DOMPromiseBase::DOMPromiseBase;
+    using DOMPromiseBase::operator=;
+    using DOMPromiseBase::promise;
+    using DOMPromiseBase::reject;
+
+    void resolve()
+    { 
+        m_promiseDeferred-&gt;resolve();
+    }
+};
+
+
</ins><span class="cx"> Ref&lt;DeferredPromise&gt; createDeferredPromise(JSC::ExecState&amp;, JSDOMWindow&amp;);
</span><span class="cx"> 
</span><span class="cx"> void fulfillPromiseWithJSON(Ref&lt;DeferredPromise&gt;&amp;&amp;, const String&amp;);
</span><span class="lines">@@ -202,156 +240,4 @@
</span><span class="cx">     return callPromiseFunction&lt;bindingPromiseFunctionAdapter&lt;bindingPromiseFunction&gt;, executionScope&gt;(state);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// At the moment, Value cannot be a Ref&lt;T&gt; or RefPtr&lt;T&gt;, it should be a DOM class.
-template&lt;typename Value&gt; class DOMPromise {
-public:
-    DOMPromise(Ref&lt;DeferredPromise&gt;&amp;&amp; genericPromise) : m_promiseDeferred(WTFMove(genericPromise)) { }
-    DOMPromise(DOMPromise&amp;&amp; promise) : m_promiseDeferred(WTFMove(promise.m_promiseDeferred)) { }
-    DOMPromise(const DOMPromise&amp; other) : m_promiseDeferred(other.m_promiseDeferred.copyRef()) { }
-
-    DOMPromise&amp; operator=(const DOMPromise&amp; other)
-    {
-        m_promiseDeferred = other.copyRef();
-        return *this;
-    }
-
-    DOMPromise&amp; operator=(DOMPromise&amp;&amp; other)
-    {
-        m_promiseDeferred = WTFMove(other.m_promiseDeferred);
-        return *this;
-    }
-
-    template&lt;typename T = Value&gt;
-    typename std::enable_if&lt;!std::is_void&lt;T&gt;::value, void&gt;::type resolve(typename PromiseResultInspector&lt;Value&gt;::Type value) { m_promiseDeferred-&gt;resolve(value); }
-
-    template&lt;typename T = Value&gt;
-    typename std::enable_if&lt;std::is_void&lt;T&gt;::value, void&gt;::type resolve() { m_promiseDeferred-&gt;resolve(nullptr); }
-
-    template&lt;typename... ErrorType&gt; void reject(ErrorType&amp;&amp;... error) { m_promiseDeferred-&gt;reject(std::forward&lt;ErrorType&gt;(error)...); }
-
-    JSC::JSValue promise() const { return m_promiseDeferred-&gt;promise(); };
-
-private:
-    Ref&lt;DeferredPromise&gt; m_promiseDeferred;
-};
-
-template&lt;class ResolveResultType&gt;
-inline void DeferredPromise::resolveWithValue(ResolveResultType&amp;&amp; result)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    resolve(*exec, toJS(exec, m_globalObject.get(), std::forward&lt;ResolveResultType&gt;(result)));
-}
-
-template&lt;class ResolveResultType&gt;
-inline void DeferredPromise::resolveWithNewlyCreated(Ref&lt;ResolveResultType&gt;&amp;&amp; result)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    resolve(*exec, toJSNewlyCreated(exec, m_globalObject.get(), WTFMove(result)));
-}
-
-template&lt;class RejectResultType&gt;
-inline void DeferredPromise::rejectWithValue(RejectResultType&amp;&amp; result)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    reject(*exec, toJS(exec, m_globalObject.get(), std::forward&lt;RejectResultType&gt;(result)));
-}
-
-template&lt;&gt;
-inline void DeferredPromise::resolve(bool result)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    resolve(*exec, JSC::jsBoolean(result));
-}
-
-template&lt;&gt;
-inline void DeferredPromise::resolve(JSC::JSValue value)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    resolve(*exec, value);
-}
-
-template&lt;&gt;
-inline void DeferredPromise::reject(JSC::JSValue value)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    reject(*exec, value);
-}
-
-template&lt;&gt;
-inline void DeferredPromise::resolve(std::nullptr_t)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    resolve(*exec, JSC::jsUndefined());
-}
-
-template&lt;&gt;
-inline void DeferredPromise::reject(std::nullptr_t)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    reject(*exec, JSC::jsNull());
-}
-
-template&lt;&gt;
-inline void DeferredPromise::resolve(const String&amp; result)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    resolve(*exec, jsString(exec, result));
-}
-
-template&lt;&gt;
-inline void DeferredPromise::reject(const String&amp; result)
-{
-    if (isSuspended())
-        return;
-    ASSERT(m_deferred);
-    ASSERT(m_globalObject);
-    JSC::ExecState* exec = m_globalObject-&gt;globalExec();
-    JSC::JSLockHolder locker(exec);
-    reject(*exec, jsString(exec, result));
-}
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMediaDevicesCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;ArrayValue.h&quot;
</span><span class="cx"> #include &quot;Dictionary.h&quot;
</span><span class="cx"> #include &quot;ExceptionCode.h&quot;
</span><ins>+#include &quot;JSDOMPromise.h&quot;
</ins><span class="cx"> #include &quot;JSMediaDevices.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;MediaConstraintsImpl.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -477,7 +477,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 3)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -522,7 +522,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 3)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -567,7 +567,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 3)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -612,7 +612,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 4)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -642,7 +642,7 @@
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx"> 
</span><span class="cx">     auto callback = [capturedPromise = promise.copyRef()](bool result) mutable {
</span><del>-        capturedPromise-&gt;resolve(result);
</del><ins>+        capturedPromise-&gt;resolve&lt;IDLBoolean&gt;(result);
</ins><span class="cx">         return;
</span><span class="cx">     };
</span><span class="cx">     auto exceptionCallback = [capturedPromise = WTFMove(promise)](ExceptionCode ec) mutable {
</span><span class="lines">@@ -660,7 +660,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 2)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -692,7 +692,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 5)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -709,7 +709,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 3)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -726,7 +726,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 3)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -742,22 +742,23 @@
</span><span class="cx">     auto algorithm = createAlgorithm(state, params-&gt;identifier);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx"> 
</span><del>-    auto callback = [capturedPromise = promise.copyRef()](CryptoKey* key, CryptoKeyPair* keyPair) mutable {
-        ASSERT(key || keyPair);
-        ASSERT(!key || !keyPair);
-        if (key) {
-            if ((key-&gt;type() == CryptoKeyType::Private || key-&gt;type() == CryptoKeyType::Secret) &amp;&amp; !key-&gt;usagesBitmap()) {
-                rejectWithException(WTFMove(capturedPromise), SYNTAX_ERR);
-                return;
</del><ins>+    auto callback = [capturedPromise = promise.copyRef()](KeyOrKeyPair&amp;&amp; keyOrKeyPair) mutable {
+        WTF::switchOn(keyOrKeyPair,
+            [&amp;capturedPromise] (RefPtr&lt;CryptoKey&gt;&amp; key) {
+                if ((key-&gt;type() == CryptoKeyType::Private || key-&gt;type() == CryptoKeyType::Secret) &amp;&amp; !key-&gt;usagesBitmap()) {
+                    rejectWithException(WTFMove(capturedPromise), SYNTAX_ERR);
+                    return;
+                }
+                capturedPromise-&gt;resolve&lt;IDLInterface&lt;CryptoKey&gt;&gt;(*key);
+            },
+            [&amp;capturedPromise] (CryptoKeyPair&amp; keyPair) {
+                if (!keyPair.privateKey-&gt;usagesBitmap()) {
+                    rejectWithException(WTFMove(capturedPromise), SYNTAX_ERR);
+                    return;
+                }
+                capturedPromise-&gt;resolve&lt;IDLDictionary&lt;CryptoKeyPair&gt;&gt;(keyPair);
</ins><span class="cx">             }
</span><del>-            capturedPromise-&gt;resolve(key);
-        } else {
-            if (!keyPair-&gt;privateKey()-&gt;usagesBitmap()) {
-                rejectWithException(WTFMove(capturedPromise), SYNTAX_ERR);
-                return;
-            }
-            capturedPromise-&gt;resolve(keyPair);
-        }
</del><ins>+        );
</ins><span class="cx">     };
</span><span class="cx">     auto exceptionCallback = [capturedPromise = WTFMove(promise)](ExceptionCode ec) mutable {
</span><span class="cx">         rejectWithException(WTFMove(capturedPromise), ec);
</span><span class="lines">@@ -775,7 +776,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 5)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -802,7 +803,7 @@
</span><span class="cx">             rejectWithException(WTFMove(capturedPromise), SYNTAX_ERR);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><del>-        capturedPromise-&gt;resolve(key);
</del><ins>+        capturedPromise-&gt;resolve&lt;IDLInterface&lt;CryptoKey&gt;&gt;(key);
</ins><span class="cx">     };
</span><span class="cx">     auto exceptionCallback = [capturedPromise = WTFMove(promise)](ExceptionCode ec) mutable {
</span><span class="cx">         rejectWithException(WTFMove(capturedPromise), ec);
</span><span class="lines">@@ -820,7 +821,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 2)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -851,7 +852,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">         case SubtleCrypto::KeyFormat::Jwk:
</span><del>-            capturedPromise-&gt;resolve(toJSValueFromJsonWebKey(*(capturedPromise-&gt;globalObject()), WTFMove(WTF::get&lt;JsonWebKey&gt;(key))));
</del><ins>+            capturedPromise-&gt;resolve&lt;IDLAny&gt;(toJSValueFromJsonWebKey(*(capturedPromise-&gt;globalObject()), WTFMove(WTF::get&lt;JsonWebKey&gt;(key))));
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -872,7 +873,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 4)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -973,7 +974,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(state.argumentCount() &lt; 7)) {
</span><del>-        promise-&gt;reject&lt;JSValue&gt;(createNotEnoughArgumentsError(&amp;state));
</del><ins>+        promise-&gt;reject&lt;IDLAny&gt;(createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1051,7 +1052,7 @@
</span><span class="cx">                 rejectWithException(WTFMove(promise), SYNTAX_ERR);
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            promise-&gt;resolve(key);
</del><ins>+            promise-&gt;resolve&lt;IDLInterface&lt;CryptoKey&gt;&gt;(key);
</ins><span class="cx">         };
</span><span class="cx">         auto exceptionCallback = [promise = WTFMove(promise)](ExceptionCode ec) mutable {
</span><span class="cx">             rejectWithException(WTFMove(promise), ec);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebKitSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -178,7 +178,7 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</span><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = algorithm-&gt;encrypt(*parameters, *key, data, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -230,7 +230,7 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</span><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = algorithm-&gt;decrypt(*parameters, *key, data, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -282,7 +282,7 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</span><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = algorithm-&gt;sign(*parameters, *key, data, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -337,10 +337,10 @@
</span><span class="cx">     RefPtr&lt;DeferredPromise&gt; wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx">     auto promise = wrapper-&gt;promise();
</span><span class="cx">     auto successCallback = [wrapper](bool result) mutable {
</span><del>-        wrapper-&gt;resolve(result);
</del><ins>+        wrapper-&gt;resolve&lt;IDLBoolean&gt;(result);
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = algorithm-&gt;verify(*parameters, *key, signature, data, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -382,7 +382,7 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</span><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = algorithm-&gt;digest(*parameters, data, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -428,16 +428,18 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;DeferredPromise&gt; wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx">     auto promise = wrapper-&gt;promise();
</span><del>-    auto successCallback = [wrapper](CryptoKey* key, CryptoKeyPair* keyPair) mutable {
-        ASSERT(key || keyPair);
-        ASSERT(!key || !keyPair);
-        if (key)
-            wrapper-&gt;resolve(key);
-        else
-            wrapper-&gt;resolve(keyPair);
</del><ins>+    auto successCallback = [wrapper](KeyOrKeyPair&amp;&amp; keyOrKeyPair) mutable {
+        WTF::switchOn(keyOrKeyPair,
+            [&amp;wrapper] (RefPtr&lt;CryptoKey&gt;&amp; key) {
+                wrapper-&gt;resolve&lt;IDLInterface&lt;CryptoKey&gt;&gt;(*key);
+            },
+            [&amp;wrapper] (CryptoKeyPair&amp; keyPair) {
+                wrapper-&gt;resolve&lt;IDLDictionary&lt;CryptoKeyPair&gt;&gt;(keyPair);
+            }
+        );
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = algorithm-&gt;generateKey(*parameters, extractable, keyUsages, WTFMove(successCallback), WTFMove(failureCallback), *scriptExecutionContextFromExecState(&amp;state));
</span><span class="lines">@@ -555,10 +557,10 @@
</span><span class="cx">     RefPtr&lt;DeferredPromise&gt; wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx">     auto promise = wrapper-&gt;promise();
</span><span class="cx">     auto successCallback = [wrapper](CryptoKey&amp; result) mutable {
</span><del>-        wrapper-&gt;resolve(result);
</del><ins>+        wrapper-&gt;resolve&lt;IDLInterface&lt;CryptoKey&gt;&gt;(result);
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::importKey(state, keyFormat, data, WTFMove(algorithm), WTFMove(parameters), extractable, keyUsages, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -625,7 +627,7 @@
</span><span class="cx">         fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</span><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::exportKey(state, keyFormat, *key, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -680,17 +682,17 @@
</span><span class="cx">             fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), encryptedData.data(), encryptedData.size());
</span><span class="cx">         };
</span><span class="cx">         auto encryptFailureCallback = [wrapper]() mutable {
</span><del>-            wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">         };
</span><span class="cx">         auto result = algorithm-&gt;encryptForWrapKey(*parameters, *wrappingKey, std::make_pair(exportedKeyData.data(), exportedKeyData.size()), WTFMove(encryptSuccessCallback), WTFMove(encryptFailureCallback));
</span><span class="cx">         if (result.hasException()) {
</span><span class="cx">             // FIXME: Report failure details to console, and possibly to calling script once there is a standardized way to pass errors to WebCrypto promise reject functions.
</span><del>-            wrapper-&gt;reject(nullptr);
</del><ins>+            wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto exportFailureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::exportKey(state, keyFormat, *key, WTFMove(exportSuccessCallback), WTFMove(exportFailureCallback));
</span><span class="lines">@@ -771,10 +773,10 @@
</span><span class="cx"> 
</span><span class="cx">     auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithm, unwrappedKeyAlgorithmParameters, extractable, keyUsages, wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         auto importSuccessCallback = [wrapper](CryptoKey&amp; key) mutable {
</span><del>-            wrapper-&gt;resolve(key);
</del><ins>+            wrapper-&gt;resolve&lt;IDLInterface&lt;CryptoKey&gt;&gt;(key);
</ins><span class="cx">         };
</span><span class="cx">         auto importFailureCallback = [wrapper]() mutable {
</span><del>-            wrapper-&gt;reject(nullptr);
</del><ins>+            wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">         };
</span><span class="cx"> 
</span><span class="cx">         VM&amp; vm = domGlobalObject-&gt;vm();
</span><span class="lines">@@ -785,12 +787,12 @@
</span><span class="cx">         if (UNLIKELY(scope.exception())) {
</span><span class="cx">             // FIXME: Report exception details to console, and possibly to calling script once there is a standardized way to pass errors to WebCrypto promise reject functions.
</span><span class="cx">             scope.clearException();
</span><del>-            wrapper-&gt;reject(nullptr);
</del><ins>+            wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto decryptFailureCallback = [wrapper]() mutable {
</span><del>-        wrapper-&gt;reject(nullptr);
</del><ins>+        wrapper-&gt;reject(); // FIXME: This should reject with an Exception.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto result = unwrapAlgorithm-&gt;decryptForUnwrapKey(*unwrapAlgorithmParameters, *unwrappingKey, wrappedKeyData, WTFMove(decryptSuccessCallback), WTFMove(decryptFailureCallback));
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsScriptModuleLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -72,7 +72,7 @@
</span><span class="cx">     // So there is no correct URL to retrieve the module source code. If the module name
</span><span class="cx">     // value is a Symbol, it is used directly as a module key.
</span><span class="cx">     if (moduleNameValue.isSymbol()) {
</span><del>-        promise-&gt;resolve(asSymbol(moduleNameValue)-&gt;privateName());
</del><ins>+        promise-&gt;resolve&lt;IDLAny&gt;(toJS(exec, &amp;globalObject, asSymbol(moduleNameValue)-&gt;privateName()));
</ins><span class="cx">         return jsPromise.promise();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -88,7 +88,7 @@
</span><span class="cx">     // 1. Apply the URL parser to specifier. If the result is not failure, return the result.
</span><span class="cx">     URL absoluteURL(URL(), specifier);
</span><span class="cx">     if (absoluteURL.isValid()) {
</span><del>-        promise-&gt;resolve(absoluteURL.string());
</del><ins>+        promise-&gt;resolve&lt;IDLDOMString&gt;(absoluteURL.string());
</ins><span class="cx">         return jsPromise.promise();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx">         return jsPromise.promise();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    promise-&gt;resolve(completedURL.string());
</del><ins>+    promise-&gt;resolve&lt;IDLDOMString&gt;(completedURL.string());
</ins><span class="cx">     return jsPromise.promise();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -247,7 +247,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_requestURLToResponseURLMap.add(cachedScript.url(), cachedScript.response().url());
</span><span class="cx">     // FIXME: Let's wrap around ScriptSourceCode to propagate it directly through the module pipeline.
</span><del>-    promise-&gt;resolve(ScriptSourceCode(&amp;cachedScript, JSC::SourceProviderSourceType::Module).source().toString());
</del><ins>+    promise-&gt;resolve&lt;IDLDOMString&gt;(ScriptSourceCode(&amp;cachedScript, JSC::SourceProviderSourceType::Module).source().toString());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1204,7 +1204,12 @@
</span><span class="cx"> 
</span><span class="cx">     my $result = &quot;&quot;;
</span><span class="cx">     $result .= &quot;#if ${conditionalString}\n\n&quot; if $conditionalString;
</span><del>-    $result .= &quot;template&lt;&gt; $className convertDictionary&lt;$className&gt;(JSC::ExecState&amp;, JSC::JSValue);\n\n&quot;;
</del><ins>+    $result .= &quot;template&lt;&gt; ${className} convertDictionary&lt;$className&gt;(JSC::ExecState&amp;, JSC::JSValue);\n\n&quot;;
+
+    if ($dictionary-&gt;extendedAttributes-&gt;{JSGenerateToJSObject}) {
+        $result .= &quot;JSC::JSObject* convertDictionaryToJS(JSC::ExecState&amp;, JSDOMGlobalObject&amp;, const ${className}&amp;);\n\n&quot;;
+    }
+
</ins><span class="cx">     $result .= &quot;#endif\n\n&quot; if $conditionalString;
</span><span class="cx">     return $result;
</span><span class="cx"> }
</span><span class="lines">@@ -1247,6 +1252,7 @@
</span><span class="cx">     $result .= &quot;    auto throwScope = DECLARE_THROW_SCOPE(vm);\n&quot;;
</span><span class="cx">     $result .= &quot;    bool isNullOrUndefined = value.isUndefinedOrNull();\n&quot;;
</span><span class="cx">     $result .= &quot;    auto* object = isNullOrUndefined ? nullptr : value.getObject();\n&quot;;
</span><ins>+
</ins><span class="cx">     # 1. If Type(V) is not Undefined, Null or Object, then throw a TypeError.
</span><span class="cx">     $result .= &quot;    if (UNLIKELY(!isNullOrUndefined &amp;&amp; !object)) {\n&quot;;
</span><span class="cx">     $result .= &quot;        throwTypeError(&amp;state, throwScope);\n&quot;;
</span><span class="lines">@@ -1320,6 +1326,48 @@
</span><span class="cx"> 
</span><span class="cx">     $result .= &quot;    return result;\n&quot;;
</span><span class="cx">     $result .= &quot;}\n\n&quot;;
</span><ins>+
+    if ($dictionary-&gt;extendedAttributes-&gt;{JSGenerateToJSObject}) {
+        $result .= &quot;JSC::JSObject* convertDictionaryToJS(JSC::ExecState&amp; state, JSDOMGlobalObject&amp; globalObject, const ${className}&amp; dictionary)\n&quot;;
+        $result .= &quot;{\n&quot;;
+        $result .= &quot;    auto&amp; vm = state.vm();\n\n&quot;;
+
+        # 1. Let O be ! ObjectCreate(%ObjectPrototype%).
+        $result .= &quot;    auto result = constructEmptyObject(&amp;state);\n\n&quot;;
+
+        # 2. Let dictionaries be a list consisting of D and all of D’s inherited dictionaries,
+        #    in order from least to most derived.
+        #    NOTE: This was done above.
+
+        # 3. For each dictionary dictionary in dictionaries, in order:
+        foreach my $dictionary (@dictionaries) {
+            # 3.1. For each dictionary member member declared on dictionary, in lexicographical order:
+            my @sortedMembers = sort { $a-&gt;name cmp $b-&gt;name } @{$dictionary-&gt;members};
+            foreach my $member (@sortedMembers) {
+                my $key = $member-&gt;name;
+                my $IDLType = GetIDLType($interface, $member-&gt;type);
+
+                # 1. Let key be the identifier of member.
+                # 2. If the dictionary member named key is present in V, then:
+                    # 1. Let idlValue be the value of member on V.
+                    # 2. Let value be the result of converting idlValue to an ECMAScript value.
+                    # 3. Perform ! CreateDataProperty(O, key, value).
+                if (!$member-&gt;isRequired &amp;&amp; not defined $member-&gt;default) {
+                    $result .= &quot;    if (dictionary.${key}) {\n&quot;;
+                    $result .= &quot;        auto ${key}Value = toJS&lt;$IDLType&gt;(state, globalObject, dictionary.${key});\n&quot;;
+                    $result .= &quot;        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, \&quot;${key}\&quot;), ${key}Value);\n&quot;;
+                    $result .= &quot;    }\n&quot;;
+                } else {
+                    $result .= &quot;    auto ${key}Value = toJS&lt;$IDLType&gt;(state, globalObject, dictionary.${key});\n&quot;;
+                    $result .= &quot;    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, \&quot;${key}\&quot;), ${key}Value);\n&quot;;
+                }
+            }
+        }
+
+        $result .= &quot;    return result;\n&quot;;
+        $result .= &quot;}\n\n&quot;;
+    }
+
</ins><span class="cx">     $result .= &quot;#endif\n\n&quot; if $conditionalString;
</span><span class="cx"> 
</span><span class="cx">     return $result;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -682,6 +682,127 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;&gt; JSC::JSObject* convertDictionaryToJS(JSC::ExecState&amp; state, JSDOMGlobalObject&amp;, const TestObj::Dictionary&amp; dictionary)
+{
+    auto&amp; vm = state.vm();
+
+    auto result = constructEmptyObject(&amp;state)
+
+    auto anyTypedefValueValue = toJS&lt;IDLAny&gt;(state, globalObject, dictionary.anyTypedefValue);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;anyTypedefValue&quot;), anyTypedefValueValue);
+    auto anyValueValue = toJS&lt;IDLAny&gt;(state, globalObject, dictionary.anyValue);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;anyValue&quot;), anyValueValue);
+    auto anyValueWithNullDefaultValue = toJS&lt;IDLAny&gt;(state, globalObject, dictionary.anyValueWithNullDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;anyValueWithNullDefault&quot;), anyValueWithNullDefaultValue);
+    auto booleanWithDefaultValue = toJS&lt;IDLBoolean&gt;(state, globalObject, dictionary.booleanWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;booleanWithDefault&quot;), booleanWithDefaultValue);
+    if (dictionary.booleanWithoutDefault) {
+        auto booleanWithoutDefaultValue = toJS&lt;IDLBoolean&gt;(state, globalObject, dictionary.booleanWithoutDefault);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;booleanWithoutDefault&quot;), booleanWithoutDefaultValue);
+    }
+    if (dictionary.bufferSourceValue) {
+        auto bufferSourceValueValue = toJS&lt;IDLBufferSource&gt;(state, globalObject, dictionary.bufferSourceValue);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;bufferSourceValue&quot;), bufferSourceValueValue);
+    }
+    if (dictionary.dictionaryMember) {
+        auto dictionaryMemberValue = toJS&lt;IDLDictionary&lt;TestObj::DictionaryThatShouldTolerateNull&gt;&gt;(state, globalObject, dictionary.dictionaryMember);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;dictionaryMember&quot;), dictionaryMemberValue);
+    }
+    auto enumerationValueWithDefaultValue = toJS&lt;IDLEnumeration&lt;TestObj::EnumType&gt;&gt;(state, globalObject, dictionary.enumerationValueWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;enumerationValueWithDefault&quot;), enumerationValueWithDefaultValue);
+    auto enumerationValueWithEmptyStringDefaultValue = toJS&lt;IDLEnumeration&lt;TestObj::EnumType&gt;&gt;(state, globalObject, dictionary.enumerationValueWithEmptyStringDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;enumerationValueWithEmptyStringDefault&quot;), enumerationValueWithEmptyStringDefaultValue);
+    if (dictionary.enumerationValueWithoutDefault) {
+        auto enumerationValueWithoutDefaultValue = toJS&lt;IDLEnumeration&lt;TestObj::EnumType&gt;&gt;(state, globalObject, dictionary.enumerationValueWithoutDefault);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;enumerationValueWithoutDefault&quot;), enumerationValueWithoutDefaultValue);
+    }
+    if (dictionary.integer) {
+        auto integerValue = toJS&lt;IDLLong&gt;(state, globalObject, dictionary.integer);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;integer&quot;), integerValue);
+    }
+    auto integerWithDefaultValue = toJS&lt;IDLLong&gt;(state, globalObject, dictionary.integerWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;integerWithDefault&quot;), integerWithDefaultValue);
+    if (dictionary.largeInteger) {
+        auto largeIntegerValue = toJS&lt;IDLLongLong&gt;(state, globalObject, dictionary.largeInteger);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;largeInteger&quot;), largeIntegerValue);
+    }
+    auto largeIntegerWithDefaultValue = toJS&lt;IDLLongLong&gt;(state, globalObject, dictionary.largeIntegerWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;largeIntegerWithDefault&quot;), largeIntegerWithDefaultValue);
+    auto nullableIntegerWithDefaultValue = toJS&lt;IDLNullable&lt;IDLLong&gt;&gt;(state, globalObject, dictionary.nullableIntegerWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;nullableIntegerWithDefault&quot;), nullableIntegerWithDefaultValue);
+    auto nullableNodeValue = toJS&lt;IDLNullable&lt;IDLInterface&lt;Node&gt;&gt;&gt;(state, globalObject, dictionary.nullableNode);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;nullableNode&quot;), nullableNodeValue);
+    auto nullableStringWithDefaultValue = toJS&lt;IDLNullable&lt;IDLDOMString&gt;&gt;(state, globalObject, dictionary.nullableStringWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;nullableStringWithDefault&quot;), nullableStringWithDefaultValue);
+    auto nullableUnionMemberValue = toJS&lt;IDLNullable&lt;IDLUnion&lt;IDLLong, IDLInterface&lt;Node&gt;&gt;&gt;&gt;(state, globalObject, dictionary.nullableUnionMember);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;nullableUnionMember&quot;), nullableUnionMemberValue);
+    if (dictionary.restrictedDouble) {
+        auto restrictedDoubleValue = toJS&lt;IDLDouble&gt;(state, globalObject, dictionary.restrictedDouble);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;restrictedDouble&quot;), restrictedDoubleValue);
+    }
+    auto restrictedDoubleWithDefaultValue = toJS&lt;IDLDouble&gt;(state, globalObject, dictionary.restrictedDoubleWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;restrictedDoubleWithDefault&quot;), restrictedDoubleWithDefaultValue);
+    if (dictionary.restrictedFloat) {
+        auto restrictedFloatValue = toJS&lt;IDLFloat&gt;(state, globalObject, dictionary.restrictedFloat);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;restrictedFloat&quot;), restrictedFloatValue);
+    }
+    auto restrictedFloatWithDefaultValue = toJS&lt;IDLFloat&gt;(state, globalObject, dictionary.restrictedFloatWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;restrictedFloatWithDefault&quot;), restrictedFloatWithDefaultValue);
+    if (dictionary.sequenceOfStrings) {
+        auto sequenceOfStringsValue = toJS&lt;IDLSequence&lt;IDLDOMString&gt;&gt;(state, globalObject, dictionary.sequenceOfStrings);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;sequenceOfStrings&quot;), sequenceOfStringsValue);
+    }
+    if (dictionary.smallIntegerClamped) {
+        auto smallIntegerClampedValue = toJS&lt;IDLByte&gt;(state, globalObject, dictionary.smallIntegerClamped);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;smallIntegerClamped&quot;), smallIntegerClampedValue);
+    }
+    if (dictionary.smallIntegerWithDefault) {
+        auto smallIntegerWithDefaultValue = toJS&lt;IDLByte&gt;(state, globalObject, dictionary.smallIntegerWithDefault);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;smallIntegerWithDefault&quot;), smallIntegerWithDefaultValue);
+    }
+    if (dictionary.smallUnsignedIntegerEnforcedRange) {
+        auto smallUnsignedIntegerEnforcedRangeValue = toJS&lt;IDLOctet&gt;(state, globalObject, dictionary.smallUnsignedIntegerEnforcedRange);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;smallUnsignedIntegerEnforcedRange&quot;), smallUnsignedIntegerEnforcedRangeValue);
+    }
+    auto smallUnsignedIntegerWithDefaultValue = toJS&lt;IDLOctet&gt;(state, globalObject, dictionary.smallUnsignedIntegerWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;smallUnsignedIntegerWithDefault&quot;), smallUnsignedIntegerWithDefaultValue);
+    auto stringWithDefaultValue = toJS&lt;IDLDOMString&gt;(state, globalObject, dictionary.stringWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;stringWithDefault&quot;), stringWithDefaultValue);
+    if (dictionary.stringWithoutDefault) {
+        auto stringWithoutDefaultValue = toJS&lt;IDLDOMString&gt;(state, globalObject, dictionary.stringWithoutDefault);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;stringWithoutDefault&quot;), stringWithoutDefaultValue);
+    }
+    if (dictionary.unionMember) {
+        auto unionMemberValue = toJS&lt;IDLUnion&lt;IDLLong, IDLInterface&lt;Node&gt;&gt;&gt;(state, globalObject, dictionary.unionMember);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unionMember&quot;), unionMemberValue);
+    }
+    if (dictionary.unrestrictedDouble) {
+        auto unrestrictedDoubleValue = toJS&lt;IDLUnrestrictedDouble&gt;(state, globalObject, dictionary.unrestrictedDouble);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unrestrictedDouble&quot;), unrestrictedDoubleValue);
+    }
+    auto unrestrictedDoubleWithDefaultValue = toJS&lt;IDLUnrestrictedDouble&gt;(state, globalObject, dictionary.unrestrictedDoubleWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unrestrictedDoubleWithDefault&quot;), unrestrictedDoubleWithDefaultValue);
+    if (dictionary.unrestrictedFloat) {
+        auto unrestrictedFloatValue = toJS&lt;IDLUnrestrictedFloat&gt;(state, globalObject, dictionary.unrestrictedFloat);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unrestrictedFloat&quot;), unrestrictedFloatValue);
+    }
+    auto unrestrictedFloatWithDefaultValue = toJS&lt;IDLUnrestrictedFloat&gt;(state, globalObject, dictionary.unrestrictedFloatWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unrestrictedFloatWithDefault&quot;), unrestrictedFloatWithDefaultValue);
+    if (dictionary.unsignedInteger) {
+        auto unsignedIntegerValue = toJS&lt;IDLUnsignedLong&gt;(state, globalObject, dictionary.unsignedInteger);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unsignedInteger&quot;), unsignedIntegerValue);
+    }
+    auto unsignedIntegerWithDefaultValue = toJS&lt;IDLUnsignedLong&gt;(state, globalObject, dictionary.unsignedIntegerWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unsignedIntegerWithDefault&quot;), unsignedIntegerWithDefaultValue);
+    if (dictionary.unsignedLargeInteger) {
+        auto unsignedLargeIntegerValue = toJS&lt;IDLUnsignedLongLong&gt;(state, globalObject, dictionary.unsignedLargeInteger);
+        result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unsignedLargeInteger&quot;), unsignedLargeIntegerValue);
+    }
+    auto unsignedLargeIntegerWithDefaultValue = toJS&lt;IDLUnsignedLongLong&gt;(state, globalObject, dictionary.unsignedLargeIntegerWithDefault);
+    result-&gt;putDirect(vm, JSC::Identifier::fromString(&amp;vm, &quot;unsignedLargeIntegerWithDefault&quot;), unsignedLargeIntegerWithDefaultValue);
+    return result;
+}
+
</ins><span class="cx"> template&lt;&gt; TestObj::DictionaryThatShouldNotTolerateNull convertDictionary&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     VM&amp; vm = state.vm();
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -169,6 +169,8 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; TestObj::Dictionary convertDictionary&lt;TestObj::Dictionary&gt;(JSC::ExecState&amp;, JSC::JSValue);
</span><span class="cx"> 
</span><ins>+template&lt;&gt; JSC::JSObject* convertDictionaryToJS(JSC::ExecState&amp;, JSDOMGlobalObject&amp;, const TestObj::Dictionary&amp;);
+
</ins><span class="cx"> template&lt;&gt; TestObj::DictionaryThatShouldNotTolerateNull convertDictionary&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;(JSC::ExecState&amp;, JSC::JSValue);
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; TestObj::DictionaryThatShouldTolerateNull convertDictionary&lt;TestObj::DictionaryThatShouldTolerateNull&gt;(JSC::ExecState&amp;, JSC::JSValue);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestTestObjidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/TestObj.idl (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/TestObj.idl        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/bindings/scripts/test/TestObj.idl        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -433,7 +433,9 @@
</span><span class="cx"> 
</span><span class="cx"> typedef any AnyTypedef;
</span><span class="cx"> 
</span><del>-dictionary TestDictionary {
</del><ins>+[
+    JSGenerateToJSObject
+]dictionary TestDictionary {
</ins><span class="cx">     TestEnumType enumerationValueWithoutDefault;
</span><span class="cx">     TestEnumType enumerationValueWithDefault = &quot;enumValue1&quot;;
</span><span class="cx">     TestEnumType enumerationValueWithEmptyStringDefault = &quot;&quot;;
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoCryptoAlgorithmh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/CryptoAlgorithm.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/CryptoAlgorithm.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/CryptoAlgorithm.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CryptoAlgorithmIdentifier.h&quot;
</span><ins>+#include &quot;CryptoKeyPair.h&quot;
</ins><span class="cx"> #include &quot;CryptoKeyUsage.h&quot;
</span><span class="cx"> #include &quot;ExceptionOr.h&quot;
</span><span class="cx"> #include &quot;JsonWebKey.h&quot;
</span><span class="lines">@@ -41,7 +42,6 @@
</span><span class="cx"> class CryptoAlgorithmParameters;
</span><span class="cx"> class CryptoAlgorithmParametersDeprecated;
</span><span class="cx"> class CryptoKey;
</span><del>-class CryptoKeyPair;
</del><span class="cx"> class CryptoKeyData;
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> 
</span><span class="lines">@@ -49,6 +49,7 @@
</span><span class="cx"> using CryptoOperationData = std::pair&lt;const uint8_t*, size_t&gt;;
</span><span class="cx"> 
</span><span class="cx"> using KeyData = Variant&lt;Vector&lt;uint8_t&gt;, JsonWebKey&gt;;
</span><ins>+using KeyOrKeyPair = Variant&lt;RefPtr&lt;CryptoKey&gt;, CryptoKeyPair&gt;;
</ins><span class="cx"> 
</span><span class="cx"> class CryptoAlgorithm : public RefCounted&lt;CryptoAlgorithm&gt; {
</span><span class="cx"> public:
</span><span class="lines">@@ -58,7 +59,7 @@
</span><span class="cx"> 
</span><span class="cx">     using BoolCallback = WTF::Function&lt;void(bool)&gt;;
</span><span class="cx">     using KeyCallback = WTF::Function&lt;void(CryptoKey&amp;)&gt;;
</span><del>-    using KeyOrKeyPairCallback = WTF::Function&lt;void(CryptoKey*, CryptoKeyPair*)&gt;;
</del><ins>+    using KeyOrKeyPairCallback = WTF::Function&lt;void(KeyOrKeyPair&amp;&amp;)&gt;;
</ins><span class="cx">     using VectorCallback = WTF::Function&lt;void(const Vector&lt;uint8_t&gt;&amp;)&gt;;
</span><span class="cx">     using VoidCallback = WTF::Function&lt;void()&gt;;
</span><span class="cx">     using ExceptionCallback = WTF::Function&lt;void(ExceptionCode)&gt;;
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoCryptoKeyPaircpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/crypto/CryptoKeyPair.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/CryptoKeyPair.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/CryptoKeyPair.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1,45 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 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.
- */
-
-#include &quot;config.h&quot;
-#include &quot;CryptoKeyPair.h&quot;
-
-#if ENABLE(SUBTLE_CRYPTO)
-
-namespace WebCore {
-
-CryptoKeyPair::CryptoKeyPair(RefPtr&lt;CryptoKey&gt;&amp;&amp; publicKey, RefPtr&lt;CryptoKey&gt;&amp;&amp; privateKey)
-    : m_publicKey(WTFMove(publicKey))
-    , m_privateKey(WTFMove(privateKey))
-{
-}
-
-CryptoKeyPair::~CryptoKeyPair()
-{
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(SUBTLE_CRYPTO)
</del></span></pre></div>
<a id="trunkSourceWebCorecryptoCryptoKeyPairh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/CryptoKeyPair.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/CryptoKeyPair.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/CryptoKeyPair.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include &quot;CryptoKey.h&quot;
</del><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -33,22 +32,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class CryptoKeyPair : public RefCounted&lt;CryptoKeyPair&gt; {
-public:
-    static Ref&lt;CryptoKeyPair&gt; create(RefPtr&lt;CryptoKey&gt;&amp;&amp; publicKey, RefPtr&lt;CryptoKey&gt;&amp;&amp; privateKey)
-    {
-        return adoptRef(*new CryptoKeyPair(WTFMove(publicKey), WTFMove(privateKey)));
-    }
-    ~CryptoKeyPair();
</del><ins>+class CryptoKey;
</ins><span class="cx"> 
</span><del>-    CryptoKey* publicKey() { return m_publicKey.get(); }
-    CryptoKey* privateKey() { return m_privateKey.get(); }
-
-private:
-    CryptoKeyPair(RefPtr&lt;CryptoKey&gt;&amp;&amp; publicKey, RefPtr&lt;CryptoKey&gt;&amp;&amp; privateKey);
-
-    RefPtr&lt;CryptoKey&gt; m_publicKey;
-    RefPtr&lt;CryptoKey&gt; m_privateKey;
</del><ins>+struct CryptoKeyPair {
+    RefPtr&lt;CryptoKey&gt; publicKey;
+    RefPtr&lt;CryptoKey&gt; privateKey;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoCryptoKeyPairidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/CryptoKeyPair.idl (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/CryptoKeyPair.idl        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/CryptoKeyPair.idl        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -23,17 +23,10 @@
</span><span class="cx">  * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-// FIXME: The spec suggests that CryptoKeyPair should be of type Dictionary
-// as of 11 December 2014: https://www.w3.org/TR/WebCryptoAPI/#keypair
-// Since we don't support convert a Dictionary type object from its native
-// type to JSValue yet, we use a NoInterfaceObject hack for now. See:
-// https://bugs.webkit.org/show_bug.cgi?id=163711
</del><span class="cx"> [
</span><span class="cx">     Conditional=SUBTLE_CRYPTO,
</span><del>-    ImplementationLacksVTable,
-    JSCustomMarkFunction,
-    NoInterfaceObject
-] interface CryptoKeyPair {
-    readonly attribute CryptoKey publicKey;
-    readonly attribute CryptoKey privateKey;
</del><ins>+    JSGenerateToJSObject
+] dictionary CryptoKeyPair {
+    CryptoKey publicKey;
+    CryptoKey privateKey;
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmAES_CBCcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_CBC.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_CBC.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_CBC.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    callback(result.get(), nullptr);
</del><ins>+    callback(WTFMove(result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CryptoAlgorithmAES_CBC::importKey(SubtleCrypto::KeyFormat format, KeyData&amp;&amp; data, const std::unique_ptr&lt;CryptoAlgorithmParameters&gt;&amp;&amp; parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyCallback&amp;&amp; callback, ExceptionCallback&amp;&amp; exceptionCallback)
</span><span class="lines">@@ -212,7 +212,7 @@
</span><span class="cx">         return { };
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    callback(result.get(), nullptr);
</del><ins>+    callback(WTFMove(result));
</ins><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmAES_KWcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_KW.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_KW.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmAES_KW.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    callback(result.get(), nullptr);
</del><ins>+    callback(WTFMove(result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CryptoAlgorithmAES_KW::importKey(SubtleCrypto::KeyFormat format, KeyData&amp;&amp; data, const std::unique_ptr&lt;CryptoAlgorithmParameters&gt;&amp;&amp; parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyCallback&amp;&amp; callback, ExceptionCallback&amp;&amp; exceptionCallback)
</span><span class="lines">@@ -193,7 +193,8 @@
</span><span class="cx">         failureCallback();
</span><span class="cx">         return { };
</span><span class="cx">     }
</span><del>-    callback(result.get(), nullptr);
</del><ins>+
+    callback(WTFMove(result));
</ins><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmHMACcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmHMAC.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmHMAC.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmHMAC.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    callback(result.get(), nullptr);
</del><ins>+    callback(WTFMove(result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CryptoAlgorithmHMAC::importKey(SubtleCrypto::KeyFormat format, KeyData&amp;&amp; data, const std::unique_ptr&lt;CryptoAlgorithmParameters&gt;&amp;&amp; parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyCallback&amp;&amp; callback, ExceptionCallback&amp;&amp; exceptionCallback)
</span><span class="lines">@@ -220,7 +220,7 @@
</span><span class="cx">         failureCallback();
</span><span class="cx">         return { };
</span><span class="cx">     }
</span><del>-    callback(result.get(), nullptr);
</del><ins>+    callback(WTFMove(result));
</ins><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmRSAES_PKCS1_v1_5cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSAES_PKCS1_v1_5.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSAES_PKCS1_v1_5.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSAES_PKCS1_v1_5.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -86,10 +86,10 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp; pair) {
-        pair.publicKey()-&gt;setUsagesBitmap(pair.publicKey()-&gt;usagesBitmap() &amp; CryptoKeyUsageEncrypt);
-        pair.privateKey()-&gt;setUsagesBitmap(pair.privateKey()-&gt;usagesBitmap() &amp; CryptoKeyUsageDecrypt);
-        capturedCallback(nullptr, &amp;pair);
</del><ins>+    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp;&amp; pair) {
+        pair.publicKey-&gt;setUsagesBitmap(pair.publicKey-&gt;usagesBitmap() &amp; CryptoKeyUsageEncrypt);
+        pair.privateKey-&gt;setUsagesBitmap(pair.privateKey-&gt;usagesBitmap() &amp; CryptoKeyUsageDecrypt);
+        capturedCallback(WTFMove(pair));
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [capturedCallback = WTFMove(exceptionCallback)]() {
</span><span class="cx">         capturedCallback(OperationError);
</span><span class="lines">@@ -174,8 +174,8 @@
</span><span class="cx"> ExceptionOr&lt;void&gt; CryptoAlgorithmRSAES_PKCS1_v1_5::generateKey(const CryptoAlgorithmParametersDeprecated&amp; parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyOrKeyPairCallback&amp;&amp; callback, VoidCallback&amp;&amp; failureCallback, ScriptExecutionContext&amp; context)
</span><span class="cx"> {
</span><span class="cx">     auto&amp; rsaParameters = downcast&lt;CryptoAlgorithmRsaKeyGenParamsDeprecated&gt;(parameters);
</span><del>-    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp; pair) {
-        capturedCallback(nullptr, &amp;pair);
</del><ins>+    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp;&amp; pair) {
+        capturedCallback(WTFMove(pair));
</ins><span class="cx">     };
</span><span class="cx">     CryptoKeyRSA::generatePair(CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5, rsaParameters.hash, rsaParameters.hasHash, rsaParameters.modulusLength, rsaParameters.publicExponent, extractable, usages, WTFMove(keyPairCallback), WTFMove(failureCallback), &amp;context);
</span><span class="cx">     return { };
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmRSASSA_PKCS1_v1_5cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSASSA_PKCS1_v1_5.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSASSA_PKCS1_v1_5.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSASSA_PKCS1_v1_5.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -95,10 +95,10 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp; pair) {
-        pair.publicKey()-&gt;setUsagesBitmap(pair.publicKey()-&gt;usagesBitmap() &amp; CryptoKeyUsageVerify);
-        pair.privateKey()-&gt;setUsagesBitmap(pair.privateKey()-&gt;usagesBitmap() &amp; CryptoKeyUsageSign);
-        capturedCallback(nullptr, &amp;pair);
</del><ins>+    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp;&amp; pair) {
+        pair.publicKey-&gt;setUsagesBitmap(pair.publicKey-&gt;usagesBitmap() &amp; CryptoKeyUsageVerify);
+        pair.privateKey-&gt;setUsagesBitmap(pair.privateKey-&gt;usagesBitmap() &amp; CryptoKeyUsageSign);
+        capturedCallback(WTFMove(pair));
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [capturedCallback = WTFMove(exceptionCallback)]() {
</span><span class="cx">         capturedCallback(OperationError);
</span><span class="lines">@@ -227,8 +227,8 @@
</span><span class="cx"> ExceptionOr&lt;void&gt; CryptoAlgorithmRSASSA_PKCS1_v1_5::generateKey(const CryptoAlgorithmParametersDeprecated&amp; parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyOrKeyPairCallback&amp;&amp; callback, VoidCallback&amp;&amp; failureCallback, ScriptExecutionContext&amp; context)
</span><span class="cx"> {
</span><span class="cx">     auto&amp; rsaParameters = downcast&lt;CryptoAlgorithmRsaKeyGenParamsDeprecated&gt;(parameters);
</span><del>-    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp; pair) {
-        capturedCallback(nullptr, &amp;pair);
</del><ins>+    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp;&amp; pair) {
+        capturedCallback(WTFMove(pair));
</ins><span class="cx">     };
</span><span class="cx">     CryptoKeyRSA::generatePair(CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5, rsaParameters.hash, rsaParameters.hasHash, rsaParameters.modulusLength, rsaParameters.publicExponent, extractable, usages, WTFMove(keyPairCallback), WTFMove(failureCallback), &amp;context);
</span><span class="cx">     return { };
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoalgorithmsCryptoAlgorithmRSA_OAEPcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSA_OAEP.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSA_OAEP.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/algorithms/CryptoAlgorithmRSA_OAEP.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -97,10 +97,10 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp; pair) {
-        pair.publicKey()-&gt;setUsagesBitmap(pair.publicKey()-&gt;usagesBitmap() &amp; (CryptoKeyUsageEncrypt | CryptoKeyUsageWrapKey));
-        pair.privateKey()-&gt;setUsagesBitmap(pair.privateKey()-&gt;usagesBitmap() &amp; (CryptoKeyUsageDecrypt | CryptoKeyUsageUnwrapKey));
-        capturedCallback(nullptr, &amp;pair);
</del><ins>+    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp;&amp; pair) {
+        pair.publicKey-&gt;setUsagesBitmap(pair.publicKey-&gt;usagesBitmap() &amp; (CryptoKeyUsageEncrypt | CryptoKeyUsageWrapKey));
+        pair.privateKey-&gt;setUsagesBitmap(pair.privateKey-&gt;usagesBitmap() &amp; (CryptoKeyUsageDecrypt | CryptoKeyUsageUnwrapKey));
+        capturedCallback(WTFMove(pair));
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [capturedCallback = WTFMove(exceptionCallback)]() {
</span><span class="cx">         capturedCallback(OperationError);
</span><span class="lines">@@ -240,8 +240,8 @@
</span><span class="cx"> ExceptionOr&lt;void&gt; CryptoAlgorithmRSA_OAEP::generateKey(const CryptoAlgorithmParametersDeprecated&amp; parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyOrKeyPairCallback&amp;&amp; callback, VoidCallback&amp;&amp; failureCallback, ScriptExecutionContext&amp; context)
</span><span class="cx"> {
</span><span class="cx">     auto&amp; rsaParameters = downcast&lt;CryptoAlgorithmRsaKeyGenParamsDeprecated&gt;(parameters);
</span><del>-    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp; pair) {
-        capturedCallback(nullptr, &amp;pair);
</del><ins>+    auto keyPairCallback = [capturedCallback = WTFMove(callback)](CryptoKeyPair&amp;&amp; pair) {
+        capturedCallback(WTFMove(pair));
</ins><span class="cx">     };
</span><span class="cx">     CryptoKeyRSA::generatePair(CryptoAlgorithmIdentifier::RSA_OAEP, rsaParameters.hash, rsaParameters.hasHash, rsaParameters.modulusLength, rsaParameters.publicExponent, extractable, usages, WTFMove(keyPairCallback), WTFMove(failureCallback), &amp;context);
</span><span class="cx">     return { };
</span></span></pre></div>
<a id="trunkSourceWebCorecryptokeysCryptoKeyRSAh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/keys/CryptoKeyRSA.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/keys/CryptoKeyRSA.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/keys/CryptoKeyRSA.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -43,10 +43,10 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class CryptoKeyDataRSAComponents;
</span><del>-class CryptoKeyPair;
</del><span class="cx"> class PromiseWrapper;
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> 
</span><ins>+struct CryptoKeyPair;
</ins><span class="cx"> struct JsonWebKey;
</span><span class="cx"> 
</span><span class="cx"> class RsaKeyAlgorithm : public KeyAlgorithm {
</span><span class="lines">@@ -97,7 +97,7 @@
</span><span class="cx"> 
</span><span class="cx">     size_t keySizeInBits() const;
</span><span class="cx"> 
</span><del>-    using KeyPairCallback = WTF::Function&lt;void(CryptoKeyPair&amp;)&gt;;
</del><ins>+    using KeyPairCallback = WTF::Function&lt;void(CryptoKeyPair&amp;&amp;)&gt;;
</ins><span class="cx">     using VoidCallback = WTF::Function&lt;void()&gt;;
</span><span class="cx">     static void generatePair(CryptoAlgorithmIdentifier, CryptoAlgorithmIdentifier hash, bool hasHash, unsigned modulusLength, const Vector&lt;uint8_t&gt;&amp; publicExponent, bool extractable, CryptoKeyUsageBitmap, KeyPairCallback&amp;&amp;, VoidCallback&amp;&amp; failureCallback, ScriptExecutionContext*);
</span><span class="cx">     static RefPtr&lt;CryptoKeyRSA&gt; importJwk(CryptoAlgorithmIdentifier, std::optional&lt;CryptoAlgorithmIdentifier&gt; hash, JsonWebKey&amp;&amp;, bool extractable, CryptoKeyUsageBitmap);
</span></span></pre></div>
<a id="trunkSourceWebCorecryptomacCryptoKeyRSAMaccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/mac/CryptoKeyRSAMac.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/mac/CryptoKeyRSAMac.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/crypto/mac/CryptoKeyRSAMac.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -270,7 +270,9 @@
</span><span class="cx">         context-&gt;postTask([algorithm, hash, hasHash, extractable, usage, localCallback, localFailureCallback, ccPublicKey, ccPrivateKey](ScriptExecutionContext&amp; context) {
</span><span class="cx">             auto publicKey = CryptoKeyRSA::create(algorithm, hash, hasHash, CryptoKeyType::Public, ccPublicKey, true, usage);
</span><span class="cx">             auto privateKey = CryptoKeyRSA::create(algorithm, hash, hasHash, CryptoKeyType::Private, ccPrivateKey, extractable, usage);
</span><del>-            (*localCallback)(CryptoKeyPair::create(WTFMove(publicKey), WTFMove(privateKey)));
</del><ins>+
+            (*localCallback)(CryptoKeyPair { WTFMove(publicKey), WTFMove(privateKey) });
+
</ins><span class="cx">             delete localCallback;
</span><span class="cx">             delete localFailureCallback;
</span><span class="cx">             context.deref();
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFace.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFace.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/css/FontFace.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">     enum class LoadStatus { Unloaded, Loading, Loaded, Error };
</span><span class="cx">     LoadStatus status() const;
</span><span class="cx"> 
</span><del>-    typedef DOMPromise&lt;FontFace&amp;&gt; Promise;
</del><ins>+    using Promise = DOMPromise&lt;IDLInterface&lt;FontFace&gt;&gt;;
</ins><span class="cx">     std::optional&lt;Promise&gt;&amp; promise() { return m_promise; }
</span><span class="cx">     void registerLoaded(Promise&amp;&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceSetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFaceSet.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFaceSet.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/css/FontFaceSet.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -133,7 +133,7 @@
</span><span class="cx">     auto matchingFaces = matchingFacesResult.releaseReturnValue();
</span><span class="cx"> 
</span><span class="cx">     if (matchingFaces.isEmpty()) {
</span><del>-        promise.resolve(Vector&lt;RefPtr&lt;FontFace&gt;&gt;());
</del><ins>+        promise.resolve({ });
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFaceSet.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFaceSet.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/css/FontFaceSet.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">     bool remove(FontFace&amp;);
</span><span class="cx">     void clear();
</span><span class="cx"> 
</span><del>-    typedef DOMPromise&lt;Vector&lt;RefPtr&lt;FontFace&gt;&gt;&gt; LoadPromise;
</del><ins>+    using LoadPromise = DOMPromise&lt;IDLSequence&lt;IDLInterface&lt;FontFace&gt;&gt;&gt;;
</ins><span class="cx">     void load(const String&amp; font, const String&amp; text, LoadPromise&amp;&amp;);
</span><span class="cx">     ExceptionOr&lt;bool&gt; check(const String&amp; font, const String&amp; text);
</span><span class="cx"> 
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">     enum class LoadStatus { Loading, Loaded };
</span><span class="cx">     LoadStatus status() const;
</span><span class="cx"> 
</span><del>-    typedef DOMPromise&lt;FontFaceSet&amp;&gt; ReadyPromise;
</del><ins>+    using ReadyPromise = DOMPromise&lt;IDLInterface&lt;FontFaceSet&gt;&gt;;
</ins><span class="cx">     void registerReady(ReadyPromise&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     CSSFontFaceSet&amp; backing() { return m_backing; }
</span></span></pre></div>
<a id="trunkSourceWebCoredomCustomElementRegistrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/CustomElementRegistry.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/CustomElementRegistry.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/dom/CustomElementRegistry.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">         enqueueUpgradeInShadowIncludingTreeOrder(*document, elementInterface.get());
</span><span class="cx"> 
</span><span class="cx">     if (auto promise = m_promiseMap.take(localName))
</span><del>-        promise.value()-&gt;resolve(nullptr);
</del><ins>+        promise.value()-&gt;resolve();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSCustomElementInterface* CustomElementRegistry::findInterface(const Element&amp; element) const
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx"> #include &quot;HTMLSourceElement.h&quot;
</span><span class="cx"> #include &quot;HTMLVideoElement.h&quot;
</span><span class="cx"> #include &quot;JSDOMError.h&quot;
</span><ins>+#include &quot;JSDOMPromise.h&quot;
</ins><span class="cx"> #include &quot;JSHTMLMediaElement.h&quot;
</span><span class="cx"> #include &quot;Language.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="lines">@@ -977,7 +978,7 @@
</span><span class="cx">     Vector&lt;DOMPromise&lt;void&gt;&gt; pendingPlayPromises = WTFMove(m_pendingPlayPromises);
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; promise : pendingPlayPromises)
</span><del>-        promise.reject(error);
</del><ins>+        promise.rejectType&lt;IDLInterface&lt;DOMError&gt;&gt;(error);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaElement::resolvePendingPlayPromises()
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #include &quot;GenericEventQueue.h&quot;
</span><span class="cx"> #include &quot;GenericTaskQueue.h&quot;
</span><span class="cx"> #include &quot;HTMLMediaElementEnums.h&quot;
</span><del>-#include &quot;JSDOMPromise.h&quot;
</del><span class="cx"> #include &quot;MediaCanStartListener.h&quot;
</span><span class="cx"> #include &quot;MediaControllerInterface.h&quot;
</span><span class="cx"> #include &quot;MediaElementSession.h&quot;
</span><span class="lines">@@ -59,6 +58,7 @@
</span><span class="cx"> class AudioTrackList;
</span><span class="cx"> class AudioTrackPrivate;
</span><span class="cx"> class DOMError;
</span><ins>+class DeferredPromise;
</ins><span class="cx"> class DisplaySleepDisabler;
</span><span class="cx"> class Event;
</span><span class="cx"> class HTMLSourceElement;
</span><span class="lines">@@ -87,6 +87,8 @@
</span><span class="cx"> class VideoTrackPrivate;
</span><span class="cx"> class WebKitMediaKeys;
</span><span class="cx"> 
</span><ins>+template&lt;typename&gt; class DOMPromise;
+
</ins><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> using CueIntervalTree = PODIntervalTree&lt;MediaTime, TextTrackCue*&gt;;
</span><span class="cx"> using CueInterval = CueIntervalTree::IntervalType;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaController.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaController.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/html/MediaController.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Clock.h&quot;
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;HTMLMediaElement.h&quot;
</span><span class="cx"> #include &quot;TimeRanges.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx"> #include &lt;JavaScriptCore/JSCJSValueInlines.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSCellInlines.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSGenericTypedArrayViewInlines.h&gt;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackTextTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/TextTrack.cpp (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/TextTrack.cpp        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebCore/html/track/TextTrack.cpp        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;TextTrack.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Event.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;HTMLMediaElement.h&quot;
</span><span class="cx"> #include &quot;SourceBuffer.h&quot;
</span><span class="cx"> #include &quot;TextTrackCueList.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebKit2CMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/CMakeLists.txt (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/CMakeLists.txt        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebKit2/CMakeLists.txt        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -92,6 +92,10 @@
</span><span class="cx">     &quot;${WEBCORE_DIR}/bridge&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/bridge/jsc&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/contentextensions&quot;
</span><ins>+    &quot;${WEBCORE_DIR}/crypto&quot;
+    &quot;${WEBCORE_DIR}/crypto/algorithms&quot;
+    &quot;${WEBCORE_DIR}/crypto/keys&quot;
+    &quot;${WEBCORE_DIR}/crypto/parameters&quot;
</ins><span class="cx">     &quot;${WEBCORE_DIR}/css&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/css/parser&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/dom&quot;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (209389 => 209390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-12-06 07:34:35 UTC (rev 209389)
+++ trunk/Source/WebKit2/ChangeLog        2016-12-06 07:59:02 UTC (rev 209390)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-12-06  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        [WebIDL] Add support for converting dictionaries to JS
+        https://bugs.webkit.org/show_bug.cgi?id=165367
+
+        Reviewed by Darin Adler and Alex Christensen.
+
+        * CMakeLists.txt:
+        Add missing directories to look in for headers.
+
</ins><span class="cx"> 2016-12-05  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Try to fix the iOS Simulator build.
</span></span></pre>
</div>
</div>

</body>
</html>