<!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>[162122] trunk/Tools</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/162122">162122</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2014-01-16 03:12:36 -0800 (Thu, 16 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK][MiniBrowser] The progress entry reset callback can be fired after the BrowserWindow is destroyed
https://bugs.webkit.org/show_bug.cgi?id=127083

Reviewed by Carlos Garcia Campos.

When the load progress reaches 1.0 (i.e. 100%), a timeout callback is set up in webViewLoadProgressChanged.
The progress entry is then reset back to 0 in that callback and the timeout source is removed.

The callback can be fired after the relevant BrowserWindow and its progress entry are destroyed, causing
assertion failures in gtk_entry_set_progress_fraction due to an invalid GtkEntry object. To avoid that,
To avoid that, the ID of the timeout source is stored on the BrowserWindow and is destroyed when the
BrowserWindow object is being finalized, preventing the callback from firing.

* MiniBrowser/gtk/BrowserWindow.c:
(resetEntryProgress):
(webViewLoadProgressChanged):
(browserWindowFinalize):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsMiniBrowsergtkBrowserWindowc">trunk/Tools/MiniBrowser/gtk/BrowserWindow.c</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (162121 => 162122)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-01-16 10:53:18 UTC (rev 162121)
+++ trunk/Tools/ChangeLog        2014-01-16 11:12:36 UTC (rev 162122)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2014-01-16  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [GTK][MiniBrowser] The progress entry reset callback can be fired after the BrowserWindow is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=127083
+
+        Reviewed by Carlos Garcia Campos.
+
+        When the load progress reaches 1.0 (i.e. 100%), a timeout callback is set up in webViewLoadProgressChanged.
+        The progress entry is then reset back to 0 in that callback and the timeout source is removed.
+
+        The callback can be fired after the relevant BrowserWindow and its progress entry are destroyed, causing
+        assertion failures in gtk_entry_set_progress_fraction due to an invalid GtkEntry object. To avoid that,
+        To avoid that, the ID of the timeout source is stored on the BrowserWindow and is destroyed when the
+        BrowserWindow object is being finalized, preventing the callback from firing.
+
+        * MiniBrowser/gtk/BrowserWindow.c:
+        (resetEntryProgress):
+        (webViewLoadProgressChanged):
+        (browserWindowFinalize):
+
</ins><span class="cx"> 2014-01-15  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         DumpRenderTree doesn't disable web preferences autosave
</span></span></pre></div>
<a id="trunkToolsMiniBrowsergtkBrowserWindowc"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/gtk/BrowserWindow.c (162121 => 162122)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/gtk/BrowserWindow.c        2014-01-16 10:53:18 UTC (rev 162121)
+++ trunk/Tools/MiniBrowser/gtk/BrowserWindow.c        2014-01-16 11:12:36 UTC (rev 162122)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">     GtkWidget *fullScreenMessageLabel;
</span><span class="cx">     GtkWindow *parentWindow;
</span><span class="cx">     guint fullScreenMessageLabelId;
</span><ins>+    guint resetEntryProgressTimeoutId;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct _BrowserWindowClass {
</span><span class="lines">@@ -154,9 +155,10 @@
</span><span class="cx">     gtk_window_set_title(GTK_WINDOW(window), title ? title : defaultWindowTitle);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean resetEntryProgress(GtkEntry *entry)
</del><ins>+static gboolean resetEntryProgress(BrowserWindow *window)
</ins><span class="cx"> {
</span><del>-    gtk_entry_set_progress_fraction(entry, 0);
</del><ins>+    gtk_entry_set_progress_fraction(GTK_ENTRY(window-&gt;uriEntry), 0);
+    window-&gt;resetEntryProgressTimeoutId = 0;
</ins><span class="cx">     return FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -165,8 +167,8 @@
</span><span class="cx">     gdouble progress = webkit_web_view_get_estimated_load_progress(webView);
</span><span class="cx">     gtk_entry_set_progress_fraction(GTK_ENTRY(window-&gt;uriEntry), progress);
</span><span class="cx">     if (progress == 1.0) {
</span><del>-        guint id = g_timeout_add(500, (GSourceFunc)resetEntryProgress, window-&gt;uriEntry);
-        g_source_set_name_by_id(id, &quot;[WebKit] resetEntryProgress&quot;);
</del><ins>+        window-&gt;resetEntryProgressTimeoutId = g_timeout_add(500, (GSourceFunc)resetEntryProgress, window);
+        g_source_set_name_by_id(window-&gt;resetEntryProgressTimeoutId, &quot;[WebKit] resetEntryProgress&quot;);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -514,6 +516,9 @@
</span><span class="cx">     if (window-&gt;fullScreenMessageLabelId)
</span><span class="cx">         g_source_remove(window-&gt;fullScreenMessageLabelId);
</span><span class="cx"> 
</span><ins>+    if (window-&gt;resetEntryProgressTimeoutId)
+        g_source_remove(window-&gt;resetEntryProgressTimeoutId);
+
</ins><span class="cx">     G_OBJECT_CLASS(browser_window_parent_class)-&gt;finalize(gObject);
</span><span class="cx"> 
</span><span class="cx">     if (g_atomic_int_dec_and_test(&amp;windowCount))
</span></span></pre>
</div>
</div>

</body>
</html>