[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