<!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>[168653] trunk/Source/WebKit2</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/168653">168653</a></dd>
<dt>Author</dt> <dd>cfleizach@apple.com</dd>
<dt>Date</dt> <dd>2014-05-12 16:02:59 -0700 (Mon, 12 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>AX: .js dialogs shown in unload while AX is running crash WebKit.
https://bugs.webkit.org/show_bug.cgi?id=123828

Reviewed by Anders Carlsson.

Utilize platform API to inform AX clients when the WebProcess will suspend and resume.
This allows us to avoid having special behavior for accessibility when the WebProcess needs
to wait on a reply.

* Platform/IPC/Connection.cpp:
(IPC::Connection::waitForSyncReply):
* Platform/IPC/Connection.h:
* Platform/IPC/mac/ConnectionMac.cpp:
(IPC::Connection::willSendSyncMessage):
(IPC::Connection::didReceiveSyncReply):
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::runBeforeUnloadConfirmPanel):
(WebKit::WebChromeClient::runJavaScriptAlert):
(WebKit::WebChromeClient::runJavaScriptConfirm):
(WebKit::WebChromeClient::runJavaScriptPrompt):
(WebKit::WebChromeClient::print):
(WebKit::WebChromeClient::exceededDatabaseQuota):
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCConnectioncpp">trunk/Source/WebKit2/Platform/IPC/Connection.cpp</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCConnectionh">trunk/Source/WebKit2/Platform/IPC/Connection.h</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCmacConnectionMacmm">trunk/Source/WebKit2/Platform/IPC/mac/ConnectionMac.mm</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCunixConnectionUnixcpp">trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/ChangeLog        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2014-05-12  Chris Fleizach  &lt;cfleizach@apple.com&gt;
+
+        AX: .js dialogs shown in unload while AX is running crash WebKit.
+        https://bugs.webkit.org/show_bug.cgi?id=123828
+
+        Reviewed by Anders Carlsson.
+
+        Utilize platform API to inform AX clients when the WebProcess will suspend and resume.
+        This allows us to avoid having special behavior for accessibility when the WebProcess needs
+        to wait on a reply.
+
+        * Platform/IPC/Connection.cpp:
+        (IPC::Connection::waitForSyncReply):
+        * Platform/IPC/Connection.h:
+        * Platform/IPC/mac/ConnectionMac.cpp:
+        (IPC::Connection::willSendSyncMessage):
+        (IPC::Connection::didReceiveSyncReply):
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::runBeforeUnloadConfirmPanel):
+        (WebKit::WebChromeClient::runJavaScriptAlert):
+        (WebKit::WebChromeClient::runJavaScriptConfirm):
+        (WebKit::WebChromeClient::runJavaScriptPrompt):
+        (WebKit::WebChromeClient::print):
+        (WebKit::WebChromeClient::exceededDatabaseQuota):
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse):
+
</ins><span class="cx"> 2014-05-12  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Progress on web timing.
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/Connection.cpp (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/Connection.cpp        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/Platform/IPC/Connection.cpp        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -510,6 +510,8 @@
</span><span class="cx"> {
</span><span class="cx">     double absoluteTime = currentTime() + (timeout.count() / 1000.0);
</span><span class="cx"> 
</span><ins>+    willSendSyncMessage(syncSendFlags);
+    
</ins><span class="cx">     bool timedOut = false;
</span><span class="cx">     while (!timedOut) {
</span><span class="cx">         // First, check if we have any messages that we need to process.
</span><span class="lines">@@ -525,16 +527,20 @@
</span><span class="cx">             ASSERT_UNUSED(syncRequestID, pendingSyncReply.syncRequestID == syncRequestID);
</span><span class="cx">             
</span><span class="cx">             // We found the sync reply, or the connection was closed.
</span><del>-            if (pendingSyncReply.didReceiveReply || !m_shouldWaitForSyncReplies)
</del><ins>+            if (pendingSyncReply.didReceiveReply || !m_shouldWaitForSyncReplies) {
+                didReceiveSyncReply(syncSendFlags);
</ins><span class="cx">                 return std::move(pendingSyncReply.replyDecoder);
</span><ins>+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Processing a sync message could cause the connection to be invalidated.
</span><span class="cx">         // (If the handler ends up calling Connection::invalidate).
</span><span class="cx">         // If that happens, we need to stop waiting, or we'll hang since we won't get
</span><span class="cx">         // any more incoming messages.
</span><del>-        if (!isValid())
</del><ins>+        if (!isValid()) {
+            didReceiveSyncReply(syncSendFlags);
</ins><span class="cx">             return nullptr;
</span><ins>+        }
</ins><span class="cx"> 
</span><span class="cx">         // We didn't find a sync reply yet, keep waiting.
</span><span class="cx">         // This allows the WebProcess to still serve clients while waiting for the message to return.
</span><span class="lines">@@ -550,6 +556,8 @@
</span><span class="cx">             timedOut = !m_syncMessageState-&gt;wait(absoluteTime);
</span><span class="cx">         
</span><span class="cx">     }
</span><ins>+    
+    didReceiveSyncReply(syncSendFlags);
</ins><span class="cx"> 
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/Connection.h (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/Connection.h        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/Platform/IPC/Connection.h        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -62,8 +62,11 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> enum SyncMessageSendFlags {
</span><del>-    // Will allow events to continue being handled while waiting for the sync reply.
-    SpinRunLoopWhileWaitingForReply = 1 &lt;&lt; 0,
</del><ins>+    // Use this to inform that this sync call will suspend this process until the user responds with input.
+    InformPlatformProcessWillSuspend = 1 &lt;&lt; 0,
+    // Some platform accessibility clients can't suspend gracefully and need to spin the run loop so WebProcess doesn't hang.
+    // FIXME (126021): Remove when no platforms need to support this.
+    SpinRunLoopWhileWaitingForReply = 1 &lt;&lt; 1,
</ins><span class="cx"> };
</span><span class="cx">     
</span><span class="cx"> #define MESSAGE_CHECK_BASE(assertion, connection) do \
</span><span class="lines">@@ -212,6 +215,9 @@
</span><span class="cx">     // Can be called on any thread.
</span><span class="cx">     void enqueueIncomingMessage(std::unique_ptr&lt;MessageDecoder&gt;);
</span><span class="cx"> 
</span><ins>+    void willSendSyncMessage(unsigned syncSendFlags);
+    void didReceiveSyncReply(unsigned syncSendFlags);
+    
</ins><span class="cx">     Client* m_client;
</span><span class="cx">     bool m_isServer;
</span><span class="cx">     std::atomic&lt;uint64_t&gt; m_syncRequestID;
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCmacConnectionMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/mac/ConnectionMac.mm (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/mac/ConnectionMac.mm        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/Platform/IPC/mac/ConnectionMac.mm        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;ImportanceAssertion.h&quot;
</span><span class="cx"> #include &quot;MachPort.h&quot;
</span><span class="cx"> #include &quot;MachUtilities.h&quot;
</span><ins>+#include &lt;WebCore/AXObjectCache.h&gt;
</ins><span class="cx"> #include &lt;mach/mach_error.h&gt;
</span><span class="cx"> #include &lt;mach/vm_map.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="lines">@@ -42,7 +43,19 @@
</span><span class="cx"> extern &quot;C&quot; void xpc_connection_kill(xpc_connection_t, int);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if __has_include(&lt;HIServices/AccessibilityPriv.h&gt;)
+#include &lt;HIServices/AccessibilityPriv.h&gt;
+#else
+typedef enum {
+    AXSuspendStatusRunning = 0,
+    AXSuspendStatusSuspended,
+} AXSuspendStatus;
+#endif
</ins><span class="cx"> 
</span><ins>+#if !TARGET_OS_IPHONE &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
+extern &quot;C&quot; AXError _AXUIElementNotifyProcessSuspendStatus(AXSuspendStatus);
+#endif
+
</ins><span class="cx"> namespace IPC {
</span><span class="cx"> 
</span><span class="cx"> static const size_t inlineMessageMaxSize = 4096;
</span><span class="lines">@@ -536,5 +549,21 @@
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><ins>+    
+void Connection::willSendSyncMessage(unsigned flags)
+{
+#if !TARGET_OS_IPHONE &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
+    if ((flags &amp; InformPlatformProcessWillSuspend) &amp;&amp; WebCore::AXObjectCache::accessibilityEnabled())
+        _AXUIElementNotifyProcessSuspendStatus(AXSuspendStatusSuspended);
+#endif
+}
</ins><span class="cx"> 
</span><ins>+void Connection::didReceiveSyncReply(unsigned flags)
+{
+#if !TARGET_OS_IPHONE &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
+    if ((flags &amp; InformPlatformProcessWillSuspend) &amp;&amp; WebCore::AXObjectCache::accessibilityEnabled())
+        _AXUIElementNotifyProcessSuspendStatus(AXSuspendStatusRunning);
+#endif
+}    
+    
</ins><span class="cx"> } // namespace IPC
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCunixConnectionUnixcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -557,5 +557,15 @@
</span><span class="cx">     SocketPair socketPair = { sockets[0], sockets[1] };
</span><span class="cx">     return socketPair;
</span><span class="cx"> }
</span><ins>+    
+void Connection::willSendSyncMessage(unsigned flags)
+{
+    UNUSED_PARAM(flags);
+}
+    
+void Connection::didReceiveSyncReply(unsigned flags)
+{
+    UNUSED_PARAM(flags);    
+}
</ins><span class="cx"> 
</span><span class="cx"> } // namespace IPC
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -327,7 +327,12 @@
</span><span class="cx">     WebFrame* webFrame = WebFrame::fromCoreFrame(*frame);
</span><span class="cx"> 
</span><span class="cx">     bool shouldClose = false;
</span><del>-    if (!WebProcess::shared().parentProcessConnection()-&gt;sendSync(Messages::WebPageProxy::RunBeforeUnloadConfirmPanel(message, webFrame-&gt;frameID()), Messages::WebPageProxy::RunBeforeUnloadConfirmPanel::Reply(shouldClose), m_page-&gt;pageID()))
</del><ins>+
+    unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+    if (WebPage::synchronousMessagesShouldSpinRunLoop())
+        syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
+    
+    if (!WebProcess::shared().parentProcessConnection()-&gt;sendSync(Messages::WebPageProxy::RunBeforeUnloadConfirmPanel(message, webFrame-&gt;frameID()), Messages::WebPageProxy::RunBeforeUnloadConfirmPanel::Reply(shouldClose), m_page-&gt;pageID(), std::chrono::milliseconds::max(), syncSendFlags))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     return shouldClose;
</span><span class="lines">@@ -360,8 +365,9 @@
</span><span class="cx">     // Notify the bundle client.
</span><span class="cx">     m_page-&gt;injectedBundleUIClient().willRunJavaScriptAlert(m_page, alertText, webFrame);
</span><span class="cx"> 
</span><del>-    // FIXME (126021): It is not good to change IPC behavior conditionally, and SpinRunLoopWhileWaitingForReply was known to cause trouble in other similar cases.
-    unsigned syncSendFlags = WebPage::synchronousMessagesShouldSpinRunLoop() ? IPC::SpinRunLoopWhileWaitingForReply : 0;
</del><ins>+    unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+    if (WebPage::synchronousMessagesShouldSpinRunLoop())
+        syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
</ins><span class="cx">     WebProcess::shared().parentProcessConnection()-&gt;sendSync(Messages::WebPageProxy::RunJavaScriptAlert(webFrame-&gt;frameID(), alertText), Messages::WebPageProxy::RunJavaScriptAlert::Reply(), m_page-&gt;pageID(), std::chrono::milliseconds::max(), syncSendFlags);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -373,8 +379,9 @@
</span><span class="cx">     // Notify the bundle client.
</span><span class="cx">     m_page-&gt;injectedBundleUIClient().willRunJavaScriptConfirm(m_page, message, webFrame);
</span><span class="cx"> 
</span><del>-    // FIXME (126021): It is not good to change IPC behavior conditionally, and SpinRunLoopWhileWaitingForReply was known to cause trouble in other similar cases.
-    unsigned syncSendFlags = WebPage::synchronousMessagesShouldSpinRunLoop() ? IPC::SpinRunLoopWhileWaitingForReply : 0;
</del><ins>+    unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+    if (WebPage::synchronousMessagesShouldSpinRunLoop())
+        syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
</ins><span class="cx">     bool result = false;
</span><span class="cx">     if (!WebProcess::shared().parentProcessConnection()-&gt;sendSync(Messages::WebPageProxy::RunJavaScriptConfirm(webFrame-&gt;frameID(), message), Messages::WebPageProxy::RunJavaScriptConfirm::Reply(result), m_page-&gt;pageID(), std::chrono::milliseconds::max(), syncSendFlags))
</span><span class="cx">         return false;
</span><span class="lines">@@ -390,8 +397,10 @@
</span><span class="cx">     // Notify the bundle client.
</span><span class="cx">     m_page-&gt;injectedBundleUIClient().willRunJavaScriptPrompt(m_page, message, defaultValue, webFrame);
</span><span class="cx"> 
</span><del>-    // FIXME (126021): It is not good to change IPC behavior conditionally, and SpinRunLoopWhileWaitingForReply was known to cause trouble in other similar cases.
-    unsigned syncSendFlags = WebPage::synchronousMessagesShouldSpinRunLoop() ? IPC::SpinRunLoopWhileWaitingForReply : 0;
</del><ins>+    unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+    if (WebPage::synchronousMessagesShouldSpinRunLoop())
+        syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
+    
</ins><span class="cx">     if (!WebProcess::shared().parentProcessConnection()-&gt;sendSync(Messages::WebPageProxy::RunJavaScriptPrompt(webFrame-&gt;frameID(), message, defaultValue), Messages::WebPageProxy::RunJavaScriptPrompt::Reply(result), m_page-&gt;pageID(), std::chrono::milliseconds::max(), syncSendFlags))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="lines">@@ -608,7 +617,11 @@
</span><span class="cx">     RefPtr&lt;PrinterListGtk&gt; printerList = PrinterListGtk::shared();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    m_page-&gt;sendSync(Messages::WebPageProxy::PrintFrame(webFrame-&gt;frameID()), Messages::WebPageProxy::PrintFrame::Reply());
</del><ins>+    unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+    if (WebPage::synchronousMessagesShouldSpinRunLoop())
+        syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
+    
+    m_page-&gt;sendSync(Messages::WebPageProxy::PrintFrame(webFrame-&gt;frameID()), Messages::WebPageProxy::PrintFrame::Reply(), std::chrono::milliseconds::max(), syncSendFlags);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SQL_DATABASE)
</span><span class="lines">@@ -627,9 +640,13 @@
</span><span class="cx">     newQuota = m_page-&gt;injectedBundleUIClient().didExceedDatabaseQuota(m_page, webSecurityOrigin.get(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage());
</span><span class="cx"> 
</span><span class="cx">     if (!newQuota) {
</span><ins>+        unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+        if (WebPage::synchronousMessagesShouldSpinRunLoop())
+            syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
+        
</ins><span class="cx">         WebProcess::shared().parentProcessConnection()-&gt;sendSync(
</span><span class="cx">             Messages::WebPageProxy::ExceededDatabaseQuota(webFrame-&gt;frameID(), origin-&gt;databaseIdentifier(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()),
</span><del>-            Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page-&gt;pageID());
</del><ins>+            Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page-&gt;pageID(), std::chrono::milliseconds::max(), syncSendFlags);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     dbManager.setQuota(origin, newQuota);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -53,7 +53,6 @@
</span><span class="cx"> #include &quot;WebProcessProxyMessages.h&quot;
</span><span class="cx"> #include &lt;JavaScriptCore/APICast.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSObject.h&gt;
</span><del>-#include &lt;WebCore/AXObjectCache.h&gt;
</del><span class="cx"> #include &lt;WebCore/CertificateInfo.h&gt;
</span><span class="cx"> #include &lt;WebCore/Chrome.h&gt;
</span><span class="cx"> #include &lt;WebCore/DOMWrapperWorld.h&gt;
</span><span class="lines">@@ -661,9 +660,9 @@
</span><span class="cx">     uint64_t policyAction;
</span><span class="cx">     uint64_t downloadID;
</span><span class="cx"> 
</span><del>-    // Notify the UIProcess.
-    // FIXME (126021): It is not good to change IPC behavior conditionally, and SpinRunLoopWhileWaitingForReply was known to cause trouble in other similar cases.
-    unsigned syncSendFlags = WebPage::synchronousMessagesShouldSpinRunLoop() ? IPC::SpinRunLoopWhileWaitingForReply : 0;
</del><ins>+    unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend;
+    if (WebPage::synchronousMessagesShouldSpinRunLoop())
+        syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply;
</ins><span class="cx">     if (!webPage-&gt;sendSync(Messages::WebPageProxy::DecidePolicyForResponseSync(m_frame-&gt;frameID(), response, request, canShowMIMEType, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForResponseSync::Reply(receivedPolicyAction, policyAction, downloadID), std::chrono::milliseconds::max(), syncSendFlags))
</span><span class="cx">         return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (168652 => 168653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-05-12 23:01:49 UTC (rev 168652)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-05-12 23:02:59 UTC (rev 168653)
</span><span class="lines">@@ -4594,7 +4594,7 @@
</span><span class="cx">     
</span><span class="cx"> bool WebPage::synchronousMessagesShouldSpinRunLoop()
</span><span class="cx"> {
</span><del>-#if PLATFORM(MAC)
</del><ins>+#if PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &lt; 101000
</ins><span class="cx">     return WebCore::AXObjectCache::accessibilityEnabled();
</span><span class="cx"> #endif
</span><span class="cx">     return false;
</span></span></pre>
</div>
</div>

</body>
</html>