<!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>[165495] releases/WebKitGTK/webkit-2.4/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/165495">165495</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-12 12:27:33 -0700 (Wed, 12 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/165489">r165489</a> - [GTK] Runtime error when page is closed while print operation is in progress
https://bugs.webkit.org/show_bug.cgi?id=129869

Reviewed by Anders Carlsson.

Sometimes when the page is closed right after printing the web
process aborts with the runtime message &quot;pure virtual method
called terminate called without an active exception&quot;.
This happens because the page is closed when the pages have been
printed, but print job is still ongoing sending the data to the
printer. When print job finishes, we try to notify the UI process
sending the print callback message using WebPage::send(), but the
web page object has been destroyed. The virtual method it complains
about is probably MessageSender::messageSenderDestinationID() used
by send(). Since our print operation is always asynchronous, we
need a way to notify the web page when the print operation has
actually finished to clean it up, but also notify the print
operation when the page has been closed to not try to notify the
UI process in that case.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::close): Call disconnectFromPage to notify the
print operation in case there's an ongoing print job.
(WebKit::WebPage::endPrinting): Do not cleanup the print operation
here, since the print opertation might not have finished yet.
(WebKit::WebPage::didFinishPrintOperation): Send
PrintFinishedCallback message to the Ui process and cleanup the
print operation.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp:
(WebKit::WebPrintOperationGtk::disconnectFromPage): Set m_webPage
to nullptr.
(WebKit::WebPrintOperationGtk::printDone): Call
didFinishPrintOperation() is the web page hasn't been closed.
* WebProcess/WebPage/gtk/WebPrintOperationGtk.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit24SourceWebKit2ChangeLog">releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPageWebPagecpp">releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPageWebPageh">releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPagegtkWebPrintOperationGtkcpp">releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPagegtkWebPrintOperationGtkh">releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit24SourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog (165494 => 165495)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog        2014-03-12 19:25:32 UTC (rev 165494)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog        2014-03-12 19:27:33 UTC (rev 165495)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2014-03-12  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Runtime error when page is closed while print operation is in progress
+        https://bugs.webkit.org/show_bug.cgi?id=129869
+
+        Reviewed by Anders Carlsson.
+
+        Sometimes when the page is closed right after printing the web
+        process aborts with the runtime message &quot;pure virtual method
+        called terminate called without an active exception&quot;.
+        This happens because the page is closed when the pages have been
+        printed, but print job is still ongoing sending the data to the
+        printer. When print job finishes, we try to notify the UI process
+        sending the print callback message using WebPage::send(), but the
+        web page object has been destroyed. The virtual method it complains
+        about is probably MessageSender::messageSenderDestinationID() used
+        by send(). Since our print operation is always asynchronous, we
+        need a way to notify the web page when the print operation has
+        actually finished to clean it up, but also notify the print
+        operation when the page has been closed to not try to notify the
+        UI process in that case.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::close): Call disconnectFromPage to notify the
+        print operation in case there's an ongoing print job.
+        (WebKit::WebPage::endPrinting): Do not cleanup the print operation
+        here, since the print opertation might not have finished yet.
+        (WebKit::WebPage::didFinishPrintOperation): Send
+        PrintFinishedCallback message to the Ui process and cleanup the
+        print operation.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp:
+        (WebKit::WebPrintOperationGtk::disconnectFromPage): Set m_webPage
+        to nullptr.
+        (WebKit::WebPrintOperationGtk::printDone): Call
+        didFinishPrintOperation() is the web page hasn't been closed.
+        * WebProcess/WebPage/gtk/WebPrintOperationGtk.h:
+
</ins><span class="cx"> 2014-03-10  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] The web process can finish while a print operation is still ongoing
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (165494 => 165495)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-03-12 19:25:32 UTC (rev 165494)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-03-12 19:27:33 UTC (rev 165495)
</span><span class="lines">@@ -839,6 +839,13 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if PLATFORM(GTK)
+    if (m_printOperation) {
+        m_printOperation-&gt;disconnectFromPage();
+        m_printOperation = nullptr;
+    }
+#endif
+
</ins><span class="cx">     m_sandboxExtensionTracker.invalidate();
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(PRIMARY_SNAPSHOTTED_PLUGIN_HEURISTIC)
</span><span class="lines">@@ -3385,9 +3392,6 @@
</span><span class="cx"> void WebPage::endPrinting()
</span><span class="cx"> {
</span><span class="cx">     drawingArea()-&gt;setLayerTreeStateIsFrozen(false);
</span><del>-#if PLATFORM(GTK)
-    m_printOperation = 0;
-#endif
</del><span class="cx">     m_printContext = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3513,7 +3517,6 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #elif PLATFORM(GTK)
</span><del>-
</del><span class="cx"> void WebPage::drawPagesForPrinting(uint64_t frameID, const PrintInfo&amp; printInfo, uint64_t callbackID)
</span><span class="cx"> {
</span><span class="cx">     beginPrinting(frameID, printInfo);
</span><span class="lines">@@ -3524,6 +3527,12 @@
</span><span class="cx"> 
</span><span class="cx">     send(Messages::WebPageProxy::VoidCallback(callbackID));
</span><span class="cx"> }
</span><ins>+
+void WebPage::didFinishPrintOperation(const WebCore::ResourceError&amp; error, uint64_t callbackID)
+{
+    send(Messages::WebPageProxy::PrintFinishedCallback(error, callbackID));
+    m_printOperation = nullptr;
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void WebPage::savePDFToFileInDownloadsFolder(const String&amp; suggestedFilename, const String&amp; originatingURLString, const uint8_t* data, unsigned long size)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.h (165494 => 165495)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-03-12 19:25:32 UTC (rev 165494)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-03-12 19:27:33 UTC (rev 165495)
</span><span class="lines">@@ -579,6 +579,7 @@
</span><span class="cx">     void drawPagesToPDF(uint64_t frameID, const PrintInfo&amp;, uint32_t first, uint32_t count, uint64_t callbackID);
</span><span class="cx"> #elif PLATFORM(GTK)
</span><span class="cx">     void drawPagesForPrinting(uint64_t frameID, const PrintInfo&amp;, uint64_t callbackID);
</span><ins>+    void didFinishPrintOperation(const WebCore::ResourceError&amp;, uint64_t callbackID);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void setMediaVolume(float);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPagegtkWebPrintOperationGtkcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp (165494 => 165495)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp        2014-03-12 19:25:32 UTC (rev 165494)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp        2014-03-12 19:27:33 UTC (rev 165495)
</span><span class="lines">@@ -420,6 +420,11 @@
</span><span class="cx">         g_source_remove(m_printPagesIdleId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPrintOperationGtk::disconnectFromPage()
+{
+    m_webPage = nullptr;
+}
+
</ins><span class="cx"> int WebPrintOperationGtk::pageCount() const
</span><span class="cx"> {
</span><span class="cx">     return m_printContext ? m_printContext-&gt;pageCount() : 0;
</span><span class="lines">@@ -699,8 +704,9 @@
</span><span class="cx">         g_source_remove(m_printPagesIdleId);
</span><span class="cx">     m_printPagesIdleId = 0;
</span><span class="cx"> 
</span><del>-    // Print finished or failed, notify the UI process that we are done.
-    m_webPage-&gt;send(Messages::WebPageProxy::PrintFinishedCallback(error, m_callbackID));
</del><ins>+    // Print finished or failed, notify the UI process that we are done if the page hasn't been closed.
+    if (m_webPage)
+        m_webPage-&gt;didFinishPrintOperation(error, m_callbackID);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPrintOperationGtk::print(cairo_surface_t* surface, double xDPI, double yDPI)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit24SourceWebKit2WebProcessWebPagegtkWebPrintOperationGtkh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h (165494 => 165495)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h        2014-03-12 19:25:32 UTC (rev 165494)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h        2014-03-12 19:27:33 UTC (rev 165495)
</span><span class="lines">@@ -73,6 +73,8 @@
</span><span class="cx">     bool collateCopies() const { return m_collateCopies; }
</span><span class="cx">     double scale() const { return m_scale; }
</span><span class="cx"> 
</span><ins>+    void disconnectFromPage();
+
</ins><span class="cx">     virtual void startPrint(WebCore::PrintContext*, uint64_t callbackID) = 0;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -93,6 +95,7 @@
</span><span class="cx">     void prepareContextToDraw();
</span><span class="cx">     void printPagesDone();
</span><span class="cx">     void printDone(const WebCore::ResourceError&amp;);
</span><ins>+    void sendPrintFinished(const WebCore::ResourceError&amp;);
</ins><span class="cx">     WebCore::URL frameURL() const;
</span><span class="cx"> 
</span><span class="cx">     WebPage* m_webPage;
</span></span></pre>
</div>
</div>

</body>
</html>