<!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>[191543] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/191543">191543</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2015-10-24 22:37:09 -0700 (Sat, 24 Oct 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Expose more information about the exception in WKErrorJavaScriptExceptionOccurred errors
https://bugs.webkit.org/show_bug.cgi?id=150525
Reviewed by Darin Adler.
Adjusted API test to cover this: WKWebView.EvaluateJavaScriptErrorCases.
* bindings/js/JSDOMBinding.cpp:
(WebCore::reportException):
* bindings/js/JSDOMBinding.h:
Fill in the given struct with computed exception data if it was given.
* bindings/js/ScriptController.cpp:
(WebCore::ScriptController::evaluateInWorld):
(WebCore::ScriptController::evaluate):
(WebCore::ScriptController::executeScript):
* bindings/js/ScriptController.h:
Plumb aforementioned struct through ScriptController.
* Scripts/webkit/messages.py:
(headers_for_type):
* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder<ExceptionDetails>::encode):
(IPC::ArgumentCoder<ExceptionDetails>::decode):
* Shared/WebCoreArgumentCoders.h:
Learn how to en/decode ExceptionDetails.
* UIProcess/API/C/WKPage.cpp:
(WKPageRunJavaScriptInMainFrame):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::runJavaScriptInMainFrame):
(WebKit::WebPageProxy::scriptValueCallback):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::runJavaScriptInMainFrame):
Plumb ExceptionDetails back through runJavaScriptInMainFrame, across the
process boundary.
* UIProcess/API/Cocoa/WKError.mm:
(localizedDescriptionForErrorCode):
* UIProcess/API/Cocoa/WKErrorInternal.h:
* UIProcess/API/Cocoa/WKErrorPrivate.h:
Expose localizedDescriptionForErrorCode so that WKWebView can do special
things with its error.
Add new private userInfo keys for exception info.
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView evaluateJavaScript:completionHandler:]):
Fill in the NSError userInfo with the exception info.
* TestWebKitAPI/Tests/WebKit2Cocoa/WKWebViewEvaluateJavaScript.mm:
(TEST):
Test the various new keys.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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="#trunkSourceWebCorebindingsjsScriptControllercpp">trunk/Source/WebCore/bindings/js/ScriptController.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsScriptControllerh">trunk/Source/WebCore/bindings/js/ScriptController.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2Scriptswebkitmessagespy">trunk/Source/WebKit2/Scripts/webkit/messages.py</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCoderscpp">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCodersh">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPagecpp">trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKErrormm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKError.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKErrorInternalh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorInternal.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKErrorPrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxymessagesin">trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2CocoaWKWebViewEvaluateJavaScriptmm">trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKWebViewEvaluateJavaScript.mm</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebCore/ChangeLog        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2015-10-24 Tim Horton <timothy_horton@apple.com>
+
+ Expose more information about the exception in WKErrorJavaScriptExceptionOccurred errors
+ https://bugs.webkit.org/show_bug.cgi?id=150525
+
+ Reviewed by Darin Adler.
+
+ Adjusted API test to cover this: WKWebView.EvaluateJavaScriptErrorCases.
+
+ * bindings/js/JSDOMBinding.cpp:
+ (WebCore::reportException):
+ * bindings/js/JSDOMBinding.h:
+ Fill in the given struct with computed exception data if it was given.
+
+ * bindings/js/ScriptController.cpp:
+ (WebCore::ScriptController::evaluateInWorld):
+ (WebCore::ScriptController::evaluate):
+ (WebCore::ScriptController::executeScript):
+ * bindings/js/ScriptController.h:
+ Plumb aforementioned struct through ScriptController.
+
</ins><span class="cx"> 2015-10-24 Gwang Yoon Hwang <yoon@igalia.com>
</span><span class="cx">
</span><span class="cx"> [TexMap] Clean up BitmapTexture and BitmapTextureGL.
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -159,7 +159,7 @@
</span><span class="cx"> reportException(exec, exception, cachedScript);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void reportException(ExecState* exec, Exception* exception, CachedScript* cachedScript)
</del><ins>+void reportException(ExecState* exec, Exception* exception, CachedScript* cachedScript, ExceptionDetails* exceptionDetails)
</ins><span class="cx"> {
</span><span class="cx"> RELEASE_ASSERT(exec->vm().currentThreadIsHoldingAPILock());
</span><span class="cx"> if (isTerminatedExecutionException(exception))
</span><span class="lines">@@ -202,6 +202,13 @@
</span><span class="cx">
</span><span class="cx"> ScriptExecutionContext* scriptExecutionContext = globalObject->scriptExecutionContext();
</span><span class="cx"> scriptExecutionContext->reportException(errorMessage, lineNumber, columnNumber, exceptionSourceURL, callStack->size() ? callStack : 0, cachedScript);
</span><ins>+
+ if (exceptionDetails) {
+ exceptionDetails->message = errorMessage;
+ exceptionDetails->lineNumber = lineNumber;
+ exceptionDetails->columnNumber = columnNumber;
+ exceptionDetails->sourceURL = exceptionSourceURL;
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void reportCurrentException(ExecState* exec)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -67,6 +67,13 @@
</span><span class="cx">
</span><span class="cx"> typedef int ExceptionCode;
</span><span class="cx">
</span><ins>+struct ExceptionDetails {
+ String message;
+ int lineNumber { 0 };
+ int columnNumber { 0 };
+ String sourceURL;
+};
+
</ins><span class="cx"> DOMWindow& activeDOMWindow(JSC::ExecState*);
</span><span class="cx"> DOMWindow& firstDOMWindow(JSC::ExecState*);
</span><span class="cx">
</span><span class="lines">@@ -272,7 +279,7 @@
</span><span class="cx"> const JSC::HashTable& getHashTableForGlobalData(JSC::VM&, const JSC::HashTable& staticTable);
</span><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void reportException(JSC::ExecState*, JSC::JSValue exception, CachedScript* = nullptr);
</span><del>-WEBCORE_EXPORT void reportException(JSC::ExecState*, JSC::Exception*, CachedScript* = nullptr);
</del><ins>+WEBCORE_EXPORT void reportException(JSC::ExecState*, JSC::Exception*, CachedScript* = nullptr, ExceptionDetails* = nullptr);
</ins><span class="cx"> void reportCurrentException(JSC::ExecState*);
</span><span class="cx">
</span><span class="cx"> JSC::JSValue createDOMException(JSC::ExecState*, ExceptionCode);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsScriptControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/ScriptController.cpp (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/ScriptController.cpp        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebCore/bindings/js/ScriptController.cpp        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -137,7 +137,7 @@
</span><span class="cx"> return windowShell.get();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Deprecated::ScriptValue ScriptController::evaluateInWorld(const ScriptSourceCode& sourceCode, DOMWrapperWorld& world)
</del><ins>+Deprecated::ScriptValue ScriptController::evaluateInWorld(const ScriptSourceCode& sourceCode, DOMWrapperWorld& world, ExceptionDetails* exceptionDetails)
</ins><span class="cx"> {
</span><span class="cx"> JSLockHolder lock(world.vm());
</span><span class="cx">
</span><span class="lines">@@ -166,7 +166,7 @@
</span><span class="cx"> InspectorInstrumentation::didEvaluateScript(cookie, m_frame);
</span><span class="cx">
</span><span class="cx"> if (evaluationException) {
</span><del>- reportException(exec, evaluationException, sourceCode.cachedScript());
</del><ins>+ reportException(exec, evaluationException, sourceCode.cachedScript(), exceptionDetails);
</ins><span class="cx"> m_sourceURL = savedSourceURL;
</span><span class="cx"> return Deprecated::ScriptValue();
</span><span class="cx"> }
</span><span class="lines">@@ -175,9 +175,9 @@
</span><span class="cx"> return Deprecated::ScriptValue(exec->vm(), returnValue);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Deprecated::ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode)
</del><ins>+Deprecated::ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode, ExceptionDetails* exceptionDetails)
</ins><span class="cx"> {
</span><del>- return evaluateInWorld(sourceCode, mainThreadNormalWorld());
</del><ins>+ return evaluateInWorld(sourceCode, mainThreadNormalWorld(), exceptionDetails);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Ref<DOMWrapperWorld> ScriptController::createWorld()
</span><span class="lines">@@ -545,20 +545,20 @@
</span><span class="cx"> return m_frame.loader().client().allowScript(m_frame.settings().isScriptEnabled());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Deprecated::ScriptValue ScriptController::executeScript(const String& script, bool forceUserGesture)
</del><ins>+Deprecated::ScriptValue ScriptController::executeScript(const String& script, bool forceUserGesture, ExceptionDetails* exceptionDetails)
</ins><span class="cx"> {
</span><span class="cx"> UserGestureIndicator gestureIndicator(forceUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
</span><del>- return executeScript(ScriptSourceCode(script, m_frame.document()->url()));
</del><ins>+ return executeScript(ScriptSourceCode(script, m_frame.document()->url()), exceptionDetails);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-Deprecated::ScriptValue ScriptController::executeScript(const ScriptSourceCode& sourceCode)
</del><ins>+Deprecated::ScriptValue ScriptController::executeScript(const ScriptSourceCode& sourceCode, ExceptionDetails* exceptionDetails)
</ins><span class="cx"> {
</span><span class="cx"> if (!canExecuteScripts(AboutToExecuteScript) || isPaused())
</span><span class="cx"> return Deprecated::ScriptValue();
</span><span class="cx">
</span><span class="cx"> Ref<Frame> protect(m_frame); // Script execution can destroy the frame, and thus the ScriptController.
</span><span class="cx">
</span><del>- return evaluate(sourceCode);
</del><ins>+ return evaluate(sourceCode, exceptionDetails);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool ScriptController::executeIfJavaScriptURL(const URL& url, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsScriptControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/ScriptController.h (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/ScriptController.h        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebCore/bindings/js/ScriptController.h        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -43,14 +43,14 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><del>- class JSGlobalObject;
- class ExecState;
</del><ins>+class JSGlobalObject;
+class ExecState;
</ins><span class="cx">
</span><del>- namespace Bindings {
- class Instance;
- class RootObject;
- }
</del><ins>+namespace Bindings {
+class Instance;
+class RootObject;
</ins><span class="cx"> }
</span><ins>+}
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -101,8 +101,8 @@
</span><span class="cx">
</span><span class="cx"> static void getAllWorlds(Vector<Ref<DOMWrapperWorld>>&);
</span><span class="cx">
</span><del>- Deprecated::ScriptValue executeScript(const ScriptSourceCode&);
- WEBCORE_EXPORT Deprecated::ScriptValue executeScript(const String& script, bool forceUserGesture = false);
</del><ins>+ Deprecated::ScriptValue executeScript(const ScriptSourceCode&, ExceptionDetails* = nullptr);
+ WEBCORE_EXPORT Deprecated::ScriptValue executeScript(const String& script, bool forceUserGesture = false, ExceptionDetails* = nullptr);
</ins><span class="cx"> WEBCORE_EXPORT Deprecated::ScriptValue executeScriptInWorld(DOMWrapperWorld&, const String& script, bool forceUserGesture = false);
</span><span class="cx">
</span><span class="cx"> // Returns true if argument is a JavaScript URL.
</span><span class="lines">@@ -112,8 +112,8 @@
</span><span class="cx"> // Darwin is an exception to this rule: it is OK to call this function from any thread, even reentrantly.
</span><span class="cx"> static void initializeThreading();
</span><span class="cx">
</span><del>- Deprecated::ScriptValue evaluate(const ScriptSourceCode&);
- Deprecated::ScriptValue evaluateInWorld(const ScriptSourceCode&, DOMWrapperWorld&);
</del><ins>+ Deprecated::ScriptValue evaluate(const ScriptSourceCode&, ExceptionDetails* = nullptr);
+ Deprecated::ScriptValue evaluateInWorld(const ScriptSourceCode&, DOMWrapperWorld&, ExceptionDetails* = nullptr);
</ins><span class="cx">
</span><span class="cx"> WTF::TextPosition eventHandlerPosition() const;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/ChangeLog        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2015-10-24 Tim Horton <timothy_horton@apple.com>
+
+ Expose more information about the exception in WKErrorJavaScriptExceptionOccurred errors
+ https://bugs.webkit.org/show_bug.cgi?id=150525
+
+ Reviewed by Darin Adler.
+
+ * Scripts/webkit/messages.py:
+ (headers_for_type):
+ * Shared/WebCoreArgumentCoders.cpp:
+ (IPC::ArgumentCoder<ExceptionDetails>::encode):
+ (IPC::ArgumentCoder<ExceptionDetails>::decode):
+ * Shared/WebCoreArgumentCoders.h:
+ Learn how to en/decode ExceptionDetails.
+
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageRunJavaScriptInMainFrame):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::runJavaScriptInMainFrame):
+ (WebKit::WebPageProxy::scriptValueCallback):
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.messages.in:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::runJavaScriptInMainFrame):
+ Plumb ExceptionDetails back through runJavaScriptInMainFrame, across the
+ process boundary.
+
+ * UIProcess/API/Cocoa/WKError.mm:
+ (localizedDescriptionForErrorCode):
+ * UIProcess/API/Cocoa/WKErrorInternal.h:
+ * UIProcess/API/Cocoa/WKErrorPrivate.h:
+ Expose localizedDescriptionForErrorCode so that WKWebView can do special
+ things with its error.
+ Add new private userInfo keys for exception info.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView evaluateJavaScript:completionHandler:]):
+ Fill in the NSError userInfo with the exception info.
+
</ins><span class="cx"> 2015-10-24 Gyuyoung Kim <gyuyoung.kim@webkit.org>
</span><span class="cx">
</span><span class="cx"> [EFL] Fix a wrong enum variable use
</span></span></pre></div>
<a id="trunkSourceWebKit2Scriptswebkitmessagespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Scripts/webkit/messages.py (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Scripts/webkit/messages.py        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/Scripts/webkit/messages.py        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -352,6 +352,7 @@
</span><span class="cx"> special_cases = {
</span><span class="cx"> 'String': ['<wtf/text/WTFString.h>'],
</span><span class="cx"> 'WebCore::CompositionUnderline': ['<WebCore/Editor.h>'],
</span><ins>+ 'WebCore::ExceptionDetails': ['<WebCore/JSDOMBinding.h>'],
</ins><span class="cx"> 'WebCore::GrammarDetail': ['<WebCore/TextCheckerClient.h>'],
</span><span class="cx"> 'WebCore::TextureMapperAnimations': ['<WebCore/TextureMapperAnimation.h>'],
</span><span class="cx"> 'WebCore::KeyframeValueList': ['<WebCore/GraphicsLayer.h>'],
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCoderscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> #include <WebCore/GraphicsLayer.h>
</span><span class="cx"> #include <WebCore/IDBGetResult.h>
</span><span class="cx"> #include <WebCore/Image.h>
</span><ins>+#include <WebCore/JSDOMBinding.h>
</ins><span class="cx"> #include <WebCore/Length.h>
</span><span class="cx"> #include <WebCore/Path.h>
</span><span class="cx"> #include <WebCore/PluginData.h>
</span><span class="lines">@@ -2037,4 +2038,29 @@
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void ArgumentCoder<ExceptionDetails>::encode(IPC::ArgumentEncoder& encoder, const ExceptionDetails& info)
+{
+ encoder << info.message;
+ encoder << info.lineNumber;
+ encoder << info.columnNumber;
+ encoder << info.sourceURL;
+}
+
+bool ArgumentCoder<ExceptionDetails>::decode(IPC::ArgumentDecoder& decoder, ExceptionDetails& result)
+{
+ if (!decoder.decode(result.message))
+ return false;
+
+ if (!decoder.decode(result.lineNumber))
+ return false;
+
+ if (!decoder.decode(result.columnNumber))
+ return false;
+
+ if (!decoder.decode(result.sourceURL))
+ return false;
+
+ return true;
+}
+
</ins><span class="cx"> } // namespace IPC
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCodersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -71,6 +71,7 @@
</span><span class="cx"> struct Cookie;
</span><span class="cx"> struct DictationAlternative;
</span><span class="cx"> struct DictionaryPopupInfo;
</span><ins>+struct ExceptionDetails;
</ins><span class="cx"> struct FileChooserSettings;
</span><span class="cx"> struct Length;
</span><span class="cx"> struct GrammarDetail;
</span><span class="lines">@@ -457,6 +458,11 @@
</span><span class="cx"> static bool decode(ArgumentDecoder&, WebCore::RecentSearch&);
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+template<> struct ArgumentCoder<WebCore::ExceptionDetails> {
+ static void encode(ArgumentEncoder&, const WebCore::ExceptionDetails&);
+ static bool decode(ArgumentDecoder&, WebCore::ExceptionDetails&);
+};
+
</ins><span class="cx"> } // namespace IPC
</span><span class="cx">
</span><span class="cx"> #endif // WebCoreArgumentCoders_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -2183,7 +2183,7 @@
</span><span class="cx">
</span><span class="cx"> void WKPageRunJavaScriptInMainFrame(WKPageRef pageRef, WKStringRef scriptRef, void* context, WKPageRunJavaScriptFunction callback)
</span><span class="cx"> {
</span><del>- toImpl(pageRef)->runJavaScriptInMainFrame(toImpl(scriptRef)->string(), [context, callback](API::SerializedScriptValue* returnValue, bool, CallbackBase::Error error) {
</del><ins>+ toImpl(pageRef)->runJavaScriptInMainFrame(toImpl(scriptRef)->string(), [context, callback](API::SerializedScriptValue* returnValue, bool, const WebCore::ExceptionDetails&, CallbackBase::Error error) {
</ins><span class="cx"> callback(toAPI(returnValue), (error != CallbackBase::Error::None) ? toAPI(API::Error::create().ptr()) : 0, context);
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKErrormm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKError.mm (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKError.mm        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKError.mm        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -35,7 +35,12 @@
</span><span class="cx"> NSString * const WKErrorDomain = @"WKErrorDomain";
</span><span class="cx"> NSString * const _WKLegacyErrorDomain = @"WebKitErrorDomain";
</span><span class="cx">
</span><del>-static NSString *localizedDescriptionForErrorCode(WKErrorCode errorCode)
</del><ins>+NSString * const _WKJavaScriptExceptionMessageErrorKey = @"WKJavaScriptExceptionMessage";
+NSString * const _WKJavaScriptExceptionLineNumberErrorKey = @"WKJavaScriptExceptionLineNumber";
+NSString * const _WKJavaScriptExceptionColumnNumberErrorKey = @"WKJavaScriptExceptionColumnNumber";
+NSString * const _WKJavaScriptExceptionSourceURLErrorKey = @"WKJavaScriptExceptionSourceURL";
+
+NSString *localizedDescriptionForErrorCode(WKErrorCode errorCode)
</ins><span class="cx"> {
</span><span class="cx"> switch (errorCode) {
</span><span class="cx"> case WKErrorUnknown:
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKErrorInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorInternal.h (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorInternal.h        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorInternal.h        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -31,5 +31,6 @@
</span><span class="cx"> #import "GenericCallback.h"
</span><span class="cx">
</span><span class="cx"> RetainPtr<NSError> createNSError(WKErrorCode);
</span><ins>+NSString *localizedDescriptionForErrorCode(WKErrorCode);
</ins><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKErrorPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorPrivate.h (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorPrivate.h        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKErrorPrivate.h        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -34,4 +34,20 @@
</span><span class="cx"> _WKLegacyErrorPlugInWillHandleLoad = 204,
</span><span class="cx"> } WK_ENUM_AVAILABLE(10_11, 8_3);
</span><span class="cx">
</span><ins>+/*! @constant _WKJavaScriptExceptionMessageErrorKey Key in userInfo representing
+ the exception message (as an NSString) for WKErrorJavaScriptExceptionOccurred errors. */
+WK_EXTERN NSString * const _WKJavaScriptExceptionMessageErrorKey WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
+/*! @constant _WKJavaScriptExceptionLineNumberErrorKey Key in userInfo representing
+ the exception line number (as an NSNumber) for WKErrorJavaScriptExceptionOccurred errors. */
+WK_EXTERN NSString * const _WKJavaScriptExceptionLineNumberErrorKey WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
+/*! @constant _WKJavaScriptExceptionColumnNumberErrorKey Key in userInfo representing
+ the exception column number (as an NSNumber) for WKErrorJavaScriptExceptionOccurred errors. */
+WK_EXTERN NSString * const _WKJavaScriptExceptionColumnNumberErrorKey WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
+/*! @constant _WKJavaScriptExceptionSourceURLErrorKey Key in userInfo representing
+ the exception source URL (as an NSURL) for WKErrorJavaScriptExceptionOccurred errors. */
+WK_EXTERN NSString * const _WKJavaScriptExceptionSourceURLErrorKey WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -80,6 +80,7 @@
</span><span class="cx"> #import "_WKSessionStateInternal.h"
</span><span class="cx"> #import "_WKVisitedLinkStoreInternal.h"
</span><span class="cx"> #import <WebCore/IOSurface.h>
</span><ins>+#import <WebCore/JSDOMBinding.h>
</ins><span class="cx"> #import <wtf/HashMap.h>
</span><span class="cx"> #import <wtf/MathExtras.h>
</span><span class="cx"> #import <wtf/NeverDestroyed.h>
</span><span class="lines">@@ -612,7 +613,7 @@
</span><span class="cx"> {
</span><span class="cx"> auto handler = adoptNS([completionHandler copy]);
</span><span class="cx">
</span><del>- _page->runJavaScriptInMainFrame(javaScriptString, [handler](API::SerializedScriptValue* serializedScriptValue, bool hadException, WebKit::ScriptValueCallback::Error errorCode) {
</del><ins>+ _page->runJavaScriptInMainFrame(javaScriptString, [handler](API::SerializedScriptValue* serializedScriptValue, bool hadException, const WebCore::ExceptionDetails& details, WebKit::ScriptValueCallback::Error errorCode) {
</ins><span class="cx"> if (!handler)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -637,7 +638,18 @@
</span><span class="cx"> auto rawHandler = (void (^)(id, NSError *))handler.get();
</span><span class="cx"> if (hadException) {
</span><span class="cx"> ASSERT(!serializedScriptValue);
</span><del>- rawHandler(nil, createNSError(WKErrorJavaScriptExceptionOccurred).get());
</del><ins>+
+ RetainPtr<NSMutableDictionary> userInfo = adoptNS([[NSMutableDictionary alloc] init]);
+
+ [userInfo setObject:localizedDescriptionForErrorCode(WKErrorJavaScriptExceptionOccurred) forKey:NSLocalizedDescriptionKey];
+ [userInfo setObject:static_cast<NSString *>(details.message) forKey:_WKJavaScriptExceptionMessageErrorKey];
+ [userInfo setObject:@(details.lineNumber) forKey:_WKJavaScriptExceptionLineNumberErrorKey];
+ [userInfo setObject:@(details.columnNumber) forKey:_WKJavaScriptExceptionColumnNumberErrorKey];
+
+ if (!details.sourceURL.isEmpty())
+ [userInfo setObject:[NSURL _web_URLWithWTFString:details.sourceURL] forKey:_WKJavaScriptExceptionSourceURLErrorKey];
+
+ rawHandler(nil, adoptNS([[NSError alloc] initWithDomain:WKErrorDomain code:WKErrorJavaScriptExceptionOccurred userInfo:userInfo.get()]).get());
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -110,6 +110,7 @@
</span><span class="cx"> #include <WebCore/DragData.h>
</span><span class="cx"> #include <WebCore/FloatRect.h>
</span><span class="cx"> #include <WebCore/FocusDirection.h>
</span><ins>+#include <WebCore/JSDOMBinding.h>
</ins><span class="cx"> #include <WebCore/MIMETypeRegistry.h>
</span><span class="cx"> #include <WebCore/RenderEmbeddedObject.h>
</span><span class="cx"> #include <WebCore/SerializedCryptoKeyWrap.h>
</span><span class="lines">@@ -2587,10 +2588,10 @@
</span><span class="cx"> m_process->send(Messages::WebPage::CountStringMatches(string, options, maxMatchCount), m_pageID);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPageProxy::runJavaScriptInMainFrame(const String& script, std::function<void (API::SerializedScriptValue*, bool hadException, CallbackBase::Error)> callbackFunction)
</del><ins>+void WebPageProxy::runJavaScriptInMainFrame(const String& script, std::function<void (API::SerializedScriptValue*, bool hadException, const ExceptionDetails&, CallbackBase::Error)> callbackFunction)
</ins><span class="cx"> {
</span><span class="cx"> if (!isValid()) {
</span><del>- callbackFunction(nullptr, false, CallbackBase::Error::Unknown);
</del><ins>+ callbackFunction(nullptr, false, { }, CallbackBase::Error::Unknown);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -4681,7 +4682,7 @@
</span><span class="cx"> callback->performCallbackWithReturnValue(resultString.impl());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPageProxy::scriptValueCallback(const IPC::DataReference& dataReference, bool hadException, uint64_t callbackID)
</del><ins>+void WebPageProxy::scriptValueCallback(const IPC::DataReference& dataReference, bool hadException, const ExceptionDetails& details, uint64_t callbackID)
</ins><span class="cx"> {
</span><span class="cx"> auto callback = m_callbacks.take<ScriptValueCallback>(callbackID);
</span><span class="cx"> if (!callback) {
</span><span class="lines">@@ -4693,7 +4694,7 @@
</span><span class="cx"> data.reserveInitialCapacity(dataReference.size());
</span><span class="cx"> data.append(dataReference.data(), dataReference.size());
</span><span class="cx">
</span><del>- callback->performCallbackWithReturnValue(data.size() ? API::SerializedScriptValue::adopt(data).ptr() : nullptr, hadException);
</del><ins>+ callback->performCallbackWithReturnValue(data.size() ? API::SerializedScriptValue::adopt(data).ptr() : nullptr, hadException, details);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPageProxy::computedPagesCallback(const Vector<IntRect>& pageRects, double totalScaleFactorForPrinting, uint64_t callbackID)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -157,6 +157,7 @@
</span><span class="cx"> class SharedBuffer;
</span><span class="cx"> class TextIndicator;
</span><span class="cx"> struct DictionaryPopupInfo;
</span><ins>+struct ExceptionDetails;
</ins><span class="cx"> struct FileChooserSettings;
</span><span class="cx"> struct SecurityOriginData;
</span><span class="cx"> struct TextAlternativeWithRange;
</span><span class="lines">@@ -222,7 +223,7 @@
</span><span class="cx"> typedef GenericCallback<uint64_t> UnsignedCallback;
</span><span class="cx"> typedef GenericCallback<EditingRange> EditingRangeCallback;
</span><span class="cx"> typedef GenericCallback<const String&> StringCallback;
</span><del>-typedef GenericCallback<API::SerializedScriptValue*, bool> ScriptValueCallback;
</del><ins>+typedef GenericCallback<API::SerializedScriptValue*, bool, const WebCore::ExceptionDetails&> ScriptValueCallback;
</ins><span class="cx">
</span><span class="cx"> #if PLATFORM(GTK)
</span><span class="cx"> typedef GenericCallback<API::Error*> PrintFinishedCallback;
</span><span class="lines">@@ -762,7 +763,7 @@
</span><span class="cx"> void getSelectionAsWebArchiveData(std::function<void (API::Data*, CallbackBase::Error)>);
</span><span class="cx"> void getSourceForFrame(WebFrameProxy*, std::function<void (const String&, CallbackBase::Error)>);
</span><span class="cx"> void getWebArchiveOfFrame(WebFrameProxy*, std::function<void (API::Data*, CallbackBase::Error)>);
</span><del>- void runJavaScriptInMainFrame(const String&, std::function<void (API::SerializedScriptValue*, bool hadException, CallbackBase::Error)> callbackFunction);
</del><ins>+ void runJavaScriptInMainFrame(const String&, std::function<void (API::SerializedScriptValue*, bool hadException, const WebCore::ExceptionDetails&, CallbackBase::Error)> callbackFunction);
</ins><span class="cx"> void forceRepaint(PassRefPtr<VoidCallback>);
</span><span class="cx">
</span><span class="cx"> float headerHeight(WebFrameProxy*);
</span><span class="lines">@@ -1323,7 +1324,7 @@
</span><span class="cx"> void dataCallback(const IPC::DataReference&, uint64_t);
</span><span class="cx"> void imageCallback(const ShareableBitmap::Handle&, uint64_t);
</span><span class="cx"> void stringCallback(const String&, uint64_t);
</span><del>- void scriptValueCallback(const IPC::DataReference&, bool hadException, uint64_t);
</del><ins>+ void scriptValueCallback(const IPC::DataReference&, bool hadException, const WebCore::ExceptionDetails&, uint64_t);
</ins><span class="cx"> void computedPagesCallback(const Vector<WebCore::IntRect>&, double totalScaleFactorForPrinting, uint64_t);
</span><span class="cx"> void validateCommandCallback(const String&, bool, int, uint64_t);
</span><span class="cx"> void unsignedCallback(uint64_t, uint64_t);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -159,7 +159,7 @@
</span><span class="cx"> DataCallback(IPC::DataReference resultData, uint64_t callbackID)
</span><span class="cx"> ImageCallback(WebKit::ShareableBitmap::Handle bitmapHandle, uint64_t callbackID)
</span><span class="cx"> StringCallback(String resultString, uint64_t callbackID)
</span><del>- ScriptValueCallback(IPC::DataReference resultData, bool hadException, uint64_t callbackID)
</del><ins>+ ScriptValueCallback(IPC::DataReference resultData, bool hadException, struct WebCore::ExceptionDetails details, uint64_t callbackID)
</ins><span class="cx"> ComputedPagesCallback(Vector<WebCore::IntRect> pageRects, double totalScaleFactorForPrinting, uint64_t callbackID)
</span><span class="cx"> ValidateCommandCallback(String command, bool isEnabled, int32_t state, uint64_t callbackID)
</span><span class="cx"> EditingRangeCallback(struct WebKit::EditingRange range, uint64_t callbackID)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -2505,7 +2505,8 @@
</span><span class="cx"> RefPtr<SerializedScriptValue> serializedResultValue;
</span><span class="cx"> JSLockHolder lock(JSDOMWindow::commonVM());
</span><span class="cx"> bool hadException = true;
</span><del>- if (JSValue resultValue = m_mainFrame->coreFrame()->script().executeScript(script, true).jsValue()) {
</del><ins>+ ExceptionDetails details;
+ if (JSValue resultValue = m_mainFrame->coreFrame()->script().executeScript(script, true, &details).jsValue()) {
</ins><span class="cx"> hadException = false;
</span><span class="cx"> serializedResultValue = SerializedScriptValue::create(m_mainFrame->jsContext(),
</span><span class="cx"> toRef(m_mainFrame->coreFrame()->script().globalObject(mainThreadNormalWorld())->globalExec(), resultValue), nullptr);
</span><span class="lines">@@ -2514,7 +2515,7 @@
</span><span class="cx"> IPC::DataReference dataReference;
</span><span class="cx"> if (serializedResultValue)
</span><span class="cx"> dataReference = serializedResultValue->data();
</span><del>- send(Messages::WebPageProxy::ScriptValueCallback(dataReference, hadException, callbackID));
</del><ins>+ send(Messages::WebPageProxy::ScriptValueCallback(dataReference, hadException, details, callbackID));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPage::getContentsAsString(uint64_t callbackID)
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Tools/ChangeLog        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-10-24 Tim Horton <timothy_horton@apple.com>
+
+ Expose more information about the exception in WKErrorJavaScriptExceptionOccurred errors
+ https://bugs.webkit.org/show_bug.cgi?id=150525
+
+ Reviewed by Darin Adler.
+
+ * TestWebKitAPI/Tests/WebKit2Cocoa/WKWebViewEvaluateJavaScript.mm:
+ (TEST):
+ Test the various new keys.
+
</ins><span class="cx"> 2015-10-24 Frederic Wang <fred.wang@free.fr>
</span><span class="cx">
</span><span class="cx"> check-webkit-style complains about missing operator whitespace inside character literal
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2CocoaWKWebViewEvaluateJavaScriptmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKWebViewEvaluateJavaScript.mm (191542 => 191543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKWebViewEvaluateJavaScript.mm        2015-10-25 03:20:36 UTC (rev 191542)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKWebViewEvaluateJavaScript.mm        2015-10-25 05:37:09 UTC (rev 191543)
</span><span class="lines">@@ -31,10 +31,23 @@
</span><span class="cx"> #import "PlatformUtilities.h"
</span><span class="cx"> #import "Test.h"
</span><span class="cx"> #import <WebKit/WKWebView.h>
</span><ins>+#import <WebKit/WKErrorPrivate.h>
</ins><span class="cx"> #import <wtf/RetainPtr.h>
</span><span class="cx">
</span><span class="cx"> static bool isDone;
</span><span class="cx">
</span><ins>+@interface EvaluateJavaScriptNavigationDelegate : NSObject <WKNavigationDelegate>
+@end
+
+@implementation EvaluateJavaScriptNavigationDelegate
+
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
+{
+ isDone = true;
+}
+
+@end
+
</ins><span class="cx"> TEST(WKWebView, EvaluateJavaScriptBlockCrash)
</span><span class="cx"> {
</span><span class="cx"> RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
</span><span class="lines">@@ -63,14 +76,17 @@
</span><span class="cx"> TEST(WKWebView, EvaluateJavaScriptErrorCases)
</span><span class="cx"> {
</span><span class="cx"> RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
</span><ins>+ RetainPtr<EvaluateJavaScriptNavigationDelegate> delegate = adoptNS([[EvaluateJavaScriptNavigationDelegate alloc] init]);
+ [webView setNavigationDelegate:delegate.get()];
</ins><span class="cx">
</span><span class="cx"> NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
</span><span class="cx"> [webView loadRequest:request];
</span><ins>+ TestWebKitAPI::Util::run(&isDone);
</ins><span class="cx">
</span><span class="cx"> [webView evaluateJavaScript:@"document.body" completionHandler:^(id result, NSError *error) {
</span><span class="cx"> EXPECT_NULL(result);
</span><span class="cx"> EXPECT_WK_STREQ(@"WKErrorDomain", [error domain]);
</span><del>- EXPECT_EQ(5, [error code]);
</del><ins>+ EXPECT_EQ(WKErrorJavaScriptResultTypeIsUnsupported, [error code]);
</ins><span class="cx">
</span><span class="cx"> isDone = true;
</span><span class="cx"> }];
</span><span class="lines">@@ -81,13 +97,32 @@
</span><span class="cx"> [webView evaluateJavaScript:@"document.body.insertBefore(document, document)" completionHandler:^(id result, NSError *error) {
</span><span class="cx"> EXPECT_NULL(result);
</span><span class="cx"> EXPECT_WK_STREQ(@"WKErrorDomain", [error domain]);
</span><del>- EXPECT_EQ(4, [error code]);
</del><ins>+ EXPECT_EQ(WKErrorJavaScriptExceptionOccurred, [error code]);
+ EXPECT_NOT_NULL([error.userInfo objectForKey:_WKJavaScriptExceptionMessageErrorKey]);
+ EXPECT_GT([[error.userInfo objectForKey:_WKJavaScriptExceptionMessageErrorKey] length], (unsigned long)0);
+ EXPECT_EQ(1, [[error.userInfo objectForKey:_WKJavaScriptExceptionLineNumberErrorKey] intValue]);
+ EXPECT_EQ(27, [[error.userInfo objectForKey:_WKJavaScriptExceptionColumnNumberErrorKey] intValue]);
</ins><span class="cx">
</span><span class="cx"> isDone = true;
</span><span class="cx"> }];
</span><span class="cx">
</span><span class="cx"> isDone = false;
</span><span class="cx"> TestWebKitAPI::Util::run(&isDone);
</span><ins>+
+ [webView evaluateJavaScript:@"\n\nthrow 'something bad'" completionHandler:^(id result, NSError *error) {
+ EXPECT_NULL(result);
+ EXPECT_WK_STREQ(@"WKErrorDomain", [error domain]);
+ EXPECT_EQ(WKErrorJavaScriptExceptionOccurred, [error code]);
+ EXPECT_WK_STREQ(@"something bad", [error.userInfo objectForKey:_WKJavaScriptExceptionMessageErrorKey]);
+ EXPECT_EQ(3, [[error.userInfo objectForKey:_WKJavaScriptExceptionLineNumberErrorKey] intValue]);
+ EXPECT_EQ(22, [[error.userInfo objectForKey:_WKJavaScriptExceptionColumnNumberErrorKey] intValue]);
+ EXPECT_NOT_NULL([error.userInfo objectForKey:_WKJavaScriptExceptionSourceURLErrorKey]);
+
+ isDone = true;
+ }];
+
+ isDone = false;
+ TestWebKitAPI::Util::run(&isDone);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>
</body>
</html>