<!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>[172275] 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/172275">172275</a></dd>
<dt>Author</dt> <dd>dbates@webkit.org</dd>
<dt>Date</dt> <dd>2014-08-07 14:39:19 -0700 (Thu, 07 Aug 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Sometimes Gmail cannot load messages, particularly on refresh (&quot;...the application ran into an unexpected error...&quot;)
https://bugs.webkit.org/show_bug.cgi?id=135688
&lt;rdar://problem/17886686&gt;

Reviewed by Alexey Proskuryakov.

Fixes an issue where gmail.com may fail to load the list of messages. In particular, a SQLTransactionCallback
function may not be executed and hence Gmail will not display the list of messages and
will subsequently display an error message.

When a WebKit client defers loading of a page (e.g. -[WebView setDefersCallbacks:YES]), WebCore
may still load the main resource, say if substitute data is available for it, and defer executing
tasks, such as a SQLTransactionCallback function, by appending such tasks to the end of the list
of pending tasks for the associated Document. This list of pending tasks is never processed when
a client subsequently allows loading (e.g. -[WebView setDefersCallbacks:NO])). Therefore, we never
execute a SQLTransactionCallback function that was deferred.

Ideally WebCore would defer loading of substitute data when a WebKit client requests that loading
be deferred and hence a SQLTransactionCallback function would be deferred as a consequence of the
lack of JavaScript script execution (since substitute data wasn't loaded and hence any JavaScript
script contained in the substitute data that initiates a SQL transaction isn't executed). For now,
it's sufficient to only defer executing tasks when either there are existing pending tasks or the
page defers loading and active DOM objects in the document are suspended (e.g. Document::suspendActiveDOMObjects() was called).

* dom/Document.cpp:
(WebCore::Document::postTask):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (172274 => 172275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-08-07 21:37:30 UTC (rev 172274)
+++ trunk/Source/WebCore/ChangeLog        2014-08-07 21:39:19 UTC (rev 172275)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2014-08-07  Daniel Bates  &lt;dabates@apple.com&gt;
+
+        Sometimes Gmail cannot load messages, particularly on refresh (&quot;...the application ran into an unexpected error...&quot;)
+        https://bugs.webkit.org/show_bug.cgi?id=135688
+        &lt;rdar://problem/17886686&gt;
+
+        Reviewed by Alexey Proskuryakov.
+
+        Fixes an issue where gmail.com may fail to load the list of messages. In particular, a SQLTransactionCallback
+        function may not be executed and hence Gmail will not display the list of messages and
+        will subsequently display an error message.
+
+        When a WebKit client defers loading of a page (e.g. -[WebView setDefersCallbacks:YES]), WebCore
+        may still load the main resource, say if substitute data is available for it, and defer executing
+        tasks, such as a SQLTransactionCallback function, by appending such tasks to the end of the list
+        of pending tasks for the associated Document. This list of pending tasks is never processed when
+        a client subsequently allows loading (e.g. -[WebView setDefersCallbacks:NO])). Therefore, we never
+        execute a SQLTransactionCallback function that was deferred.
+
+        Ideally WebCore would defer loading of substitute data when a WebKit client requests that loading
+        be deferred and hence a SQLTransactionCallback function would be deferred as a consequence of the
+        lack of JavaScript script execution (since substitute data wasn't loaded and hence any JavaScript
+        script contained in the substitute data that initiates a SQL transaction isn't executed). For now,
+        it's sufficient to only defer executing tasks when either there are existing pending tasks or the
+        page defers loading and active DOM objects in the document are suspended (e.g. Document::suspendActiveDOMObjects() was called).
+
+        * dom/Document.cpp:
+        (WebCore::Document::postTask):
+
</ins><span class="cx"> 2014-08-07  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Get rid of INPUT_SPEECH
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (172274 => 172275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2014-08-07 21:37:30 UTC (rev 172274)
+++ trunk/Source/WebCore/dom/Document.cpp        2014-08-07 21:39:19 UTC (rev 172275)
</span><span class="lines">@@ -4916,7 +4916,7 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         Page* page = document-&gt;page();
</span><del>-        if ((page &amp;&amp; page-&gt;defersLoading()) || !document-&gt;m_pendingTasks.isEmpty())
</del><ins>+        if ((page &amp;&amp; page-&gt;defersLoading() &amp;&amp; document-&gt;activeDOMObjectsAreSuspended()) || !document-&gt;m_pendingTasks.isEmpty())
</ins><span class="cx">             document-&gt;m_pendingTasks.append(WTF::move(*task.release()));
</span><span class="cx">         else
</span><span class="cx">             task-&gt;performTask(*document);
</span></span></pre>
</div>
</div>

</body>
</html>