<!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&lt;ExceptionDetails&gt;::encode):
(IPC::ArgumentCoder&lt;ExceptionDetails&gt;::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  &lt;timothy_horton@apple.com&gt;
+
+        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  &lt;yoon@igalia.com&gt;
</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-&gt;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-&gt;scriptExecutionContext();
</span><span class="cx">     scriptExecutionContext-&gt;reportException(errorMessage, lineNumber, columnNumber, exceptionSourceURL, callStack-&gt;size() ? callStack : 0, cachedScript);
</span><ins>+
+    if (exceptionDetails) {
+        exceptionDetails-&gt;message = errorMessage;
+        exceptionDetails-&gt;lineNumber = lineNumber;
+        exceptionDetails-&gt;columnNumber = columnNumber;
+        exceptionDetails-&gt;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&amp; activeDOMWindow(JSC::ExecState*);
</span><span class="cx"> DOMWindow&amp; firstDOMWindow(JSC::ExecState*);
</span><span class="cx"> 
</span><span class="lines">@@ -272,7 +279,7 @@
</span><span class="cx"> const JSC::HashTable&amp; getHashTableForGlobalData(JSC::VM&amp;, const JSC::HashTable&amp; 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&amp; sourceCode, DOMWrapperWorld&amp; world)
</del><ins>+Deprecated::ScriptValue ScriptController::evaluateInWorld(const ScriptSourceCode&amp; sourceCode, DOMWrapperWorld&amp; 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-&gt;vm(), returnValue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Deprecated::ScriptValue ScriptController::evaluate(const ScriptSourceCode&amp; sourceCode) 
</del><ins>+Deprecated::ScriptValue ScriptController::evaluate(const ScriptSourceCode&amp; 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&lt;DOMWrapperWorld&gt; 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&amp; script, bool forceUserGesture)
</del><ins>+Deprecated::ScriptValue ScriptController::executeScript(const String&amp; 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()-&gt;url()));
</del><ins>+    return executeScript(ScriptSourceCode(script, m_frame.document()-&gt;url()), exceptionDetails);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Deprecated::ScriptValue ScriptController::executeScript(const ScriptSourceCode&amp; sourceCode)
</del><ins>+Deprecated::ScriptValue ScriptController::executeScript(const ScriptSourceCode&amp; 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&lt;Frame&gt; 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&amp; 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&lt;Ref&lt;DOMWrapperWorld&gt;&gt;&amp;);
</span><span class="cx"> 
</span><del>-    Deprecated::ScriptValue executeScript(const ScriptSourceCode&amp;);
-    WEBCORE_EXPORT Deprecated::ScriptValue executeScript(const String&amp; script, bool forceUserGesture = false);
</del><ins>+    Deprecated::ScriptValue executeScript(const ScriptSourceCode&amp;, ExceptionDetails* = nullptr);
+    WEBCORE_EXPORT Deprecated::ScriptValue executeScript(const String&amp; script, bool forceUserGesture = false, ExceptionDetails* = nullptr);
</ins><span class="cx">     WEBCORE_EXPORT Deprecated::ScriptValue executeScriptInWorld(DOMWrapperWorld&amp;, const String&amp; 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&amp;);
-    Deprecated::ScriptValue evaluateInWorld(const ScriptSourceCode&amp;, DOMWrapperWorld&amp;);
</del><ins>+    Deprecated::ScriptValue evaluate(const ScriptSourceCode&amp;, ExceptionDetails* = nullptr);
+    Deprecated::ScriptValue evaluateInWorld(const ScriptSourceCode&amp;, DOMWrapperWorld&amp;, 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  &lt;timothy_horton@apple.com&gt;
+
+        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&lt;ExceptionDetails&gt;::encode):
+        (IPC::ArgumentCoder&lt;ExceptionDetails&gt;::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  &lt;gyuyoung.kim@webkit.org&gt;
</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': ['&lt;wtf/text/WTFString.h&gt;'],
</span><span class="cx">         'WebCore::CompositionUnderline': ['&lt;WebCore/Editor.h&gt;'],
</span><ins>+        'WebCore::ExceptionDetails': ['&lt;WebCore/JSDOMBinding.h&gt;'],
</ins><span class="cx">         'WebCore::GrammarDetail': ['&lt;WebCore/TextCheckerClient.h&gt;'],
</span><span class="cx">         'WebCore::TextureMapperAnimations': ['&lt;WebCore/TextureMapperAnimation.h&gt;'],
</span><span class="cx">         'WebCore::KeyframeValueList': ['&lt;WebCore/GraphicsLayer.h&gt;'],
</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 &lt;WebCore/GraphicsLayer.h&gt;
</span><span class="cx"> #include &lt;WebCore/IDBGetResult.h&gt;
</span><span class="cx"> #include &lt;WebCore/Image.h&gt;
</span><ins>+#include &lt;WebCore/JSDOMBinding.h&gt;
</ins><span class="cx"> #include &lt;WebCore/Length.h&gt;
</span><span class="cx"> #include &lt;WebCore/Path.h&gt;
</span><span class="cx"> #include &lt;WebCore/PluginData.h&gt;
</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&lt;ExceptionDetails&gt;::encode(IPC::ArgumentEncoder&amp; encoder, const ExceptionDetails&amp; info)
+{
+    encoder &lt;&lt; info.message;
+    encoder &lt;&lt; info.lineNumber;
+    encoder &lt;&lt; info.columnNumber;
+    encoder &lt;&lt; info.sourceURL;
+}
+
+bool ArgumentCoder&lt;ExceptionDetails&gt;::decode(IPC::ArgumentDecoder&amp; decoder, ExceptionDetails&amp; 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&amp;, WebCore::RecentSearch&amp;);
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;&gt; struct ArgumentCoder&lt;WebCore::ExceptionDetails&gt; {
+    static void encode(ArgumentEncoder&amp;, const WebCore::ExceptionDetails&amp;);
+    static bool decode(ArgumentDecoder&amp;, WebCore::ExceptionDetails&amp;);
+};
+
</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)-&gt;runJavaScriptInMainFrame(toImpl(scriptRef)-&gt;string(), [context, callback](API::SerializedScriptValue* returnValue, bool, CallbackBase::Error error) {
</del><ins>+    toImpl(pageRef)-&gt;runJavaScriptInMainFrame(toImpl(scriptRef)-&gt;string(), [context, callback](API::SerializedScriptValue* returnValue, bool, const WebCore::ExceptionDetails&amp;, 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 = @&quot;WKErrorDomain&quot;;
</span><span class="cx"> NSString * const _WKLegacyErrorDomain = @&quot;WebKitErrorDomain&quot;;
</span><span class="cx"> 
</span><del>-static NSString *localizedDescriptionForErrorCode(WKErrorCode errorCode)
</del><ins>+NSString * const _WKJavaScriptExceptionMessageErrorKey = @&quot;WKJavaScriptExceptionMessage&quot;;
+NSString * const _WKJavaScriptExceptionLineNumberErrorKey = @&quot;WKJavaScriptExceptionLineNumber&quot;;
+NSString * const _WKJavaScriptExceptionColumnNumberErrorKey = @&quot;WKJavaScriptExceptionColumnNumber&quot;;
+NSString * const _WKJavaScriptExceptionSourceURLErrorKey = @&quot;WKJavaScriptExceptionSourceURL&quot;;
+
+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 &quot;GenericCallback.h&quot;
</span><span class="cx"> 
</span><span class="cx"> RetainPtr&lt;NSError&gt; 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 &quot;_WKSessionStateInternal.h&quot;
</span><span class="cx"> #import &quot;_WKVisitedLinkStoreInternal.h&quot;
</span><span class="cx"> #import &lt;WebCore/IOSurface.h&gt;
</span><ins>+#import &lt;WebCore/JSDOMBinding.h&gt;
</ins><span class="cx"> #import &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #import &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #import &lt;wtf/NeverDestroyed.h&gt;
</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-&gt;runJavaScriptInMainFrame(javaScriptString, [handler](API::SerializedScriptValue* serializedScriptValue, bool hadException, WebKit::ScriptValueCallback::Error errorCode) {
</del><ins>+    _page-&gt;runJavaScriptInMainFrame(javaScriptString, [handler](API::SerializedScriptValue* serializedScriptValue, bool hadException, const WebCore::ExceptionDetails&amp; 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&lt;NSMutableDictionary&gt; userInfo = adoptNS([[NSMutableDictionary alloc] init]);
+
+            [userInfo setObject:localizedDescriptionForErrorCode(WKErrorJavaScriptExceptionOccurred) forKey:NSLocalizedDescriptionKey];
+            [userInfo setObject:static_cast&lt;NSString *&gt;(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 &lt;WebCore/DragData.h&gt;
</span><span class="cx"> #include &lt;WebCore/FloatRect.h&gt;
</span><span class="cx"> #include &lt;WebCore/FocusDirection.h&gt;
</span><ins>+#include &lt;WebCore/JSDOMBinding.h&gt;
</ins><span class="cx"> #include &lt;WebCore/MIMETypeRegistry.h&gt;
</span><span class="cx"> #include &lt;WebCore/RenderEmbeddedObject.h&gt;
</span><span class="cx"> #include &lt;WebCore/SerializedCryptoKeyWrap.h&gt;
</span><span class="lines">@@ -2587,10 +2588,10 @@
</span><span class="cx">     m_process-&gt;send(Messages::WebPage::CountStringMatches(string, options, maxMatchCount), m_pageID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::runJavaScriptInMainFrame(const String&amp; script, std::function&lt;void (API::SerializedScriptValue*, bool hadException, CallbackBase::Error)&gt; callbackFunction)
</del><ins>+void WebPageProxy::runJavaScriptInMainFrame(const String&amp; script, std::function&lt;void (API::SerializedScriptValue*, bool hadException, const ExceptionDetails&amp;, CallbackBase::Error)&gt; 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-&gt;performCallbackWithReturnValue(resultString.impl());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::scriptValueCallback(const IPC::DataReference&amp; dataReference, bool hadException, uint64_t callbackID)
</del><ins>+void WebPageProxy::scriptValueCallback(const IPC::DataReference&amp; dataReference, bool hadException, const ExceptionDetails&amp; details, uint64_t callbackID)
</ins><span class="cx"> {
</span><span class="cx">     auto callback = m_callbacks.take&lt;ScriptValueCallback&gt;(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-&gt;performCallbackWithReturnValue(data.size() ? API::SerializedScriptValue::adopt(data).ptr() : nullptr, hadException);
</del><ins>+    callback-&gt;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&lt;IntRect&gt;&amp; 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&lt;uint64_t&gt; UnsignedCallback;
</span><span class="cx"> typedef GenericCallback&lt;EditingRange&gt; EditingRangeCallback;
</span><span class="cx"> typedef GenericCallback&lt;const String&amp;&gt; StringCallback;
</span><del>-typedef GenericCallback&lt;API::SerializedScriptValue*, bool&gt; ScriptValueCallback;
</del><ins>+typedef GenericCallback&lt;API::SerializedScriptValue*, bool, const WebCore::ExceptionDetails&amp;&gt; ScriptValueCallback;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(GTK)
</span><span class="cx"> typedef GenericCallback&lt;API::Error*&gt; PrintFinishedCallback;
</span><span class="lines">@@ -762,7 +763,7 @@
</span><span class="cx">     void getSelectionAsWebArchiveData(std::function&lt;void (API::Data*, CallbackBase::Error)&gt;);
</span><span class="cx">     void getSourceForFrame(WebFrameProxy*, std::function&lt;void (const String&amp;, CallbackBase::Error)&gt;);
</span><span class="cx">     void getWebArchiveOfFrame(WebFrameProxy*, std::function&lt;void (API::Data*, CallbackBase::Error)&gt;);
</span><del>-    void runJavaScriptInMainFrame(const String&amp;, std::function&lt;void (API::SerializedScriptValue*, bool hadException, CallbackBase::Error)&gt; callbackFunction);
</del><ins>+    void runJavaScriptInMainFrame(const String&amp;, std::function&lt;void (API::SerializedScriptValue*, bool hadException, const WebCore::ExceptionDetails&amp;, CallbackBase::Error)&gt; callbackFunction);
</ins><span class="cx">     void forceRepaint(PassRefPtr&lt;VoidCallback&gt;);
</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&amp;, uint64_t);
</span><span class="cx">     void imageCallback(const ShareableBitmap::Handle&amp;, uint64_t);
</span><span class="cx">     void stringCallback(const String&amp;, uint64_t);
</span><del>-    void scriptValueCallback(const IPC::DataReference&amp;, bool hadException, uint64_t);
</del><ins>+    void scriptValueCallback(const IPC::DataReference&amp;, bool hadException, const WebCore::ExceptionDetails&amp;, uint64_t);
</ins><span class="cx">     void computedPagesCallback(const Vector&lt;WebCore::IntRect&gt;&amp;, double totalScaleFactorForPrinting, uint64_t);
</span><span class="cx">     void validateCommandCallback(const String&amp;, 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&lt;WebCore::IntRect&gt; 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&lt;SerializedScriptValue&gt; serializedResultValue;
</span><span class="cx">     JSLockHolder lock(JSDOMWindow::commonVM());
</span><span class="cx">     bool hadException = true;
</span><del>-    if (JSValue resultValue = m_mainFrame-&gt;coreFrame()-&gt;script().executeScript(script, true).jsValue()) {
</del><ins>+    ExceptionDetails details;
+    if (JSValue resultValue = m_mainFrame-&gt;coreFrame()-&gt;script().executeScript(script, true, &amp;details).jsValue()) {
</ins><span class="cx">         hadException = false;
</span><span class="cx">         serializedResultValue = SerializedScriptValue::create(m_mainFrame-&gt;jsContext(),
</span><span class="cx">             toRef(m_mainFrame-&gt;coreFrame()-&gt;script().globalObject(mainThreadNormalWorld())-&gt;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-&gt;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  &lt;timothy_horton@apple.com&gt;
+
+        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  &lt;fred.wang@free.fr&gt;
</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 &quot;PlatformUtilities.h&quot;
</span><span class="cx"> #import &quot;Test.h&quot;
</span><span class="cx"> #import &lt;WebKit/WKWebView.h&gt;
</span><ins>+#import &lt;WebKit/WKErrorPrivate.h&gt;
</ins><span class="cx"> #import &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> static bool isDone;
</span><span class="cx"> 
</span><ins>+@interface EvaluateJavaScriptNavigationDelegate : NSObject &lt;WKNavigationDelegate&gt;
+@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&lt;WKWebView&gt; 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&lt;WKWebView&gt; webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
</span><ins>+    RetainPtr&lt;EvaluateJavaScriptNavigationDelegate&gt; delegate = adoptNS([[EvaluateJavaScriptNavigationDelegate alloc] init]);
+    [webView setNavigationDelegate:delegate.get()];
</ins><span class="cx"> 
</span><span class="cx">     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@&quot;simple&quot; withExtension:@&quot;html&quot; subdirectory:@&quot;TestWebKitAPI.resources&quot;]];
</span><span class="cx">     [webView loadRequest:request];
</span><ins>+    TestWebKitAPI::Util::run(&amp;isDone);
</ins><span class="cx"> 
</span><span class="cx">     [webView evaluateJavaScript:@&quot;document.body&quot; completionHandler:^(id result, NSError *error) {
</span><span class="cx">         EXPECT_NULL(result);
</span><span class="cx">         EXPECT_WK_STREQ(@&quot;WKErrorDomain&quot;, [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:@&quot;document.body.insertBefore(document, document)&quot; completionHandler:^(id result, NSError *error) {
</span><span class="cx">         EXPECT_NULL(result);
</span><span class="cx">         EXPECT_WK_STREQ(@&quot;WKErrorDomain&quot;, [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(&amp;isDone);
</span><ins>+
+    [webView evaluateJavaScript:@&quot;\n\nthrow 'something bad'&quot; completionHandler:^(id result, NSError *error) {
+        EXPECT_NULL(result);
+        EXPECT_WK_STREQ(@&quot;WKErrorDomain&quot;, [error domain]);
+        EXPECT_EQ(WKErrorJavaScriptExceptionOccurred, [error code]);
+        EXPECT_WK_STREQ(@&quot;something bad&quot;, [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(&amp;isDone);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>