<!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>[210217] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/210217">210217</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-12-31 01:57:11 -0800 (Sat, 31 Dec 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Remove setDOMException and a few custom bindings
https://bugs.webkit.org/show_bug.cgi?id=166002
Reviewed by Sam Weinig.
* CMakeLists.txt: Removed JSFileReaderCustom.cpp.
* WebCore.xcodeproj/project.pbxproj: Removed JSFileReaderCustom.cpp.
* bindings/js/CallbackFunction.cpp:
(WebCore::checkFunctionOnlyCallback): Use throwTypeMismatchError instead
of calling setDOMException with TYPE_MISMATCH_ERR.
* bindings/js/JSBindingsAllInOne.cpp: Removed JSFileReaderCustom.cpp.
* bindings/js/JSCSSStyleDeclarationCustom.cpp:
(WebCore::JSCSSStyleDeclaration::putDelegate): Pass a throw scope in to
propagateException.
* bindings/js/JSCryptoAlgorithmDictionary.cpp:
(WebCore::JSCryptoAlgorithmDictionary::parseAlgorithmIdentifier):
Renamed from getAlgorithmIdentifier. Got rid of bool return value, instead
use a conventional return value and conventional JavaScript exception
handling. Added a ThrowScope argument.
(WebCore::optionalHashAlgorithm): Added. Returns an optional hash algorithm.
Also makes the same changes as above, conventional exception handling and
ThrowScope argument.
(WebCore::requiredHashAlgorithm): Added. Like the above but throws an
exception if the algorithm is omitted.
(WebCore::getHashAlgorithm): Deleted. Replaced by the two functions above.
(WebCore::createAesCbcParams): Updated for above changes.
(WebCore::createHmacParams): Ditto.
(WebCore::createHmacKeyParams): Ditto.
(WebCore::createRsaKeyGenParams): Ditto.
(WebCore::createRsaOaepParams): Ditto.
(WebCore::createRsaSsaParams): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForEncrypt): Added
a ThrowScope argument, and changed to use throwNotSupportedError instead
of setDOMException with NOT_SUPPORTED_ERROR.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForDecrypt): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForSign): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForVerify):
(WebCore::JSCryptoAlgorithmDictionary::createParametersForDigest): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForGenerateKey): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForDeriveKey): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForDeriveBits): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForImportKey): Ditto.
(WebCore::JSCryptoAlgorithmDictionary::createParametersForExportKey): Ditto.
* bindings/js/JSCryptoAlgorithmDictionary.h: Updated for the above changes.
* bindings/js/JSCryptoOperationData.cpp:
(WebCore::cryptoOperationDataFromJSValue): Got rid of bool return value and
instead use a conventional return value and conventional JS exception handling.
Added a ThrowScope argument.
* bindings/js/JSCryptoOperationData.h: Updated for the above.
* bindings/js/JSCustomXPathNSResolver.cpp:
(WebCore::JSCustomXPathNSResolver::create): Use ExceptionOr.
(WebCore::JSCustomXPathNSResolver::JSCustomXPathNSResolver): Take a VM&
rather than an ExecState*.
* bindings/js/JSCustomXPathNSResolver.h: Updated for the changes above.
Also marked class final and fixed indentation.
* bindings/js/JSDOMBinding.cpp:
(WebCore::createDOMException): Updated comment.
(WebCore::throwDOMException): Deleted.
(WebCore::propagateException): Deleted non-inline overload that does not take
a throw scope, now that all callers pass a throw scope.
(WebCore::setDOMExceptionSlow): Deleted.
(WebCore::setDOMException): Deleted.
(WebCore::throwNotSupportedError): Added.
(WebCore::throwDOMSyntaxError): Added.
(WebCore::throwDataCloneError): Added.
(WebCore::throwIndexSizeError): Added.
(WebCore::throwTypeMismatchError): Added.
* bindings/js/JSDOMBinding.h: Updated for the additions and removals
above. Also grouped the standard DOM exception throwing functions separately
from the special ones for getters and setters, and sorted them alphabetically.
* bindings/js/JSDataCueCustom.cpp:
(WebCore::createJSDataCue): Added, helper function for the below.
(WebCore::constructJSDataCue): Tightened and tweaked a bit.
* bindings/js/JSFileReaderCustom.cpp: Removed.
* bindings/js/JSHTMLOptionsCollectionCustom.cpp:
(WebCore::JSHTMLOptionsCollection::setLength): Use throwIndexSizeError instead
of setDOMException with INDEX_SIZE_ERR.
* bindings/js/JSHTMLSelectElementCustom.cpp:
(WebCore::selectElementIndexSetter): Use throwTypeMismatchError instead of
setDOMExceptoin with TYPEMISMATCH_ERR.
* bindings/js/JSIDBRequestCustom.cpp:
(WebCore::JSIDBRequest::result): Pass a throw scope in to
propagateException.
* bindings/js/JSSQLResultSetRowListCustom.cpp:
(WebCore::JSSQLResultSetRowList::item): Use throwTypeMismatchError and
throwIndexSizeError instead of setDOMException with TYPE_MISMATCH_ERR and
INDEX_ERR. This required adding a throw scope.
* bindings/js/JSSQLTransactionCustom.cpp:
(WebCore::JSSQLTransaction::executeSql): Use throwDOMSyntaxError and
throwTypeMismatchError instead of setDOMException with SYNTAX_ERR and
TYPE_MISMATCH_ERR.
* bindings/js/JSStorageCustom.cpp:
(WebCore::JSStorage::nameGetter): Pass a throw scope in to
propagateException.
* bindings/js/JSSubtleCryptoCustom.cpp:
(WebCore::normalizeCryptoAlgorithmParameters): Use throwNotSupportedError
instead of setDOMException with NOT_SUPPORTED_ERR.
(WebCore::createAlgorithm): Deleted.
(WebCore::supportExportKeyThrow): Added ThrowScope argument and use
throwNotSupportedError instead of setDOMException with NOT_SUPPORTED_ERR.
(WebCore::jsSubtleCryptoFunctionEncryptPromise): Updated for above changes,
throwing a not supported exception at this level rather than in a helper.
(WebCore::jsSubtleCryptoFunctionDecryptPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionSignPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionVerifyPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionDigestPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionGenerateKeyPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionImportKeyPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionExportKeyPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionWrapKeyPromise): Ditto.
(WebCore::jsSubtleCryptoFunctionUnwrapKeyPromise): Ditto.
* bindings/js/JSWebKitSubtleCryptoCustom.cpp:
(WebCore::createAlgorithmFromJSValue): Got rid of bool return value and
instead use a conventional return value and conventional JS exception handling.
Added a ThrowScope argument.
(WebCore::cryptoKeyFormatFromJSValue): Ditto.
(WebCore::cryptoKeyUsagesFromJSValue): Ditto.
(WebCore::JSWebKitSubtleCrypto::encrypt): Updated for above changes.
(WebCore::JSWebKitSubtleCrypto::decrypt): Ditto.
(WebCore::JSWebKitSubtleCrypto::sign): Ditto.
(WebCore::JSWebKitSubtleCrypto::verify): Ditto.
(WebCore::JSWebKitSubtleCrypto::digest): Ditto.
(WebCore::JSWebKitSubtleCrypto::generateKey): Ditto.
(WebCore::JSWebKitSubtleCrypto::importKey): Ditto.
(WebCore::JSWebKitSubtleCrypto::exportKey): Ditto.
(WebCore::JSWebKitSubtleCrypto::wrapKey): Ditto.
(WebCore::JSWebKitSubtleCrypto::unwrapKey): Ditto.
* bindings/js/JSXMLHttpRequestCustom.cpp:
(WebCore::JSXMLHttpRequest::send): Pass a throw scope in to
propagateException.
(WebCore::JSXMLHttpRequest::responseText): Ditto.
* bindings/js/JSXPathNSResolverCustom.cpp:
(WebCore::JSXPathNSResolver::toWrapped): Updated since
JSCustomXPathNSResolver::create now uses ExceptionOr.
* bindings/js/SerializedScriptValue.cpp:
(WebCore::maybeThrowExceptionIfSerializationFailed): Updated to take
a reference instead of a pointer. Fixed the handling of success to be
simpler; no need to check the code twice. Use throwDataCloneError instead
of setDOMException with DATA_CLONE_ERR.
(WebCore::SerializedScriptValue::create): Updated for above.
(WebCore::SerializedScriptValue::deserialize): Ditto.
* bindings/js/StructuredClone.cpp:
(WebCore::structuredCloneArrayBuffer): Use throwDataCloneError instead of
setDOMException with DATA_CLONE_ERR.
(WebCore::structuredCloneArrayBufferView): Ditto.
* crypto/CryptoAlgorithmParametersDeprecated.h: Removed unneeded empty
constructor.
* crypto/parameters/CryptoAlgorithmHmacKeyParamsDeprecated.h: Ditto,
moving initialization to where the data member is defined.
* crypto/parameters/CryptoAlgorithmRsaKeyGenParamsDeprecated.h: Ditto.
* crypto/parameters/CryptoAlgorithmRsaOaepParamsDeprecated.h: Ditto.
* fileapi/FileReader.cpp:
(WebCore::FileReader::result): Added. Returns a combination of optional
and variant that matches what the ID specifies. Moved the code from the
two following functions in here.
(WebCore::FileReader::arrayBufferResult): Deleted.
(WebCore::FileReader::stringResult): Deleted.
* fileapi/FileReader.h: Updated for the above.
* fileapi/FileReader.idl: Removed [Custom] from the result attribute and
declared it with the type mentioned in the specification, a nullable union.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsCallbackFunctioncpp">trunk/Source/WebCore/bindings/js/CallbackFunction.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSBindingsAllInOnecpp">trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCSSStyleDeclarationCustomcpp">trunk/Source/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCryptoAlgorithmDictionarycpp">trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCryptoAlgorithmDictionaryh">trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCryptoOperationDatacpp">trunk/Source/WebCore/bindings/js/JSCryptoOperationData.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCryptoOperationDatah">trunk/Source/WebCore/bindings/js/JSCryptoOperationData.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCustomXPathNSResolvercpp">trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCustomXPathNSResolverh">trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMBindingcpp">trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMBindingh">trunk/Source/WebCore/bindings/js/JSDOMBinding.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSHTMLOptionsCollectionCustomcpp">trunk/Source/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSHTMLSelectElementCustomcpp">trunk/Source/WebCore/bindings/js/JSHTMLSelectElementCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSIDBRequestCustomcpp">trunk/Source/WebCore/bindings/js/JSIDBRequestCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSStorageCustomcpp">trunk/Source/WebCore/bindings/js/JSStorageCustom.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="#trunkSourceWebCorebindingsjsJSXMLHttpRequestCustomcpp">trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSXPathNSResolverCustomcpp">trunk/Source/WebCore/bindings/js/JSXPathNSResolverCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsSerializedScriptValuecpp">trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsStructuredClonecpp">trunk/Source/WebCore/bindings/js/StructuredClone.cpp</a></li>
<li><a href="#trunkSourceWebCorecryptoCryptoAlgorithmParametersDeprecatedh">trunk/Source/WebCore/crypto/CryptoAlgorithmParametersDeprecated.h</a></li>
<li><a href="#trunkSourceWebCorecryptoparametersCryptoAlgorithmHmacKeyParamsDeprecatedh">trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmHmacKeyParamsDeprecated.h</a></li>
<li><a href="#trunkSourceWebCorecryptoparametersCryptoAlgorithmRsaKeyGenParamsDeprecatedh">trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaKeyGenParamsDeprecated.h</a></li>
<li><a href="#trunkSourceWebCorecryptoparametersCryptoAlgorithmRsaOaepParamsDeprecatedh">trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaOaepParamsDeprecated.h</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReadercpp">trunk/Source/WebCore/fileapi/FileReader.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderh">trunk/Source/WebCore/fileapi/FileReader.h</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderidl">trunk/Source/WebCore/fileapi/FileReader.idl</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorebindingsjsJSFileReaderCustomcpp">trunk/Source/WebCore/bindings/js/JSFileReaderCustom.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -1126,7 +1126,6 @@
</span><span class="cx"> bindings/js/JSEventListener.cpp
</span><span class="cx"> bindings/js/JSEventTargetCustom.cpp
</span><span class="cx"> bindings/js/JSExceptionBase.cpp
</span><del>- bindings/js/JSFileReaderCustom.cpp
</del><span class="cx"> bindings/js/JSHTMLAllCollectionCustom.cpp
</span><span class="cx"> bindings/js/JSHTMLAppletElementCustom.cpp
</span><span class="cx"> bindings/js/JSHTMLCanvasElementCustom.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/ChangeLog        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -1,3 +1,189 @@
</span><ins>+2016-12-25 Darin Adler <darin@apple.com>
+
+ Remove setDOMException and a few custom bindings
+ https://bugs.webkit.org/show_bug.cgi?id=166002
+
+ Reviewed by Sam Weinig.
+
+ * CMakeLists.txt: Removed JSFileReaderCustom.cpp.
+
+ * WebCore.xcodeproj/project.pbxproj: Removed JSFileReaderCustom.cpp.
+
+ * bindings/js/CallbackFunction.cpp:
+ (WebCore::checkFunctionOnlyCallback): Use throwTypeMismatchError instead
+ of calling setDOMException with TYPE_MISMATCH_ERR.
+
+ * bindings/js/JSBindingsAllInOne.cpp: Removed JSFileReaderCustom.cpp.
+
+ * bindings/js/JSCSSStyleDeclarationCustom.cpp:
+ (WebCore::JSCSSStyleDeclaration::putDelegate): Pass a throw scope in to
+ propagateException.
+
+ * bindings/js/JSCryptoAlgorithmDictionary.cpp:
+ (WebCore::JSCryptoAlgorithmDictionary::parseAlgorithmIdentifier):
+ Renamed from getAlgorithmIdentifier. Got rid of bool return value, instead
+ use a conventional return value and conventional JavaScript exception
+ handling. Added a ThrowScope argument.
+ (WebCore::optionalHashAlgorithm): Added. Returns an optional hash algorithm.
+ Also makes the same changes as above, conventional exception handling and
+ ThrowScope argument.
+ (WebCore::requiredHashAlgorithm): Added. Like the above but throws an
+ exception if the algorithm is omitted.
+ (WebCore::getHashAlgorithm): Deleted. Replaced by the two functions above.
+ (WebCore::createAesCbcParams): Updated for above changes.
+ (WebCore::createHmacParams): Ditto.
+ (WebCore::createHmacKeyParams): Ditto.
+ (WebCore::createRsaKeyGenParams): Ditto.
+ (WebCore::createRsaOaepParams): Ditto.
+ (WebCore::createRsaSsaParams): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForEncrypt): Added
+ a ThrowScope argument, and changed to use throwNotSupportedError instead
+ of setDOMException with NOT_SUPPORTED_ERROR.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForDecrypt): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForSign): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForVerify):
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForDigest): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForGenerateKey): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForDeriveKey): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForDeriveBits): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForImportKey): Ditto.
+ (WebCore::JSCryptoAlgorithmDictionary::createParametersForExportKey): Ditto.
+ * bindings/js/JSCryptoAlgorithmDictionary.h: Updated for the above changes.
+
+ * bindings/js/JSCryptoOperationData.cpp:
+ (WebCore::cryptoOperationDataFromJSValue): Got rid of bool return value and
+ instead use a conventional return value and conventional JS exception handling.
+ Added a ThrowScope argument.
+ * bindings/js/JSCryptoOperationData.h: Updated for the above.
+
+ * bindings/js/JSCustomXPathNSResolver.cpp:
+ (WebCore::JSCustomXPathNSResolver::create): Use ExceptionOr.
+ (WebCore::JSCustomXPathNSResolver::JSCustomXPathNSResolver): Take a VM&
+ rather than an ExecState*.
+ * bindings/js/JSCustomXPathNSResolver.h: Updated for the changes above.
+ Also marked class final and fixed indentation.
+
+ * bindings/js/JSDOMBinding.cpp:
+ (WebCore::createDOMException): Updated comment.
+ (WebCore::throwDOMException): Deleted.
+ (WebCore::propagateException): Deleted non-inline overload that does not take
+ a throw scope, now that all callers pass a throw scope.
+ (WebCore::setDOMExceptionSlow): Deleted.
+ (WebCore::setDOMException): Deleted.
+ (WebCore::throwNotSupportedError): Added.
+ (WebCore::throwDOMSyntaxError): Added.
+ (WebCore::throwDataCloneError): Added.
+ (WebCore::throwIndexSizeError): Added.
+ (WebCore::throwTypeMismatchError): Added.
+ * bindings/js/JSDOMBinding.h: Updated for the additions and removals
+ above. Also grouped the standard DOM exception throwing functions separately
+ from the special ones for getters and setters, and sorted them alphabetically.
+
+ * bindings/js/JSDataCueCustom.cpp:
+ (WebCore::createJSDataCue): Added, helper function for the below.
+ (WebCore::constructJSDataCue): Tightened and tweaked a bit.
+
+ * bindings/js/JSFileReaderCustom.cpp: Removed.
+
+ * bindings/js/JSHTMLOptionsCollectionCustom.cpp:
+ (WebCore::JSHTMLOptionsCollection::setLength): Use throwIndexSizeError instead
+ of setDOMException with INDEX_SIZE_ERR.
+ * bindings/js/JSHTMLSelectElementCustom.cpp:
+ (WebCore::selectElementIndexSetter): Use throwTypeMismatchError instead of
+ setDOMExceptoin with TYPEMISMATCH_ERR.
+
+ * bindings/js/JSIDBRequestCustom.cpp:
+ (WebCore::JSIDBRequest::result): Pass a throw scope in to
+ propagateException.
+
+ * bindings/js/JSSQLResultSetRowListCustom.cpp:
+ (WebCore::JSSQLResultSetRowList::item): Use throwTypeMismatchError and
+ throwIndexSizeError instead of setDOMException with TYPE_MISMATCH_ERR and
+ INDEX_ERR. This required adding a throw scope.
+
+ * bindings/js/JSSQLTransactionCustom.cpp:
+ (WebCore::JSSQLTransaction::executeSql): Use throwDOMSyntaxError and
+ throwTypeMismatchError instead of setDOMException with SYNTAX_ERR and
+ TYPE_MISMATCH_ERR.
+
+ * bindings/js/JSStorageCustom.cpp:
+ (WebCore::JSStorage::nameGetter): Pass a throw scope in to
+ propagateException.
+
+ * bindings/js/JSSubtleCryptoCustom.cpp:
+ (WebCore::normalizeCryptoAlgorithmParameters): Use throwNotSupportedError
+ instead of setDOMException with NOT_SUPPORTED_ERR.
+ (WebCore::createAlgorithm): Deleted.
+ (WebCore::supportExportKeyThrow): Added ThrowScope argument and use
+ throwNotSupportedError instead of setDOMException with NOT_SUPPORTED_ERR.
+ (WebCore::jsSubtleCryptoFunctionEncryptPromise): Updated for above changes,
+ throwing a not supported exception at this level rather than in a helper.
+ (WebCore::jsSubtleCryptoFunctionDecryptPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionSignPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionVerifyPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionDigestPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionGenerateKeyPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionImportKeyPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionExportKeyPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionWrapKeyPromise): Ditto.
+ (WebCore::jsSubtleCryptoFunctionUnwrapKeyPromise): Ditto.
+
+ * bindings/js/JSWebKitSubtleCryptoCustom.cpp:
+ (WebCore::createAlgorithmFromJSValue): Got rid of bool return value and
+ instead use a conventional return value and conventional JS exception handling.
+ Added a ThrowScope argument.
+ (WebCore::cryptoKeyFormatFromJSValue): Ditto.
+ (WebCore::cryptoKeyUsagesFromJSValue): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::encrypt): Updated for above changes.
+ (WebCore::JSWebKitSubtleCrypto::decrypt): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::sign): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::verify): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::digest): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::generateKey): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::importKey): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::exportKey): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::wrapKey): Ditto.
+ (WebCore::JSWebKitSubtleCrypto::unwrapKey): Ditto.
+
+ * bindings/js/JSXMLHttpRequestCustom.cpp:
+ (WebCore::JSXMLHttpRequest::send): Pass a throw scope in to
+ propagateException.
+ (WebCore::JSXMLHttpRequest::responseText): Ditto.
+
+ * bindings/js/JSXPathNSResolverCustom.cpp:
+ (WebCore::JSXPathNSResolver::toWrapped): Updated since
+ JSCustomXPathNSResolver::create now uses ExceptionOr.
+
+ * bindings/js/SerializedScriptValue.cpp:
+ (WebCore::maybeThrowExceptionIfSerializationFailed): Updated to take
+ a reference instead of a pointer. Fixed the handling of success to be
+ simpler; no need to check the code twice. Use throwDataCloneError instead
+ of setDOMException with DATA_CLONE_ERR.
+ (WebCore::SerializedScriptValue::create): Updated for above.
+ (WebCore::SerializedScriptValue::deserialize): Ditto.
+
+ * bindings/js/StructuredClone.cpp:
+ (WebCore::structuredCloneArrayBuffer): Use throwDataCloneError instead of
+ setDOMException with DATA_CLONE_ERR.
+ (WebCore::structuredCloneArrayBufferView): Ditto.
+
+ * crypto/CryptoAlgorithmParametersDeprecated.h: Removed unneeded empty
+ constructor.
+ * crypto/parameters/CryptoAlgorithmHmacKeyParamsDeprecated.h: Ditto,
+ moving initialization to where the data member is defined.
+ * crypto/parameters/CryptoAlgorithmRsaKeyGenParamsDeprecated.h: Ditto.
+ * crypto/parameters/CryptoAlgorithmRsaOaepParamsDeprecated.h: Ditto.
+
+ * fileapi/FileReader.cpp:
+ (WebCore::FileReader::result): Added. Returns a combination of optional
+ and variant that matches what the ID specifies. Moved the code from the
+ two following functions in here.
+ (WebCore::FileReader::arrayBufferResult): Deleted.
+ (WebCore::FileReader::stringResult): Deleted.
+ * fileapi/FileReader.h: Updated for the above.
+ * fileapi/FileReader.idl: Removed [Custom] from the result attribute and
+ declared it with the type mentioned in the specification, a nullable union.
+
</ins><span class="cx"> 2016-12-30 Darin Adler <darin@apple.com>
</span><span class="cx">
</span><span class="cx"> Remove PassRefPtr use from the "dom" directory, related cleanup
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -1274,7 +1274,6 @@
</span><span class="cx">                 2E4346530F546A8200B0F1BA /* WorkerRunLoop.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E4346410F546A8200B0F1BA /* WorkerRunLoop.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 2E4346540F546A8200B0F1BA /* WorkerThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E4346420F546A8200B0F1BA /* WorkerThread.cpp */; };
</span><span class="cx">                 2E4346550F546A8200B0F1BA /* WorkerThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E4346430F546A8200B0F1BA /* WorkerThread.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                2E7582EE12764F260062628B /* JSFileReaderCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E7582ED12764F260062628B /* JSFileReaderCustom.cpp */; };
</del><span class="cx">                 2E75841D12779ADA0062628B /* FileReaderLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E75841A12779ADA0062628B /* FileReaderLoader.cpp */; };
</span><span class="cx">                 2E75841E12779ADA0062628B /* FileReaderLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E75841B12779ADA0062628B /* FileReaderLoader.h */; };
</span><span class="cx">                 2E75841F12779ADA0062628B /* FileReaderLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E75841C12779ADA0062628B /* FileReaderLoaderClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -8424,7 +8423,6 @@
</span><span class="cx">                 2E4346410F546A8200B0F1BA /* WorkerRunLoop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerRunLoop.h; sourceTree = "<group>"; };
</span><span class="cx">                 2E4346420F546A8200B0F1BA /* WorkerThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerThread.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 2E4346430F546A8200B0F1BA /* WorkerThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerThread.h; sourceTree = "<group>"; };
</span><del>-                2E7582ED12764F260062628B /* JSFileReaderCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFileReaderCustom.cpp; sourceTree = "<group>"; };
</del><span class="cx">                 2E75841A12779ADA0062628B /* FileReaderLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileReaderLoader.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 2E75841B12779ADA0062628B /* FileReaderLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileReaderLoader.h; sourceTree = "<group>"; };
</span><span class="cx">                 2E75841C12779ADA0062628B /* FileReaderLoaderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileReaderLoaderClient.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -22114,7 +22112,6 @@
</span><span class="cx">                                 BC64649B11D8238C006455B0 /* JSDOMStringMapCustom.cpp */,
</span><span class="cx">                                 BCD9C25E0C17AA67005C90A2 /* JSDOMWindowCustom.cpp */,
</span><span class="cx">                                 652FBBBB0DE27CB60001D386 /* JSDOMWindowCustom.h */,
</span><del>-                                2E7582ED12764F260062628B /* JSFileReaderCustom.cpp */,
</del><span class="cx">                                 C28083411C6DC96A001451B6 /* JSFontFaceCustom.cpp */,
</span><span class="cx">                                 1C24EEAA1C72AA0A0080F8FC /* JSFontFaceSetCustom.cpp */,
</span><span class="cx">                                 BCE7B1920D4E86960075A539 /* JSHistoryCustom.cpp */,
</span><span class="lines">@@ -29954,7 +29951,6 @@
</span><span class="cx">                                 898785F0122E1E87003AABDA /* JSFileException.cpp in Sources */,
</span><span class="cx">                                 BC00F0160E0A189500FD04E3 /* JSFileList.cpp in Sources */,
</span><span class="cx">                                 2E94F43B119207DA00B7F75D /* JSFileReader.cpp in Sources */,
</span><del>-                                2E7582EE12764F260062628B /* JSFileReaderCustom.cpp in Sources */,
</del><span class="cx">                                 898785F4122E1EAC003AABDA /* JSFileReaderSync.cpp in Sources */,
</span><span class="cx">                                 B6D9D27C14EAC0860090D75E /* JSFocusEvent.cpp in Sources */,
</span><span class="cx">                                 C28083401C6DC275001451B6 /* JSFontFace.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsCallbackFunctioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/CallbackFunction.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/CallbackFunction.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/CallbackFunction.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-bool checkFunctionOnlyCallback(JSC::ExecState* exec, JSC::JSValue value, CallbackAllowedValueFlags acceptedValues)
</del><ins>+bool checkFunctionOnlyCallback(JSC::ExecState* state, JSC::JSValue value, CallbackAllowedValueFlags acceptedValues)
</ins><span class="cx"> {
</span><span class="cx"> if (value.isUndefined() && (acceptedValues & CallbackAllowUndefined))
</span><span class="cx"> return false;
</span><span class="lines">@@ -41,7 +41,8 @@
</span><span class="cx">
</span><span class="cx"> JSC::CallData callData;
</span><span class="cx"> if (getCallData(value, callData) == JSC::CallType::None) {
</span><del>- setDOMException(exec, TYPE_MISMATCH_ERR);
</del><ins>+ auto scope = DECLARE_THROW_SCOPE(state->vm());
+ throwTypeMismatchError(*state, scope);
</ins><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSBindingsAllInOnecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -69,7 +69,6 @@
</span><span class="cx"> #include "JSEventListener.cpp"
</span><span class="cx"> #include "JSEventTargetCustom.cpp"
</span><span class="cx"> #include "JSExceptionBase.cpp"
</span><del>-#include "JSFileReaderCustom.cpp"
</del><span class="cx"> #include "JSHTMLAllCollectionCustom.cpp"
</span><span class="cx"> #include "JSHTMLAppletElementCustom.cpp"
</span><span class="cx"> #include "JSHTMLCanvasElementCustom.cpp"
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCSSStyleDeclarationCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -342,7 +342,9 @@
</span><span class="cx">
</span><span class="cx"> auto setPropertyInternalResult = wrapped().setPropertyInternal(propertyInfo.propertyID, propertyValue, important);
</span><span class="cx"> if (setPropertyInternalResult.hasException()) {
</span><del>- propagateException(*state, setPropertyInternalResult.releaseException());
</del><ins>+ auto& vm = state->vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ propagateException(*state, scope, setPropertyInternalResult.releaseException());
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx"> putResult = setPropertyInternalResult.releaseReturnValue();
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCryptoAlgorithmDictionarycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -47,20 +47,13 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-enum class HashRequirement {
- Optional,
- Required,
-};
-
</del><span class="cx"> static inline JSValue getProperty(ExecState& state, JSObject* object, const char* name)
</span><span class="cx"> {
</span><span class="cx"> return object->get(&state, Identifier::fromString(&state, name));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool JSCryptoAlgorithmDictionary::getAlgorithmIdentifier(ExecState& state, JSValue value, CryptoAlgorithmIdentifier& algorithmIdentifier)
</del><ins>+CryptoAlgorithmIdentifier JSCryptoAlgorithmDictionary::parseAlgorithmIdentifier(ExecState& state, ThrowScope& scope, JSValue value)
</ins><span class="cx"> {
</span><del>- auto scope = DECLARE_THROW_SCOPE(state.vm());
-
</del><span class="cx"> // typedef (Algorithm or DOMString) AlgorithmIdentifier;
</span><span class="cx">
</span><span class="cx"> String algorithmName;
</span><span class="lines">@@ -67,11 +60,11 @@
</span><span class="cx">
</span><span class="cx"> if (value.isString()) {
</span><span class="cx"> algorithmName = asString(value)->value(&state);
</span><del>- RETURN_IF_EXCEPTION(scope, false);
</del><ins>+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> } else if (value.isObject()) {
</span><span class="cx"> if (asObject(value)->inherits(StringObject::info())) {
</span><del>- algorithmName = asString(asStringObject(value)->internalValue())->value(&state);
- RETURN_IF_EXCEPTION(scope, false);
</del><ins>+ algorithmName = asStringObject(value)->internalValue()->value(&state);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> } else {
</span><span class="cx"> // FIXME: This doesn't perform some checks mandated by WebIDL for dictionaries:
</span><span class="cx"> // - null and undefined input should be treated as if all elements in the dictionary were undefined;
</span><span class="lines">@@ -82,42 +75,49 @@
</span><span class="cx"> // WebCrypto doesn't yet clearly specify what to do with non-present values in most cases anyway.
</span><span class="cx">
</span><span class="cx"> auto nameValue = getProperty(state, asObject(value), "name");
</span><del>- RETURN_IF_EXCEPTION(scope, false);
</del><ins>+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> algorithmName = convert<IDLDOMString>(state, nameValue);
</span><del>- RETURN_IF_EXCEPTION(scope, false);
</del><ins>+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (!algorithmName.containsOnlyASCII()) {
</span><span class="cx"> throwSyntaxError(&state, scope);
</span><del>- return false;
</del><ins>+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> auto identifier = CryptoAlgorithmRegistry::singleton().identifier(algorithmName);
</span><span class="cx"> if (!identifier) {
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
- return false;
</del><ins>+ throwNotSupportedError(state, scope);
+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- algorithmIdentifier = *identifier;
- return true;
</del><ins>+ return identifier.value();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static bool getHashAlgorithm(ExecState& state, JSObject* object, CryptoAlgorithmIdentifier& result, HashRequirement isRequired)
</del><ins>+static std::optional<CryptoAlgorithmIdentifier> optionalHashAlgorithm(ExecState& state, ThrowScope& scope, JSObject* object)
</ins><span class="cx"> {
</span><del>- auto scope = DECLARE_THROW_SCOPE(state.vm());
-
</del><span class="cx"> auto hash = getProperty(state, object, "hash");
</span><del>- RETURN_IF_EXCEPTION(scope, false);
</del><ins>+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- if (hash.isUndefinedOrNull()) {
- if (isRequired == HashRequirement::Required)
- setDOMException(&state, NOT_SUPPORTED_ERR);
- return false;
</del><ins>+ if (hash.isUndefinedOrNull())
+ return std::nullopt;
+
+ return JSCryptoAlgorithmDictionary::parseAlgorithmIdentifier(state, scope, hash);
+}
+
+static CryptoAlgorithmIdentifier requiredHashAlgorithm(ExecState& state, ThrowScope& scope, JSObject* object)
+{
+ auto result = optionalHashAlgorithm(state, scope, object);
+ RETURN_IF_EXCEPTION(scope, { });
+
+ if (!result) {
+ throwNotSupportedError(state, scope);
+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- return JSCryptoAlgorithmDictionary::getAlgorithmIdentifier(state, hash, result);
</del><ins>+ return result.value();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static RefPtr<CryptoAlgorithmParametersDeprecated> createAesCbcParams(ExecState& state, JSValue value)
</span><span class="lines">@@ -130,15 +130,12 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> auto iv = getProperty(state, asObject(value), "iv");
</span><del>- RETURN_IF_EXCEPTION(scope, nullptr);
</del><ins>+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> auto result = adoptRef(*new CryptoAlgorithmAesCbcParamsDeprecated);
</span><span class="cx">
</span><del>- CryptoOperationData ivData;
- auto success = cryptoOperationDataFromJSValue(state, iv, ivData);
- ASSERT(scope.exception() || success);
- if (!success)
- return nullptr;
</del><ins>+ auto ivData = cryptoOperationDataFromJSValue(state, scope, iv);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> if (ivData.second != 16) {
</span><span class="cx"> throwException(&state, scope, createError(&state, "AES-CBC initialization data must be 16 bytes"));
</span><span class="lines">@@ -180,10 +177,8 @@
</span><span class="cx">
</span><span class="cx"> auto result = adoptRef(*new CryptoAlgorithmHmacParamsDeprecated);
</span><span class="cx">
</span><del>- auto success = getHashAlgorithm(state, asObject(value), result->hash, HashRequirement::Required);
- ASSERT_UNUSED(scope, scope.exception() || success);
- if (!success)
- return nullptr;
</del><ins>+ result->hash = requiredHashAlgorithm(state, scope, asObject(value));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> return WTFMove(result);
</span><span class="cx"> }
</span><span class="lines">@@ -199,10 +194,8 @@
</span><span class="cx">
</span><span class="cx"> auto result = adoptRef(*new CryptoAlgorithmHmacKeyParamsDeprecated);
</span><span class="cx">
</span><del>- auto success = getHashAlgorithm(state, asObject(value), result->hash, HashRequirement::Required);
- ASSERT(scope.exception() || success);
- if (!success)
- return nullptr;
</del><ins>+ result->hash = requiredHashAlgorithm(state, scope, asObject(value));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> auto lengthValue = getProperty(state, asObject(value), "length");
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, nullptr);
</span><span class="lines">@@ -243,7 +236,10 @@
</span><span class="cx"> }
</span><span class="cx"> result->publicExponent.append(publicExponentArray->data(), publicExponentArray->byteLength());
</span><span class="cx">
</span><del>- result->hasHash = getHashAlgorithm(state, asObject(value), result->hash, HashRequirement::Optional);
</del><ins>+ if (auto optionalHash = optionalHashAlgorithm(state, scope, asObject(value))) {
+ result->hasHash = true;
+ result->hash = optionalHash.value();
+ }
</ins><span class="cx">
</span><span class="cx"> return WTFMove(result);
</span><span class="cx"> }
</span><span class="lines">@@ -265,23 +261,18 @@
</span><span class="cx">
</span><span class="cx"> auto result = adoptRef(*new CryptoAlgorithmRsaOaepParamsDeprecated);
</span><span class="cx">
</span><del>- auto success = getHashAlgorithm(state, asObject(value), result->hash, HashRequirement::Required);
- ASSERT(scope.exception() || success);
- if (!success)
- return nullptr;
</del><ins>+ result->hash = requiredHashAlgorithm(state, scope, asObject(value));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> auto labelValue = getProperty(state, asObject(value), "label");
</span><del>- RETURN_IF_EXCEPTION(scope, nullptr);
</del><ins>+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> result->hasLabel = !labelValue.isUndefinedOrNull();
</span><span class="cx"> if (!result->hasLabel)
</span><span class="cx"> return WTFMove(result);
</span><span class="cx">
</span><del>- CryptoOperationData labelData;
- success = cryptoOperationDataFromJSValue(state, labelValue, labelData);
- ASSERT(scope.exception() || success);
- if (!success)
- return nullptr;
</del><ins>+ auto labelData = cryptoOperationDataFromJSValue(state, scope, labelValue);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> result->label.append(labelData.first, labelData.second);
</span><span class="cx">
</span><span class="lines">@@ -299,15 +290,13 @@
</span><span class="cx">
</span><span class="cx"> auto result = adoptRef(*new CryptoAlgorithmRsaSsaParamsDeprecated);
</span><span class="cx">
</span><del>- auto success = getHashAlgorithm(state, asObject(value), result->hash, HashRequirement::Required);
- ASSERT(scope.exception() || success);
- if (!success)
- return nullptr;
</del><ins>+ result->hash = requiredHashAlgorithm(state, scope, asObject(value));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> return WTFMove(result);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForEncrypt(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue value)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForEncrypt(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -314,7 +303,7 @@
</span><span class="cx"> return adoptRef(*new CryptoAlgorithmParametersDeprecated);
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5:
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSA_PSS:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSA_OAEP:
</span><span class="cx"> return createRsaOaepParams(state, value);
</span><span class="lines">@@ -321,7 +310,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::ECDSA:
</span><span class="cx"> case CryptoAlgorithmIdentifier::ECDH:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CTR:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CBC:
</span><span class="cx"> return createAesCbcParams(state, value);
</span><span class="lines">@@ -328,7 +317,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CMAC:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_GCM:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CFB:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_KW:
</span><span class="cx"> return adoptRef(*new CryptoAlgorithmParametersDeprecated);
</span><span class="lines">@@ -342,7 +331,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -349,7 +338,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDecrypt(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue value)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDecrypt(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -356,7 +345,7 @@
</span><span class="cx"> return adoptRef(*new CryptoAlgorithmParametersDeprecated);
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5:
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSA_PSS:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSA_OAEP:
</span><span class="cx"> return createRsaOaepParams(state, value);
</span><span class="lines">@@ -363,7 +352,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::ECDSA:
</span><span class="cx"> case CryptoAlgorithmIdentifier::ECDH:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CTR:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CBC:
</span><span class="cx"> return createAesCbcParams(state, value);
</span><span class="lines">@@ -370,7 +359,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CMAC:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_GCM:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CFB:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_KW:
</span><span class="cx"> return adoptRef(*new CryptoAlgorithmParametersDeprecated);
</span><span class="lines">@@ -384,7 +373,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -391,11 +380,11 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForSign(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue value)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForSign(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5:
</span><span class="cx"> return createRsaSsaParams(state, value);
</span><span class="lines">@@ -409,7 +398,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_GCM:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CFB:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_KW:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::HMAC:
</span><span class="cx"> return createHmacParams(state, value);
</span><span class="lines">@@ -422,7 +411,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -429,11 +418,11 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForVerify(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue value)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForVerify(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5:
</span><span class="cx"> return createRsaSsaParams(state, value);
</span><span class="lines">@@ -447,7 +436,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_GCM:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CFB:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_KW:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::HMAC:
</span><span class="cx"> return createHmacParams(state, value);
</span><span class="lines">@@ -460,7 +449,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -467,7 +456,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDigest(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDigest(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -484,7 +473,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_KW:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HMAC:
</span><span class="cx"> case CryptoAlgorithmIdentifier::DH:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::SHA_1:
</span><span class="cx"> case CryptoAlgorithmIdentifier::SHA_224:
</span><span class="lines">@@ -495,7 +484,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -502,7 +491,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForGenerateKey(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue value)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForGenerateKey(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -512,7 +501,7 @@
</span><span class="cx"> return createRsaKeyGenParams(state, value);
</span><span class="cx"> case CryptoAlgorithmIdentifier::ECDSA:
</span><span class="cx"> case CryptoAlgorithmIdentifier::ECDH:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::AES_CBC:
</span><span class="lines">@@ -532,7 +521,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -539,7 +528,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDeriveKey(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDeriveKey(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -564,7 +553,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -571,7 +560,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDeriveBits(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForDeriveBits(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -596,7 +585,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -603,7 +592,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForImportKey(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue value)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForImportKey(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -632,7 +621,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -639,7 +628,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForExportKey(ExecState& state, CryptoAlgorithmIdentifier algorithm, JSValue)
</del><ins>+RefPtr<CryptoAlgorithmParametersDeprecated> JSCryptoAlgorithmDictionary::createParametersForExportKey(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier algorithm, JSValue)
</ins><span class="cx"> {
</span><span class="cx"> switch (algorithm) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -665,7 +654,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::CONCAT:
</span><span class="cx"> case CryptoAlgorithmIdentifier::HKDF_CTR:
</span><span class="cx"> case CryptoAlgorithmIdentifier::PBKDF2:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCryptoAlgorithmDictionaryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -28,11 +28,12 @@
</span><span class="cx"> #if ENABLE(SUBTLE_CRYPTO)
</span><span class="cx">
</span><span class="cx"> #include "CryptoAlgorithmIdentifier.h"
</span><del>-#include <wtf/RefPtr.h>
</del><ins>+#include <wtf/Forward.h>
</ins><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class ExecState;
</span><span class="cx"> class JSValue;
</span><ins>+class ThrowScope;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -41,18 +42,18 @@
</span><span class="cx">
</span><span class="cx"> class JSCryptoAlgorithmDictionary {
</span><span class="cx"> public:
</span><del>- static bool getAlgorithmIdentifier(JSC::ExecState&, JSC::JSValue, CryptoAlgorithmIdentifier&);
</del><ins>+ static CryptoAlgorithmIdentifier parseAlgorithmIdentifier(JSC::ExecState&, JSC::ThrowScope&, JSC::JSValue);
</ins><span class="cx">
</span><del>- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForEncrypt(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDecrypt(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForSign(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForVerify(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDigest(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForGenerateKey(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDeriveKey(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDeriveBits(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForImportKey(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
- static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForExportKey(JSC::ExecState&, CryptoAlgorithmIdentifier, JSC::JSValue);
</del><ins>+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForEncrypt(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDecrypt(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForSign(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForVerify(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDigest(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForGenerateKey(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDeriveKey(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForDeriveBits(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForImportKey(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
+ static RefPtr<CryptoAlgorithmParametersDeprecated> createParametersForExportKey(JSC::ExecState&, JSC::ThrowScope&, CryptoAlgorithmIdentifier, JSC::JSValue);
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCryptoOperationDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCryptoOperationData.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCryptoOperationData.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCryptoOperationData.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -34,19 +34,16 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-bool cryptoOperationDataFromJSValue(ExecState& state, JSValue value, CryptoOperationData& result)
</del><ins>+CryptoOperationData cryptoOperationDataFromJSValue(ExecState& state, ThrowScope& scope, JSValue value)
</ins><span class="cx"> {
</span><del>- auto scope = DECLARE_THROW_SCOPE(state.vm());
</del><ins>+ if (auto* buffer = toUnsharedArrayBuffer(value))
+ return { static_cast<uint8_t*>(buffer->data()), buffer->byteLength() };
</ins><span class="cx">
</span><del>- if (ArrayBuffer* buffer = toUnsharedArrayBuffer(value))
- result = std::make_pair(static_cast<uint8_t*>(buffer->data()), buffer->byteLength());
- else if (RefPtr<ArrayBufferView> bufferView = toUnsharedArrayBufferView(value))
- result = std::make_pair(static_cast<uint8_t*>(bufferView->baseAddress()), bufferView->byteLength());
- else {
- throwTypeError(&state, scope, ASCIILiteral("Only ArrayBuffer and ArrayBufferView objects can be passed as CryptoOperationData"));
- return false;
- }
- return true;
</del><ins>+ if (auto bufferView = toUnsharedArrayBufferView(value))
+ return { static_cast<uint8_t*>(bufferView->baseAddress()), bufferView->byteLength() };
+
+ throwTypeError(&state, scope, ASCIILiteral("Only ArrayBuffer and ArrayBufferView objects can be passed as CryptoOperationData"));
+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCryptoOperationDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCryptoOperationData.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCryptoOperationData.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCryptoOperationData.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -30,13 +30,14 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class ExecState;
</span><span class="cx"> class JSValue;
</span><ins>+class ThrowScope;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-typedef std::pair<const uint8_t*, size_t> CryptoOperationData;
</del><ins>+using CryptoOperationData = std::pair<const uint8_t*, size_t>;
</ins><span class="cx">
</span><del>-bool cryptoOperationDataFromJSValue(JSC::ExecState&, JSC::JSValue, CryptoOperationData&);
</del><ins>+CryptoOperationData cryptoOperationDataFromJSValue(JSC::ExecState&, JSC::ThrowScope&, JSC::JSValue);
</ins><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCustomXPathNSResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -42,23 +42,21 @@
</span><span class="cx">
</span><span class="cx"> using namespace JSC;
</span><span class="cx">
</span><del>-RefPtr<JSCustomXPathNSResolver> JSCustomXPathNSResolver::create(ExecState* exec, JSValue value)
</del><ins>+ExceptionOr<Ref<JSCustomXPathNSResolver>> JSCustomXPathNSResolver::create(ExecState& state, JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> if (value.isUndefinedOrNull())
</span><del>- return nullptr;
</del><ins>+ return Exception { TypeError };
</ins><span class="cx">
</span><del>- JSObject* resolverObject = value.getObject();
- if (!resolverObject) {
- setDOMException(exec, TYPE_MISMATCH_ERR);
- return nullptr;
- }
</del><ins>+ auto* resolverObject = value.getObject();
+ if (!resolverObject)
+ return Exception { TYPE_MISMATCH_ERR };
</ins><span class="cx">
</span><del>- return adoptRef(*new JSCustomXPathNSResolver(exec, resolverObject, asJSDOMWindow(exec->vmEntryGlobalObject())));
</del><ins>+ return adoptRef(*new JSCustomXPathNSResolver(state.vm(), resolverObject, asJSDOMWindow(state.vmEntryGlobalObject())));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-JSCustomXPathNSResolver::JSCustomXPathNSResolver(ExecState* exec, JSObject* customResolver, JSDOMWindow* globalObject)
- : m_customResolver(exec->vm(), customResolver)
- , m_globalObject(exec->vm(), globalObject)
</del><ins>+JSCustomXPathNSResolver::JSCustomXPathNSResolver(VM& vm, JSObject* customResolver, JSDOMWindow* globalObject)
+ : m_customResolver(vm, customResolver)
+ , m_globalObject(vm, globalObject)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCustomXPathNSResolverh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -25,38 +25,30 @@
</span><span class="cx">
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><ins>+#include "ExceptionOr.h"
</ins><span class="cx"> #include "XPathNSResolver.h"
</span><span class="cx"> #include <heap/Strong.h>
</span><span class="cx"> #include <heap/StrongInlines.h>
</span><span class="cx"> #include <runtime/JSCInlines.h>
</span><span class="cx"> #include <runtime/JSCJSValue.h>
</span><del>-#include <wtf/Forward.h>
-#include <wtf/RefPtr.h>
</del><span class="cx">
</span><del>-namespace JSC {
- class ExecState;
- class JSObject;
-}
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>- class Frame;
- class JSDOMWindow;
</del><ins>+class JSDOMWindow;
</ins><span class="cx">
</span><del>- class JSCustomXPathNSResolver : public XPathNSResolver {
- public:
- static RefPtr<JSCustomXPathNSResolver> create(JSC::ExecState*, JSC::JSValue);
-
- virtual ~JSCustomXPathNSResolver();
</del><ins>+class JSCustomXPathNSResolver final : public XPathNSResolver {
+public:
+ static ExceptionOr<Ref<JSCustomXPathNSResolver>> create(JSC::ExecState&, JSC::JSValue);
+ virtual ~JSCustomXPathNSResolver();
</ins><span class="cx">
</span><del>- String lookupNamespaceURI(const String& prefix) override;
</del><ins>+private:
+ JSCustomXPathNSResolver(JSC::VM&, JSC::JSObject*, JSDOMWindow*);
</ins><span class="cx">
</span><del>- private:
- JSCustomXPathNSResolver(JSC::ExecState*, JSC::JSObject*, JSDOMWindow*);
</del><ins>+ String lookupNamespaceURI(const String& prefix) final;
</ins><span class="cx">
</span><del>- // JSCustomXPathNSResolvers are always temporary so using a Strong reference is safe here.
- JSC::Strong<JSC::JSObject> m_customResolver;
- JSC::Strong<JSDOMWindow> m_globalObject;
- };
</del><ins>+ // JSCustomXPathNSResolvers are always temporary so using a Strong reference is safe here.
+ JSC::Strong<JSC::JSObject> m_customResolver;
+ JSC::Strong<JSDOMWindow> m_globalObject;
+};
</ins><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -290,9 +290,9 @@
</span><span class="cx"> if (ec == StackOverflowError)
</span><span class="cx"> return createStackOverflowError(exec);
</span><span class="cx">
</span><del>- // FIXME: All callers to setDOMException need to pass in the right global object
- // for now, we're going to assume the lexicalGlobalObject. Which is wrong in cases like this:
- // frames[0].document.createElement(null, null); // throws an exception which should have the subframes prototypes.
</del><ins>+ // FIXME: All callers to createDOMException need to pass in the correct global object.
+ // For now, we're going to assume the lexicalGlobalObject. Which is wrong in cases like this:
+ // frames[0].document.createElement(null, null); // throws an exception which should have the subframe's prototypes.
</ins><span class="cx"> JSDOMGlobalObject* globalObject = deprecatedGlobalObjectForPrototype(exec);
</span><span class="cx">
</span><span class="cx"> ExceptionCodeDescription description(ec);
</span><span class="lines">@@ -342,12 +342,6 @@
</span><span class="cx"> return createDOMException(&state, exception.code(), exception.releaseMessage());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-ALWAYS_INLINE static void throwDOMException(ExecState* exec, ThrowScope& throwScope, ExceptionCode ec)
-{
- ASSERT(ec && !throwScope.exception());
- throwException(exec, throwScope, createDOMException(exec, ec));
-}
-
</del><span class="cx"> void propagateExceptionSlowPath(JSC::ExecState& state, JSC::ThrowScope& throwScope, Exception&& exception)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(!throwScope.exception());
</span><span class="lines">@@ -354,29 +348,6 @@
</span><span class="cx"> throwException(&state, throwScope, createDOMException(state, WTFMove(exception)));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void propagateException(JSC::ExecState& state, Exception&& exception)
-{
- auto throwScope = DECLARE_THROW_SCOPE(state.vm());
- if (!throwScope.exception())
- propagateExceptionSlowPath(state, throwScope, WTFMove(exception));
-}
-
-void setDOMExceptionSlow(ExecState* exec, ThrowScope& throwScope, ExceptionCode ec)
-{
- throwDOMException(exec, throwScope, ec);
-}
-
-void setDOMException(ExecState* exec, ExceptionCode ec)
-{
- VM& vm = exec->vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
-
- if (!ec || scope.exception())
- return;
-
- throwDOMException(exec, scope, ec);
-}
-
</del><span class="cx"> bool hasIteratorMethod(JSC::ExecState& state, JSC::JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto& vm = state.vm();
</span><span class="lines">@@ -871,6 +842,12 @@
</span><span class="cx"> context.addConsoleMessage(MessageSource::JS, MessageLevel::Error, makeString("Deprecated attempt to set property '", attributeName, "' on a non-", interfaceName, " object."));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void throwNotSupportedError(JSC::ExecState& state, JSC::ThrowScope& scope)
+{
+ ASSERT(!scope.exception());
+ throwException(&state, scope, createDOMException(&state, NOT_SUPPORTED_ERR));
+}
+
</ins><span class="cx"> void throwNotSupportedError(JSC::ExecState& state, JSC::ThrowScope& scope, const char* message)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(!scope.exception());
</span><span class="lines">@@ -1030,4 +1007,28 @@
</span><span class="cx"> return CallType::Host;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void throwDOMSyntaxError(JSC::ExecState& state, JSC::ThrowScope& scope)
+{
+ ASSERT(!scope.exception());
+ throwException(&state, scope, createDOMException(&state, SYNTAX_ERR));
+}
+
+void throwDataCloneError(JSC::ExecState& state, JSC::ThrowScope& scope)
+{
+ ASSERT(!scope.exception());
+ throwException(&state, scope, createDOMException(&state, DATA_CLONE_ERR));
+}
+
+void throwIndexSizeError(JSC::ExecState& state, JSC::ThrowScope& scope)
+{
+ ASSERT(!scope.exception());
+ throwException(&state, scope, createDOMException(&state, INDEX_SIZE_ERR));
+}
+
+void throwTypeMismatchError(JSC::ExecState& state, JSC::ThrowScope& scope)
+{
+ ASSERT(!scope.exception());
+ throwException(&state, scope, createDOMException(&state, TYPE_MISMATCH_ERR));
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -116,14 +116,20 @@
</span><span class="cx"> WEBCORE_EXPORT JSC::EncodedJSValue reportDeprecatedGetterError(JSC::ExecState&, const char* interfaceName, const char* attributeName);
</span><span class="cx"> WEBCORE_EXPORT void reportDeprecatedSetterError(JSC::ExecState&, const char* interfaceName, const char* attributeName);
</span><span class="cx">
</span><del>-void throwNotSupportedError(JSC::ExecState&, JSC::ThrowScope&, const char* message);
-void throwInvalidStateError(JSC::ExecState&, JSC::ThrowScope&, const char* message);
-void throwArrayElementTypeError(JSC::ExecState&, JSC::ThrowScope&);
</del><span class="cx"> void throwAttributeTypeError(JSC::ExecState&, JSC::ThrowScope&, const char* interfaceName, const char* attributeName, const char* expectedType);
</span><del>-WEBCORE_EXPORT void throwSequenceTypeError(JSC::ExecState&, JSC::ThrowScope&);
</del><span class="cx"> WEBCORE_EXPORT bool throwSetterTypeError(JSC::ExecState&, JSC::ThrowScope&, const char* interfaceName, const char* attributeName);
</span><ins>+
+void throwArrayElementTypeError(JSC::ExecState&, JSC::ThrowScope&);
+void throwDataCloneError(JSC::ExecState&, JSC::ThrowScope&);
+void throwDOMSyntaxError(JSC::ExecState&, JSC::ThrowScope&); // Not the same as a JavaScript syntax error.
+void throwIndexSizeError(JSC::ExecState&, JSC::ThrowScope&);
+void throwInvalidStateError(JSC::ExecState&, JSC::ThrowScope&, const char* message);
</ins><span class="cx"> WEBCORE_EXPORT void throwNonFiniteTypeError(JSC::ExecState&, JSC::ThrowScope&);
</span><ins>+void throwNotSupportedError(JSC::ExecState&, JSC::ThrowScope&);
+void throwNotSupportedError(JSC::ExecState&, JSC::ThrowScope&, const char* message);
</ins><span class="cx"> void throwSecurityError(JSC::ExecState&, JSC::ThrowScope&, const String& message);
</span><ins>+WEBCORE_EXPORT void throwSequenceTypeError(JSC::ExecState&, JSC::ThrowScope&);
+void throwTypeMismatchError(JSC::ExecState&, JSC::ThrowScope&);
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT JSC::EncodedJSValue throwArgumentMustBeEnumError(JSC::ExecState&, JSC::ThrowScope&, unsigned argumentIndex, const char* argumentName, const char* functionInterfaceName, const char* functionName, const char* expectedValues);
</span><span class="cx"> JSC::EncodedJSValue throwArgumentMustBeFunctionError(JSC::ExecState&, JSC::ThrowScope&, unsigned argumentIndex, const char* argumentName, const char* functionInterfaceName, const char* functionName);
</span><span class="lines">@@ -192,15 +198,7 @@
</span><span class="cx">
</span><span class="cx"> // Convert a DOM implementation exception into a JavaScript exception in the execution state.
</span><span class="cx"> void propagateException(JSC::ExecState&, JSC::ThrowScope&, Exception&&);
</span><del>-void setDOMException(JSC::ExecState*, JSC::ThrowScope&, ExceptionCode);
-
-// Slower versions of the above for use when the caller doesn't have a ThrowScope.
-void propagateException(JSC::ExecState&, Exception&&);
-WEBCORE_EXPORT void setDOMException(JSC::ExecState*, ExceptionCode);
-
-// Implementation details of the above.
</del><span class="cx"> WEBCORE_EXPORT void propagateExceptionSlowPath(JSC::ExecState&, JSC::ThrowScope&, Exception&&);
</span><del>-WEBCORE_EXPORT void setDOMExceptionSlow(JSC::ExecState*, JSC::ThrowScope&, ExceptionCode);
</del><span class="cx">
</span><span class="cx"> JSC::JSValue jsString(JSC::ExecState*, const URL&); // empty if the URL is null
</span><span class="cx">
</span><span class="lines">@@ -776,13 +774,6 @@
</span><span class="cx"> propagateExceptionSlowPath(state, throwScope, WTFMove(exception));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-ALWAYS_INLINE void setDOMException(JSC::ExecState* exec, JSC::ThrowScope& throwScope, ExceptionCode ec)
-{
- if (LIKELY(!ec || throwScope.exception()))
- return;
- setDOMExceptionSlow(exec, throwScope, ec);
-}
-
</del><span class="cx"> inline void propagateException(JSC::ExecState& state, JSC::ThrowScope& throwScope, ExceptionOr<void>&& value)
</span><span class="cx"> {
</span><span class="cx"> if (UNLIKELY(value.hasException()))
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSFileReaderCustomcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/bindings/js/JSFileReaderCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSFileReaderCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSFileReaderCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -1,52 +0,0 @@
</span><del>-/*
- * Copyright (C) 2010 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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 "config.h"
-
-#include "JSFileReader.h"
-
-#include "FileReader.h"
-#include "JSDOMBinding.h"
-#include <runtime/ArrayBuffer.h>
-#include <runtime/JSArrayBuffer.h>
-
-using namespace JSC;
-
-namespace WebCore {
-
-JSValue JSFileReader::result(ExecState& state) const
-{
- FileReader& imp = wrapped();
- if (imp.readType() == FileReaderLoader::ReadAsArrayBuffer)
- return toJS(&state, globalObject(), imp.arrayBufferResult().get());
- return jsOwnedStringOrNull(&state, imp.stringResult());
-}
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSHTMLOptionsCollectionCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> if (!std::isfinite(number))
</span><span class="cx"> length = 0;
</span><span class="cx"> else if (number < 0)
</span><del>- return setDOMException(&state, throwScope, INDEX_SIZE_ERR);
</del><ins>+ return throwIndexSizeError(state, throwScope);
</ins><span class="cx"> else
</span><span class="cx"> length = static_cast<unsigned>(std::min<double>(number, UINT_MAX));
</span><span class="cx"> propagateException(state, throwScope, wrapped().setLength(length));
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSHTMLSelectElementCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSHTMLSelectElementCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSHTMLSelectElementCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSHTMLSelectElementCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">
</span><span class="cx"> auto* option = JSHTMLOptionElement::toWrapped(value);
</span><span class="cx"> if (!option) {
</span><del>- setDOMException(&state, throwScope, TYPE_MISMATCH_ERR);
</del><ins>+ throwTypeMismatchError(state, throwScope);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSIDBRequestCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSIDBRequestCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSIDBRequestCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSIDBRequestCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -42,7 +42,9 @@
</span><span class="cx"> auto& request = wrapped();
</span><span class="cx">
</span><span class="cx"> if (!request.isDone()) {
</span><del>- propagateException(state, Exception { IDBDatabaseException::InvalidStateError, ASCIILiteral("Failed to read the 'result' property from 'IDBRequest': The request has not finished.") });
</del><ins>+ auto& vm = state.vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ propagateException(state, scope, Exception { IDBDatabaseException::InvalidStateError, ASCIILiteral("Failed to read the 'result' property from 'IDBRequest': The request has not finished.") });
</ins><span class="cx"> return { };
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSStorageCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSStorageCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSStorageCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSStorageCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -41,8 +41,12 @@
</span><span class="cx"> return false;
</span><span class="cx">
</span><span class="cx"> auto item = wrapped().getItem(propertyNameToString(propertyName));
</span><del>- if (item.hasException())
- propagateException(*state, item.releaseException());
</del><ins>+ if (item.hasException()) {
+ auto& vm = state->vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ propagateException(*state, scope, item.releaseException());
+ return false;
+ }
</ins><span class="cx">
</span><span class="cx"> auto string = item.releaseReturnValue();
</span><span class="cx"> if (string.isNull())
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -95,8 +95,8 @@
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, nullptr);
</span><span class="cx">
</span><span class="cx"> auto identifier = CryptoAlgorithmRegistry::singleton().identifier(params.name);
</span><del>- if (!identifier) {
- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ if (UNLIKELY(!identifier)) {
+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx"> break;
</span><span class="cx"> }
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="lines">@@ -133,7 +133,7 @@
</span><span class="cx"> result = std::make_unique<CryptoAlgorithmParameters>(params);
</span><span class="cx"> break;
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="lines">@@ -147,13 +147,13 @@
</span><span class="cx"> result = std::make_unique<CryptoAlgorithmParameters>(params);
</span><span class="cx"> break;
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="cx"> case Operations::DeriveKey:
</span><span class="cx"> case Operations::DeriveBits:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> case Operations::GenerateKey:
</span><span class="cx"> switch (*identifier) {
</span><span class="lines">@@ -193,7 +193,7 @@
</span><span class="cx"> break;
</span><span class="cx"> }
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="lines">@@ -229,7 +229,7 @@
</span><span class="cx"> break;
</span><span class="cx"> }
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="lines">@@ -240,7 +240,7 @@
</span><span class="cx"> result = std::make_unique<CryptoAlgorithmParameters>(params);
</span><span class="cx"> break;
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="lines">@@ -297,14 +297,6 @@
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static RefPtr<CryptoAlgorithm> createAlgorithm(ExecState& state, CryptoAlgorithmIdentifier identifier)
-{
- auto result = CryptoAlgorithmRegistry::singleton().create(identifier);
- if (!result)
- setDOMException(&state, NOT_SUPPORTED_ERR);
- return result;
-}
-
</del><span class="cx"> // Maybe we want more specific error messages?
</span><span class="cx"> static void rejectWithException(Ref<DeferredPromise>&& passedPromise, ExceptionCode ec)
</span><span class="cx"> {
</span><span class="lines">@@ -449,7 +441,7 @@
</span><span class="cx"> return dataVector;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void supportExportKeyThrow(ExecState& state, CryptoAlgorithmIdentifier identifier)
</del><ins>+static void supportExportKeyThrow(ExecState& state, ThrowScope& scope, CryptoAlgorithmIdentifier identifier)
</ins><span class="cx"> {
</span><span class="cx"> switch (identifier) {
</span><span class="cx"> case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5:
</span><span class="lines">@@ -465,7 +457,7 @@
</span><span class="cx"> case CryptoAlgorithmIdentifier::HMAC:
</span><span class="cx"> return;
</span><span class="cx"> default:
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -498,8 +490,11 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, key->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(key->algorithmIdentifier());
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](const Vector<uint8_t>& cipherText) mutable {
</span><span class="cx"> fulfillPromiseWithArrayBuffer(WTFMove(capturedPromise), cipherText.data(), cipherText.size());
</span><span class="lines">@@ -543,8 +538,11 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, key->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(key->algorithmIdentifier());
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](const Vector<uint8_t>& plainText) mutable {
</span><span class="cx"> fulfillPromiseWithArrayBuffer(WTFMove(capturedPromise), plainText.data(), plainText.size());
</span><span class="lines">@@ -588,8 +586,11 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, key->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(key->algorithmIdentifier());
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](const Vector<uint8_t>& signature) mutable {
</span><span class="cx"> fulfillPromiseWithArrayBuffer(WTFMove(capturedPromise), signature.data(), signature.size());
</span><span class="lines">@@ -636,8 +637,11 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, key->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(key->algorithmIdentifier());
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](bool result) mutable {
</span><span class="cx"> capturedPromise->resolve<IDLBoolean>(result);
</span><span class="lines">@@ -668,8 +672,11 @@
</span><span class="cx"> auto data = toVector(state, state.uncheckedArgument(1));
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, params->identifier);
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(params->identifier);
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](const Vector<uint8_t>& digest) mutable {
</span><span class="cx"> fulfillPromiseWithArrayBuffer(WTFMove(capturedPromise), digest.data(), digest.size());
</span><span class="lines">@@ -737,8 +744,11 @@
</span><span class="cx"> auto keyUsages = cryptoKeyUsageBitmapFromJSValue(state, state.uncheckedArgument(2));
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, params->identifier);
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(params->identifier);
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](KeyOrKeyPair&& keyOrKeyPair) mutable {
</span><span class="cx"> WTF::switchOn(keyOrKeyPair,
</span><span class="lines">@@ -793,8 +803,11 @@
</span><span class="cx"> auto keyUsages = cryptoKeyUsageBitmapFromJSValue(state, state.uncheckedArgument(4));
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, params->identifier);
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(params->identifier);
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](CryptoKey& key) mutable {
</span><span class="cx"> if ((key.type() == CryptoKeyType::Private || key.type() == CryptoKeyType::Secret) && !key.usagesBitmap()) {
</span><span class="lines">@@ -829,7 +842,7 @@
</span><span class="cx"> auto key = toCryptoKey(state, state.uncheckedArgument(1));
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx">
</span><del>- supportExportKeyThrow(state, key->algorithmIdentifier());
</del><ins>+ supportExportKeyThrow(state, scope, key->algorithmIdentifier());
</ins><span class="cx"> RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx">
</span><span class="cx"> if (!key->extractable()) {
</span><span class="lines">@@ -837,8 +850,11 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithm(state, key->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto algorithm = CryptoAlgorithmRegistry::singleton().create(key->algorithmIdentifier());
+ if (UNLIKELY(!algorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [capturedPromise = promise.copyRef()](SubtleCrypto::KeyFormat format, KeyData&& key) mutable {
</span><span class="cx"> switch (format) {
</span><span class="lines">@@ -904,7 +920,7 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- supportExportKeyThrow(state, key->algorithmIdentifier());
</del><ins>+ supportExportKeyThrow(state, scope, key->algorithmIdentifier());
</ins><span class="cx"> RETURN_IF_EXCEPTION(scope, void());
</span><span class="cx">
</span><span class="cx"> if (!key->extractable()) {
</span><span class="lines">@@ -912,11 +928,17 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto exportAlgorithm = createAlgorithm(state, key->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto exportAlgorithm = CryptoAlgorithmRegistry::singleton().create(key->algorithmIdentifier());
+ if (UNLIKELY(!exportAlgorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><del>- auto wrapAlgorithm = createAlgorithm(state, wrappingKey->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto wrapAlgorithm = CryptoAlgorithmRegistry::singleton().create(wrappingKey->algorithmIdentifier());
+ if (UNLIKELY(!wrapAlgorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto context = scriptExecutionContextFromExecState(&state);
</span><span class="cx">
</span><span class="lines">@@ -1014,11 +1036,17 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto importAlgorithm = createAlgorithm(state, unwrappedKeyAlgorithm->identifier);
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto importAlgorithm = CryptoAlgorithmRegistry::singleton().create(unwrappedKeyAlgorithm->identifier);
+ if (UNLIKELY(!importAlgorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><del>- auto unwrapAlgorithm = createAlgorithm(state, unwrappingKey->algorithmIdentifier());
- RETURN_IF_EXCEPTION(scope, void());
</del><ins>+ auto unwrapAlgorithm = CryptoAlgorithmRegistry::singleton().create(unwrappingKey->algorithmIdentifier());
+ if (UNLIKELY(!unwrapAlgorithm)) {
+ throwNotSupportedError(state, scope);
+ return;
+ }
</ins><span class="cx">
</span><span class="cx"> auto callback = [promise = promise.copyRef(), format, importAlgorithm, unwrappedKeyAlgorithm = WTFMove(unwrappedKeyAlgorithm), extractable, keyUsages](const Vector<uint8_t>& bytes) mutable {
</span><span class="cx"> ExecState& state = *(promise->globalObject()->globalExec());
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebKitSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -62,62 +62,48 @@
</span><span class="cx"> JWK
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static RefPtr<CryptoAlgorithm> createAlgorithmFromJSValue(ExecState& state, JSValue value)
</del><ins>+static RefPtr<CryptoAlgorithm> createAlgorithmFromJSValue(ExecState& state, ThrowScope& scope, JSValue value)
</ins><span class="cx"> {
</span><del>- VM& vm = state.vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
</del><ins>+ auto algorithmIdentifier = JSCryptoAlgorithmDictionary::parseAlgorithmIdentifier(state, scope, value);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- CryptoAlgorithmIdentifier algorithmIdentifier;
- auto success = JSCryptoAlgorithmDictionary::getAlgorithmIdentifier(state, value, algorithmIdentifier);
- ASSERT_UNUSED(scope, scope.exception() || success);
- if (!success)
- return nullptr;
-
</del><span class="cx"> auto result = CryptoAlgorithmRegistry::singleton().create(algorithmIdentifier);
</span><span class="cx"> if (!result)
</span><del>- setDOMException(&state, scope, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
+
</ins><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static bool cryptoKeyFormatFromJSValue(ExecState& state, JSValue value, CryptoKeyFormat& result)
</del><ins>+static CryptoKeyFormat cryptoKeyFormatFromJSValue(ExecState& state, ThrowScope& scope, JSValue value)
</ins><span class="cx"> {
</span><del>- VM& vm = state.vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
</del><ins>+ auto keyFormatString = value.toWTFString(&state);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- String keyFormatString = value.toWTFString(&state);
- RETURN_IF_EXCEPTION(scope, false);
</del><span class="cx"> if (keyFormatString == "raw")
</span><del>- result = CryptoKeyFormat::Raw;
- else if (keyFormatString == "pkcs8")
- result = CryptoKeyFormat::PKCS8;
- else if (keyFormatString == "spki")
- result = CryptoKeyFormat::SPKI;
- else if (keyFormatString == "jwk")
- result = CryptoKeyFormat::JWK;
- else {
- throwTypeError(&state, scope, ASCIILiteral("Unknown key format"));
- return false;
- }
- return true;
</del><ins>+ return CryptoKeyFormat::Raw;
+ if (keyFormatString == "pkcs8")
+ return CryptoKeyFormat::PKCS8;
+ if (keyFormatString == "spki")
+ return CryptoKeyFormat::SPKI;
+ if (keyFormatString == "jwk")
+ return CryptoKeyFormat::JWK;
+
+ throwTypeError(&state, scope, ASCIILiteral("Unknown key format"));
+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static bool cryptoKeyUsagesFromJSValue(ExecState& state, JSValue value, CryptoKeyUsageBitmap& result)
</del><ins>+static CryptoKeyUsageBitmap cryptoKeyUsagesFromJSValue(ExecState& state, ThrowScope& scope, JSValue value)
</ins><span class="cx"> {
</span><del>- VM& vm = state.vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
-
</del><span class="cx"> if (!isJSArray(value)) {
</span><span class="cx"> throwTypeError(&state, scope);
</span><del>- return false;
</del><ins>+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- result = 0;
-
</del><ins>+ CryptoKeyUsageBitmap result = 0;
</ins><span class="cx"> JSArray* array = asArray(value);
</span><del>- for (size_t i = 0; i < array->length(); ++i) {
- JSValue element = array->getIndex(&state, i);
- String usageString = element.toWTFString(&state);
- RETURN_IF_EXCEPTION(scope, false);
</del><ins>+ for (unsigned i = 0; i < array->length(); ++i) {
+ auto usageString = array->getIndex(&state, i).toWTFString(&state);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> if (usageString == "encrypt")
</span><span class="cx"> result |= CryptoKeyUsageEncrypt;
</span><span class="cx"> else if (usageString == "decrypt")
</span><span class="lines">@@ -135,7 +121,7 @@
</span><span class="cx"> else if (usageString == "unwrapKey")
</span><span class="cx"> result |= CryptoKeyUsageUnwrapKey;
</span><span class="cx"> }
</span><del>- return true;
</del><ins>+ return result;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> JSValue JSWebKitSubtleCrypto::encrypt(ExecState& state)
</span><span class="lines">@@ -146,15 +132,11 @@
</span><span class="cx"> if (state.argumentCount() < 3)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(0));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForEncrypt(state, algorithm->identifier(), state.uncheckedArgument(0));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForEncrypt(state, scope, algorithm->identifier(), state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> key = JSCryptoKey::toWrapped(state.uncheckedArgument(1));
</span><span class="cx"> if (!key)
</span><span class="lines">@@ -162,15 +144,12 @@
</span><span class="cx">
</span><span class="cx"> if (!key->allows(CryptoKeyUsageEncrypt)) {
</span><span class="cx"> wrapped().document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("Key usages do not include 'encrypt'"));
</span><del>- setDOMException(&state, scope, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- CryptoOperationData data;
- auto success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(2), data);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto data = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx"> auto promise = wrapper->promise();
</span><span class="lines">@@ -198,15 +177,11 @@
</span><span class="cx"> if (state.argumentCount() < 3)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(0));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForDecrypt(state, algorithm->identifier(), state.uncheckedArgument(0));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForDecrypt(state, scope, algorithm->identifier(), state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> key = JSCryptoKey::toWrapped(state.uncheckedArgument(1));
</span><span class="cx"> if (!key)
</span><span class="lines">@@ -214,15 +189,12 @@
</span><span class="cx">
</span><span class="cx"> if (!key->allows(CryptoKeyUsageDecrypt)) {
</span><span class="cx"> wrapped().document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("Key usages do not include 'decrypt'"));
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- CryptoOperationData data;
- auto success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(2), data);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto data = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx"> auto promise = wrapper->promise();
</span><span class="lines">@@ -250,15 +222,11 @@
</span><span class="cx"> if (state.argumentCount() < 3)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(0));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForSign(state, algorithm->identifier(), state.uncheckedArgument(0));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForSign(state, scope, algorithm->identifier(), state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> key = JSCryptoKey::toWrapped(state.uncheckedArgument(1));
</span><span class="cx"> if (!key)
</span><span class="lines">@@ -266,15 +234,12 @@
</span><span class="cx">
</span><span class="cx"> if (!key->allows(CryptoKeyUsageSign)) {
</span><span class="cx"> wrapped().document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("Key usages do not include 'sign'"));
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- CryptoOperationData data;
- auto success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(2), data);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto data = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx"> auto promise = wrapper->promise();
</span><span class="lines">@@ -302,15 +267,11 @@
</span><span class="cx"> if (state.argumentCount() < 4)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(0));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForVerify(state, algorithm->identifier(), state.uncheckedArgument(0));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForVerify(state, scope, algorithm->identifier(), state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> key = JSCryptoKey::toWrapped(state.uncheckedArgument(1));
</span><span class="cx"> if (!key)
</span><span class="lines">@@ -318,21 +279,15 @@
</span><span class="cx">
</span><span class="cx"> if (!key->allows(CryptoKeyUsageVerify)) {
</span><span class="cx"> wrapped().document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("Key usages do not include 'verify'"));
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- CryptoOperationData signature;
- auto success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(2), signature);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto signature = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- CryptoOperationData data;
- success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(3), data);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto data = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(3));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx"> auto promise = wrapper->promise();
</span><span class="lines">@@ -360,21 +315,14 @@
</span><span class="cx"> if (state.argumentCount() < 2)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(0));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForDigest(state, algorithm->identifier(), state.uncheckedArgument(0));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForDigest(state, scope, algorithm->identifier(), state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- CryptoOperationData data;
- auto success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(1), data);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto data = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(1));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx"> auto promise = wrapper->promise();
</span><span class="lines">@@ -402,28 +350,19 @@
</span><span class="cx"> if (state.argumentCount() < 1)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(0));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForGenerateKey(state, algorithm->identifier(), state.uncheckedArgument(0));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForGenerateKey(state, scope, algorithm->identifier(), state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- bool extractable = false;
- if (state.argumentCount() >= 2) {
- extractable = state.uncheckedArgument(1).toBoolean(&state);
- RETURN_IF_EXCEPTION(scope, JSValue());
- }
</del><ins>+ bool extractable = state.argument(1).toBoolean(&state);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> CryptoKeyUsageBitmap keyUsages = 0;
</span><span class="cx"> if (state.argumentCount() >= 3) {
</span><del>- auto success = cryptoKeyUsagesFromJSValue(state, state.argument(2), keyUsages);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ keyUsages = cryptoKeyUsagesFromJSValue(state, scope, state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="lines">@@ -514,44 +453,29 @@
</span><span class="cx"> if (state.argumentCount() < 3)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- CryptoKeyFormat keyFormat;
- auto success = cryptoKeyFormatFromJSValue(state, state.argument(0), keyFormat);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto keyFormat = cryptoKeyFormatFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- CryptoOperationData data;
- success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(1), data);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto data = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(1));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoAlgorithm> algorithm;
</span><span class="cx"> RefPtr<CryptoAlgorithmParametersDeprecated> parameters;
</span><span class="cx"> if (!state.uncheckedArgument(2).isNull()) {
</span><del>- algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(2));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- parameters = JSCryptoAlgorithmDictionary::createParametersForImportKey(state, algorithm->identifier(), state.uncheckedArgument(2));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ parameters = JSCryptoAlgorithmDictionary::createParametersForImportKey(state, scope, algorithm->identifier(), state.uncheckedArgument(2));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- bool extractable = false;
- if (state.argumentCount() >= 4) {
- extractable = state.uncheckedArgument(3).toBoolean(&state);
- RETURN_IF_EXCEPTION(scope, JSValue());
- }
</del><ins>+ bool extractable = state.argument(3).toBoolean(&state);
+ RETURN_IF_EXCEPTION(scope, JSValue());
</ins><span class="cx">
</span><span class="cx"> CryptoKeyUsageBitmap keyUsages = 0;
</span><span class="cx"> if (state.argumentCount() >= 5) {
</span><del>- auto success = cryptoKeyUsagesFromJSValue(state, state.argument(4), keyUsages);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ keyUsages = cryptoKeyUsagesFromJSValue(state, scope, state.uncheckedArgument(4));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="lines">@@ -611,11 +535,8 @@
</span><span class="cx"> if (state.argumentCount() < 2)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- CryptoKeyFormat keyFormat;
- auto success = cryptoKeyFormatFromJSValue(state, state.argument(0), keyFormat);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto keyFormat = cryptoKeyFormatFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> key = JSCryptoKey::toWrapped(state.uncheckedArgument(1));
</span><span class="cx"> if (!key)
</span><span class="lines">@@ -644,11 +565,8 @@
</span><span class="cx"> if (state.argumentCount() < 4)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- CryptoKeyFormat keyFormat;
- auto success = cryptoKeyFormatFromJSValue(state, state.argument(0), keyFormat);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto keyFormat = cryptoKeyFormatFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> key = JSCryptoKey::toWrapped(state.uncheckedArgument(1));
</span><span class="cx"> if (!key)
</span><span class="lines">@@ -660,19 +578,15 @@
</span><span class="cx">
</span><span class="cx"> if (!wrappingKey->allows(CryptoKeyUsageWrapKey)) {
</span><span class="cx"> wrapped().document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("Key usages do not include 'wrapKey'"));
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto algorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(3));
- ASSERT(scope.exception() || algorithm);
- if (!algorithm)
- return jsUndefined();
</del><ins>+ auto algorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(3));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- auto parameters = JSCryptoAlgorithmDictionary::createParametersForEncrypt(state, algorithm->identifier(), state.uncheckedArgument(3));
- ASSERT(scope.exception() || parameters);
- if (!parameters)
- return jsUndefined();
</del><ins>+ auto parameters = JSCryptoAlgorithmDictionary::createParametersForEncrypt(state, scope, algorithm->identifier(), state.uncheckedArgument(3));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span><span class="cx"> auto promise = wrapper->promise();
</span><span class="lines">@@ -708,17 +622,11 @@
</span><span class="cx"> if (state.argumentCount() < 5)
</span><span class="cx"> return throwException(&state, scope, createNotEnoughArgumentsError(&state));
</span><span class="cx">
</span><del>- CryptoKeyFormat keyFormat;
- auto success = cryptoKeyFormatFromJSValue(state, state.argument(0), keyFormat);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto keyFormat = cryptoKeyFormatFromJSValue(state, scope, state.uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- CryptoOperationData wrappedKeyData;
- success = cryptoOperationDataFromJSValue(state, state.uncheckedArgument(1), wrappedKeyData);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ auto wrappedKeyData = cryptoOperationDataFromJSValue(state, scope, state.uncheckedArgument(1));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> RefPtr<CryptoKey> unwrappingKey = JSCryptoKey::toWrapped(state.uncheckedArgument(2));
</span><span class="cx"> if (!unwrappingKey)
</span><span class="lines">@@ -726,45 +634,33 @@
</span><span class="cx">
</span><span class="cx"> if (!unwrappingKey->allows(CryptoKeyUsageUnwrapKey)) {
</span><span class="cx"> wrapped().document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("Key usages do not include 'unwrapKey'"));
</span><del>- setDOMException(&state, NOT_SUPPORTED_ERR);
</del><ins>+ throwNotSupportedError(state, scope);
</ins><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto unwrapAlgorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(3));
- ASSERT(scope.exception() || unwrapAlgorithm);
- if (!unwrapAlgorithm)
- return jsUndefined();
- auto unwrapAlgorithmParameters = JSCryptoAlgorithmDictionary::createParametersForDecrypt(state, unwrapAlgorithm->identifier(), state.uncheckedArgument(3));
- ASSERT(scope.exception() || unwrapAlgorithmParameters);
- if (!unwrapAlgorithmParameters)
- return jsUndefined();
</del><ins>+ auto unwrapAlgorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(3));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><ins>+ auto unwrapAlgorithmParameters = JSCryptoAlgorithmDictionary::createParametersForDecrypt(state, scope, unwrapAlgorithm->identifier(), state.uncheckedArgument(3));
+ RETURN_IF_EXCEPTION(scope, { });
+
</ins><span class="cx"> RefPtr<CryptoAlgorithm> unwrappedKeyAlgorithm;
</span><span class="cx"> RefPtr<CryptoAlgorithmParametersDeprecated> unwrappedKeyAlgorithmParameters;
</span><span class="cx"> if (!state.uncheckedArgument(4).isNull()) {
</span><del>- unwrappedKeyAlgorithm = createAlgorithmFromJSValue(state, state.uncheckedArgument(4));
- ASSERT(scope.exception() || unwrappedKeyAlgorithm);
- if (!unwrappedKeyAlgorithm)
- return jsUndefined();
</del><ins>+ unwrappedKeyAlgorithm = createAlgorithmFromJSValue(state, scope, state.uncheckedArgument(4));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><del>- unwrappedKeyAlgorithmParameters = JSCryptoAlgorithmDictionary::createParametersForImportKey(state, unwrappedKeyAlgorithm->identifier(), state.uncheckedArgument(4));
- ASSERT(scope.exception() || unwrappedKeyAlgorithmParameters);
- if (!unwrappedKeyAlgorithmParameters)
- return jsUndefined();
</del><ins>+ unwrappedKeyAlgorithmParameters = JSCryptoAlgorithmDictionary::createParametersForImportKey(state, scope, unwrappedKeyAlgorithm->identifier(), state.uncheckedArgument(4));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- bool extractable = false;
- if (state.argumentCount() >= 6) {
- extractable = state.uncheckedArgument(5).toBoolean(&state);
- RETURN_IF_EXCEPTION(scope, JSValue());
- }
</del><ins>+ bool extractable = state.argument(5).toBoolean(&state);
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx">
</span><span class="cx"> CryptoKeyUsageBitmap keyUsages = 0;
</span><span class="cx"> if (state.argumentCount() >= 7) {
</span><del>- auto success = cryptoKeyUsagesFromJSValue(state, state.argument(6), keyUsages);
- ASSERT(scope.exception() || success);
- if (!success)
- return jsUndefined();
</del><ins>+ keyUsages = cryptoKeyUsagesFromJSValue(state, scope, state.uncheckedArgument(6));
+ RETURN_IF_EXCEPTION(scope, { });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<DeferredPromise> wrapper = createDeferredPromise(state, domWindow());
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSXMLHttpRequestCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -134,7 +134,9 @@
</span><span class="cx">
</span><span class="cx"> // FIXME: Is it correct to do this only after the paragraph code of code just above, or should we exit earlier?
</span><span class="cx"> if (UNLIKELY(result.hasException())) {
</span><del>- propagateException(state, result.releaseException());
</del><ins>+ auto& vm = state.vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ propagateException(state, scope, result.releaseException());
</ins><span class="cx"> return { };
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -146,7 +148,9 @@
</span><span class="cx"> auto result = wrapped().responseText();
</span><span class="cx">
</span><span class="cx"> if (UNLIKELY(result.hasException())) {
</span><del>- propagateException(state, result.releaseException());
</del><ins>+ auto& vm = state.vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ propagateException(state, scope, result.releaseException());
</ins><span class="cx"> return { };
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSXPathNSResolverCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSXPathNSResolverCustom.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSXPathNSResolverCustom.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/JSXPathNSResolverCustom.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include "JSXPathNSResolver.h"
</span><span class="cx">
</span><span class="cx"> #include "JSCustomXPathNSResolver.h"
</span><ins>+#include "JSDOMBinding.h"
</ins><span class="cx">
</span><span class="cx"> using namespace JSC;
</span><span class="cx">
</span><span class="lines">@@ -37,7 +38,14 @@
</span><span class="cx"> if (value.inherits(JSXPathNSResolver::info()))
</span><span class="cx"> return &jsCast<JSXPathNSResolver*>(asObject(value))->wrapped();
</span><span class="cx">
</span><del>- return JSCustomXPathNSResolver::create(&state, value);
</del><ins>+ auto result = JSCustomXPathNSResolver::create(state, value);
+ if (UNLIKELY(result.hasException())) {
+ VM& vm = state.vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ propagateException(state, scope, result.releaseException());
+ return nullptr;
+ }
+ return result.releaseReturnValue();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsSerializedScriptValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -2683,29 +2683,26 @@
</span><span class="cx"> return WTFMove(contents);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void maybeThrowExceptionIfSerializationFailed(ExecState* exec, SerializationReturnCode code)
</del><ins>+static void maybeThrowExceptionIfSerializationFailed(ExecState& state, SerializationReturnCode code)
</ins><span class="cx"> {
</span><del>- auto& vm = exec->vm();
</del><ins>+ auto& vm = state.vm();
</ins><span class="cx"> auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx">
</span><del>- if (code == SerializationReturnCode::SuccessfullyCompleted)
- return;
-
</del><span class="cx"> switch (code) {
</span><ins>+ case SerializationReturnCode::SuccessfullyCompleted:
+ break;
</ins><span class="cx"> case SerializationReturnCode::StackOverflowError:
</span><del>- throwException(exec, scope, createStackOverflowError(exec));
</del><ins>+ throwException(&state, scope, createStackOverflowError(&state));
</ins><span class="cx"> break;
</span><span class="cx"> case SerializationReturnCode::ValidationError:
</span><del>- throwTypeError(exec, scope, ASCIILiteral("Unable to deserialize data."));
</del><ins>+ throwTypeError(&state, scope, ASCIILiteral("Unable to deserialize data."));
</ins><span class="cx"> break;
</span><span class="cx"> case SerializationReturnCode::DataCloneError:
</span><del>- setDOMException(exec, DATA_CLONE_ERR);
</del><ins>+ throwDataCloneError(state, scope);
</ins><span class="cx"> break;
</span><span class="cx"> case SerializationReturnCode::ExistingExceptionError:
</span><span class="cx"> case SerializationReturnCode::UnspecifiedError:
</span><span class="cx"> break;
</span><del>- break;
- case SerializationReturnCode::SuccessfullyCompleted:
</del><span class="cx"> case SerializationReturnCode::InterruptedExecutionError:
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="lines">@@ -2744,7 +2741,7 @@
</span><span class="cx"> auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers, blobURLs, buffer);
</span><span class="cx">
</span><span class="cx"> if (throwExceptions == Throwing)
</span><del>- maybeThrowExceptionIfSerializationFailed(&exec, code);
</del><ins>+ maybeThrowExceptionIfSerializationFailed(exec, code);
</ins><span class="cx">
</span><span class="cx"> if (code != SerializationReturnCode::SuccessfullyCompleted)
</span><span class="cx"> return nullptr;
</span><span class="lines">@@ -2834,7 +2831,7 @@
</span><span class="cx"> {
</span><span class="cx"> DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths);
</span><span class="cx"> if (throwExceptions == Throwing)
</span><del>- maybeThrowExceptionIfSerializationFailed(&exec, result.second);
</del><ins>+ maybeThrowExceptionIfSerializationFailed(exec, result.second);
</ins><span class="cx"> return result.first ? result.first : jsNull();
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsStructuredClonecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/StructuredClone.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/StructuredClone.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/bindings/js/StructuredClone.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -34,57 +34,60 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-EncodedJSValue JSC_HOST_CALL structuredCloneArrayBuffer(ExecState* execState)
</del><ins>+EncodedJSValue JSC_HOST_CALL structuredCloneArrayBuffer(ExecState* state)
</ins><span class="cx"> {
</span><del>- ASSERT(execState);
- ASSERT(execState->argumentCount());
- ASSERT(execState->lexicalGlobalObject());
</del><ins>+ ASSERT(state);
+ ASSERT(state->argumentCount());
+ ASSERT(state->lexicalGlobalObject());
</ins><span class="cx">
</span><del>- ArrayBuffer* buffer = toUnsharedArrayBuffer(execState->uncheckedArgument(0));
</del><ins>+ auto* buffer = toUnsharedArrayBuffer(state->uncheckedArgument(0));
</ins><span class="cx"> if (!buffer) {
</span><del>- setDOMException(execState, DATA_CLONE_ERR);
- return JSValue::encode(jsUndefined());
</del><ins>+ VM& vm = state->vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ throwDataCloneError(*state, scope);
+ return { };
</ins><span class="cx"> }
</span><del>-
- return JSValue::encode(JSArrayBuffer::create(execState->vm(), execState->lexicalGlobalObject()->arrayBufferStructure(ArrayBufferSharingMode::Default), ArrayBuffer::tryCreate(buffer->data(), buffer->byteLength())));
</del><ins>+ return JSValue::encode(JSArrayBuffer::create(state->vm(), state->lexicalGlobalObject()->arrayBufferStructure(ArrayBufferSharingMode::Default), ArrayBuffer::tryCreate(buffer->data(), buffer->byteLength())));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-EncodedJSValue JSC_HOST_CALL structuredCloneArrayBufferView(ExecState* execState)
</del><ins>+EncodedJSValue JSC_HOST_CALL structuredCloneArrayBufferView(ExecState* state)
</ins><span class="cx"> {
</span><del>- ASSERT(execState);
- ASSERT(execState->argumentCount());
</del><ins>+ ASSERT(state);
+ ASSERT(state->argumentCount());
</ins><span class="cx">
</span><del>- JSValue value = execState->uncheckedArgument(0);
</del><ins>+ JSValue value = state->uncheckedArgument(0);
</ins><span class="cx"> auto* bufferView = jsDynamicDowncast<JSArrayBufferView*>(value);
</span><span class="cx"> ASSERT(bufferView);
</span><span class="cx">
</span><span class="cx"> auto* buffer = bufferView->unsharedBuffer();
</span><span class="cx"> if (!buffer) {
</span><del>- setDOMException(execState, DATA_CLONE_ERR);
- return JSValue::encode(jsUndefined());
</del><ins>+ VM& vm = state->vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ throwDataCloneError(*state, scope);
+ return { };
</ins><span class="cx"> }
</span><span class="cx"> auto bufferClone = ArrayBuffer::tryCreate(buffer->data(), buffer->byteLength());
</span><span class="cx">
</span><span class="cx"> if (jsDynamicDowncast<JSInt8Array*>(value))
</span><del>- return JSValue::encode(JSInt8Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSInt8Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSInt16Array*>(value))
</span><del>- return JSValue::encode(JSInt16Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSInt16Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSInt32Array*>(value))
</span><del>- return JSValue::encode(JSInt32Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSInt32Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSUint8Array*>(value))
</span><del>- return JSValue::encode(JSUint8Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSUint8Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSUint8ClampedArray*>(value))
</span><del>- return JSValue::encode(JSUint8ClampedArray::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSUint8ClampedArray::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSUint16Array*>(value))
</span><del>- return JSValue::encode(JSUint16Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSUint16Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSUint32Array*>(value))
</span><del>- return JSValue::encode(JSUint32Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSUint32Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSFloat32Array*>(value))
</span><del>- return JSValue::encode(JSFloat32Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSFloat32Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSFloat64Array*>(value))
</span><del>- return JSValue::encode(JSFloat64Array::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSFloat64Array::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx"> if (jsDynamicDowncast<JSDataView*>(value))
</span><del>- return JSValue::encode(JSDataView::create(execState, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</del><ins>+ return JSValue::encode(JSDataView::create(state, bufferView->structure(), WTFMove(bufferClone), bufferView->byteOffset(), bufferView->length()));
</ins><span class="cx">
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><span class="cx"> return JSValue::encode(jsUndefined());
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoCryptoAlgorithmParametersDeprecatedh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/CryptoAlgorithmParametersDeprecated.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/CryptoAlgorithmParametersDeprecated.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/crypto/CryptoAlgorithmParametersDeprecated.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -25,17 +25,15 @@
</span><span class="cx">
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><del>-#include <wtf/Noncopyable.h>
</del><ins>+#if ENABLE(SUBTLE_CRYPTO)
+
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/TypeCasts.h>
</span><span class="cx">
</span><del>-#if ENABLE(SUBTLE_CRYPTO)
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class CryptoAlgorithmParametersDeprecated : public RefCounted<CryptoAlgorithmParametersDeprecated> {
</span><span class="cx"> public:
</span><del>- CryptoAlgorithmParametersDeprecated() { }
</del><span class="cx"> virtual ~CryptoAlgorithmParametersDeprecated() { }
</span><span class="cx">
</span><span class="cx"> enum class Class {
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoparametersCryptoAlgorithmHmacKeyParamsDeprecatedh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmHmacKeyParamsDeprecated.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmHmacKeyParamsDeprecated.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmHmacKeyParamsDeprecated.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -34,17 +34,12 @@
</span><span class="cx">
</span><span class="cx"> class CryptoAlgorithmHmacKeyParamsDeprecated final : public CryptoAlgorithmParametersDeprecated {
</span><span class="cx"> public:
</span><del>- CryptoAlgorithmHmacKeyParamsDeprecated()
- : hasLength(false)
- {
- }
-
</del><span class="cx"> // The inner hash function to use.
</span><span class="cx"> CryptoAlgorithmIdentifier hash;
</span><span class="cx">
</span><span class="cx"> // The length (in bytes) of the key to generate. If unspecified, the recommended length will be used,
</span><span class="cx"> // which is the size of the associated hash function's block size.
</span><del>- bool hasLength;
</del><ins>+ bool hasLength { false };
</ins><span class="cx"> unsigned length;
</span><span class="cx">
</span><span class="cx"> Class parametersClass() const override { return Class::HmacKeyParams; }
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoparametersCryptoAlgorithmRsaKeyGenParamsDeprecatedh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaKeyGenParamsDeprecated.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaKeyGenParamsDeprecated.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaKeyGenParamsDeprecated.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -34,16 +34,12 @@
</span><span class="cx">
</span><span class="cx"> class CryptoAlgorithmRsaKeyGenParamsDeprecated final : public CryptoAlgorithmParametersDeprecated {
</span><span class="cx"> public:
</span><del>- CryptoAlgorithmRsaKeyGenParamsDeprecated()
- : hasHash(false)
- {
- }
</del><span class="cx"> // The length, in bits, of the RSA modulus.
</span><span class="cx"> unsigned modulusLength;
</span><span class="cx"> // The RSA public exponent, encoded as BigInteger.
</span><span class="cx"> Vector<uint8_t> publicExponent;
</span><span class="cx"> // The hash algorith identifier
</span><del>- bool hasHash;
</del><ins>+ bool hasHash { false };
</ins><span class="cx"> CryptoAlgorithmIdentifier hash;
</span><span class="cx">
</span><span class="cx"> Class parametersClass() const override { return Class::RsaKeyGenParams; }
</span></span></pre></div>
<a id="trunkSourceWebCorecryptoparametersCryptoAlgorithmRsaOaepParamsDeprecatedh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaOaepParamsDeprecated.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaOaepParamsDeprecated.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/crypto/parameters/CryptoAlgorithmRsaOaepParamsDeprecated.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -34,17 +34,12 @@
</span><span class="cx">
</span><span class="cx"> class CryptoAlgorithmRsaOaepParamsDeprecated final : public CryptoAlgorithmParametersDeprecated {
</span><span class="cx"> public:
</span><del>- CryptoAlgorithmRsaOaepParamsDeprecated()
- : hasLabel(false)
- {
- }
-
</del><span class="cx"> // The hash function to apply to the message.
</span><span class="cx"> CryptoAlgorithmIdentifier hash;
</span><span class="cx">
</span><span class="cx"> // The optional label/application data to associate with the message.
</span><span class="cx"> // FIXME: Is there a difference between a missing label and an empty one? Perhaps we don't need the hasLabel member.
</span><del>- bool hasLabel;
</del><ins>+ bool hasLabel { false };
</ins><span class="cx"> Vector<uint8_t> label;
</span><span class="cx">
</span><span class="cx"> Class parametersClass() const override { return Class::RsaOaepParams; }
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReader.cpp (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReader.cpp        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/fileapi/FileReader.cpp        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -228,18 +228,20 @@
</span><span class="cx"> dispatchEvent(ProgressEvent::create(type, true, m_loader ? m_loader->bytesLoaded() : 0, m_loader ? m_loader->totalBytes() : 0));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<ArrayBuffer> FileReader::arrayBufferResult() const
</del><ins>+std::optional<Variant<String, RefPtr<JSC::ArrayBuffer>>> FileReader::result() const
</ins><span class="cx"> {
</span><span class="cx"> if (!m_loader || m_error)
</span><del>- return nullptr;
- return m_loader->arrayBufferResult();
</del><ins>+ return std::nullopt;
+ if (m_readType == FileReaderLoader::ReadAsArrayBuffer) {
+ auto result = m_loader->arrayBufferResult();
+ if (!result)
+ return std::nullopt;
+ return { result };
+ }
+ String result = m_loader->stringResult();
+ if (result.isNull())
+ return std::nullopt;
+ return { WTFMove(result) };
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-String FileReader::stringResult()
-{
- if (!m_loader || m_error)
- return String();
- return m_loader->stringResult();
-}
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReader.h (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReader.h        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/fileapi/FileReader.h        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -45,7 +45,6 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class Blob;
</span><del>-class ScriptExecutionContext;
</del><span class="cx">
</span><span class="cx"> class FileReader final : public RefCounted<FileReader>, public ActiveDOMObject, public EventTargetWithInlineData, private FileReaderLoaderClient {
</span><span class="cx"> public:
</span><span class="lines">@@ -70,8 +69,7 @@
</span><span class="cx"> ReadyState readyState() const { return m_state; }
</span><span class="cx"> RefPtr<FileError> error() { return m_error; }
</span><span class="cx"> FileReaderLoader::ReadType readType() const { return m_readType; }
</span><del>- RefPtr<JSC::ArrayBuffer> arrayBufferResult() const;
- String stringResult();
</del><ins>+ std::optional<Variant<String, RefPtr<JSC::ArrayBuffer>>> result() const;
</ins><span class="cx">
</span><span class="cx"> using RefCounted::ref;
</span><span class="cx"> using RefCounted::deref;
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReader.idl (210216 => 210217)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReader.idl        2016-12-31 09:51:29 UTC (rev 210216)
+++ trunk/Source/WebCore/fileapi/FileReader.idl        2016-12-31 09:57:11 UTC (rev 210217)
</span><span class="lines">@@ -50,8 +50,7 @@
</span><span class="cx">
</span><span class="cx"> void abort();
</span><span class="cx">
</span><del>- // file data
- [Custom] readonly attribute any result;
</del><ins>+ readonly attribute (DOMString or ArrayBuffer)? result;
</ins><span class="cx">
</span><span class="cx"> readonly attribute FileError error;
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>