[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.1/kdelibs/khtml
From:       Frank Osterfeld <frank.osterfeld () kdemail ! net>
Date:       2008-10-19 20:54:59
Message-ID: 1224449699.186209.1110.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 873635 by osterfeld:

backport: don't crash when the khtmlpart is deleted while a print dialog is open
CCBUG:144940


 M  +19 -6     khtmlview.cpp  


--- branches/KDE/4.1/kdelibs/khtml/khtmlview.cpp #873634:873635
@@ -3138,21 +3138,34 @@
     return d->needsFullRepaint;
 }
 
+namespace {
+   class QPointerDeleter
+   {
+   public:
+       explicit QPointerDeleter(QObject* o) : obj(o) {}
+       ~QPointerDeleter() { delete obj; }
+   private:
+       const QPointer<QObject> obj; 
+   }; 
+}
+
 void KHTMLView::print(bool quick)
 {
     if(!m_part->xmlDocImpl()) return;
     khtml::RenderCanvas *root = static_cast<khtml::RenderCanvas \
*>(m_part->xmlDocImpl()->renderer());  if(!root) return;
 
-    KHTMLPrintSettings printSettings; //XXX: doesn't save settings between prints \
like this +    QPointer<KHTMLPrintSettings> printSettings(new KHTMLPrintSettings); \
//XXX: doesn't save settings between prints like this +    const QPointerDeleter \
settingsDeleter(printSettings); //the printdialog takes ownership of the settings \
widget, thus this workaround to avoid double deletion  QPrinter printer;
-    QPrintDialog *dialog = KdePrint::createPrintDialog(&printer, QList<QWidget*>() \
<< &printSettings, this); +    QPointer<QPrintDialog> dialog = \
KdePrint::createPrintDialog(&printer, QList<QWidget*>() << printSettings, this); +    \
const QPointerDeleter dialogDeleter(dialog);  
     QString docname = m_part->xmlDocImpl()->URL().prettyUrl();
     if ( !docname.isEmpty() )
         docname = KStringHandler::csqueeze(docname, 80);
 
-    if(quick || dialog->exec()) {
+    if(quick || (dialog->exec() && dialog)) { /*'this' and thus dialog might have \
                been deleted while exec()!*/
         viewport()->setCursor( Qt::WaitCursor ); // only viewport(), no \
QApplication::, otherwise we get the busy cursor in kdeprint's dialogs  // set up \
KPrinter  printer.setFullPage(false);
@@ -3169,7 +3182,7 @@
         // We ignore margin settings for html and body when printing
         // and use the default margins from the print-system
         // (In Qt 3.0.x the default margins are hardcoded in Qt)
-        m_part->xmlDocImpl()->setPrintStyleSheet( printSettings.printFriendly() ?
+        m_part->xmlDocImpl()->setPrintStyleSheet( printSettings->printFriendly() ?
                                                   "* { background-image: none \
                !important;"
                                                   "    background-color: white \
                !important;"
                                                   "    color: black !important; }"
@@ -3191,7 +3204,7 @@
 
         m_part->xmlDocImpl()->styleSelector()->computeFontSizes(printer.logicalDpiY(), \
100);  m_part->xmlDocImpl()->updateStyleSelector();
-        root->setPrintImages(printSettings.printImages());
+        root->setPrintImages(printSettings->printImages());
         root->makePageBreakAvoidBlocks();
 
         root->setNeedsLayoutAndMinMaxRecalc();
@@ -3200,7 +3213,7 @@
 
         // check sizes ask for action.. (scale or clip)
 
-        bool printHeader = printSettings.printHeader();
+        bool printHeader = printSettings->printHeader();
 
         int headerHeight = 0;
         QFont headerFont("Sans Serif", 8);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic