<!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>[166436] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/166436">166436</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-28 16:31:39 -0700 (Fri, 28 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Really drop all locks in nested run loop on iOS if WebThread is enabled
https://bugs.webkit.org/show_bug.cgi?id=130912

Patch by Joseph Pecoraro &lt;pecoraro@apple.com&gt; on 2014-03-28
Reviewed by Geoffrey Garen.

Previously we were calling DropAllLocks inside of a single line if statement,
so the JSLock was getting reaquired very quickly. We really want to DropAllLocks
for the duration of running the nested run loop on iOS if there is a WebThread.

* bindings/js/PageScriptDebugServer.h:
* bindings/js/PageScriptDebugServer.cpp:
(WebCore::PageScriptDebugServer::runEventLoopWhilePaused):
(WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsPageScriptDebugServercpp">trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsPageScriptDebugServerh">trunk/Source/WebCore/bindings/js/PageScriptDebugServer.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (166435 => 166436)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-28 23:06:11 UTC (rev 166435)
+++ trunk/Source/WebCore/ChangeLog        2014-03-28 23:31:39 UTC (rev 166436)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-03-28  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Really drop all locks in nested run loop on iOS if WebThread is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=130912
+
+        Reviewed by Geoffrey Garen.
+
+        Previously we were calling DropAllLocks inside of a single line if statement,
+        so the JSLock was getting reaquired very quickly. We really want to DropAllLocks
+        for the duration of running the nested run loop on iOS if there is a WebThread.
+
+        * bindings/js/PageScriptDebugServer.h:
+        * bindings/js/PageScriptDebugServer.cpp:
+        (WebCore::PageScriptDebugServer::runEventLoopWhilePaused):
+        (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal):
+
</ins><span class="cx"> 2014-03-28  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Win] Enable Media Track testing features on Windows
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsPageScriptDebugServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp (166435 => 166436)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp        2014-03-28 23:06:11 UTC (rev 166435)
+++ trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp        2014-03-28 23:31:39 UTC (rev 166436)
</span><span class="lines">@@ -187,24 +187,29 @@
</span><span class="cx">     // On iOS, running an EventLoop causes us to run a nested WebRunLoop.
</span><span class="cx">     // Since the WebThread is autoreleased at the end of run loop iterations
</span><span class="cx">     // we need to gracefully handle releasing and reacquiring the lock.
</span><del>-    ASSERT(WebThreadIsLockedOrDisabled());
-    {
-        if (WebThreadIsEnabled())
-            JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM());
</del><ins>+    if (WebThreadIsEnabled()) {
+        ASSERT(WebThreadIsLockedOrDisabled());
+        JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM());
</ins><span class="cx">         WebRunLoopEnableNested();
</span><ins>+
+        runEventLoopWhilePausedInternal();
+
+        WebRunLoopDisableNested();
+        ASSERT(WebThreadIsLockedOrDisabled());
+        return;
+    }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    runEventLoopWhilePausedInternal();
+}
+
+void PageScriptDebugServer::runEventLoopWhilePausedInternal()
+{
</ins><span class="cx">     TimerBase::fireTimersInNestedEventLoop();
</span><span class="cx"> 
</span><span class="cx">     EventLoop loop;
</span><span class="cx">     while (!m_doneProcessingDebuggerEvents &amp;&amp; !loop.ended())
</span><span class="cx">         loop.cycle();
</span><del>-
-#if PLATFORM(IOS)
-        WebRunLoopDisableNested();
-    }
-    ASSERT(WebThreadIsLockedOrDisabled());
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool PageScriptDebugServer::isContentScript(ExecState* exec) const
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsPageScriptDebugServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/PageScriptDebugServer.h (166435 => 166436)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/PageScriptDebugServer.h        2014-03-28 23:06:11 UTC (rev 166435)
+++ trunk/Source/WebCore/bindings/js/PageScriptDebugServer.h        2014-03-28 23:31:39 UTC (rev 166436)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx">     virtual bool isContentScript(JSC::ExecState*) const override;
</span><span class="cx">     virtual void reportException(JSC::ExecState*, JSC::JSValue) const override;
</span><span class="cx"> 
</span><ins>+    void runEventLoopWhilePausedInternal();
</ins><span class="cx"> 
</span><span class="cx">     void didAddFirstListener(Page*);
</span><span class="cx">     void didRemoveLastListener(Page*, bool skipRecompile);
</span></span></pre>
</div>
</div>

</body>
</html>