[Webkit-unassigned] [Bug 29863] New: [Qt] Additional Functionality for QWebKit + Patch
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Tue Sep 29 05:46:38 PDT 2009
https://bugs.webkit.org/show_bug.cgi?id=29863
Summary: [Qt] Additional Functionality for QWebKit + Patch
Product: WebKit
Version: 528+ (Nightly build)
Platform: Other
OS/Version: Mac OS X 10.5
Status: NEW
Keywords: Qt
Severity: Normal
Priority: P2
Component: New Bugs
AssignedTo: webkit-unassigned at lists.webkit.org
ReportedBy: vestbo at webkit.org
This bug report originated from issue QTBUG-3896
http://bugreports.qt.nokia.com/browse/QTBUG-3896
--- Description ---
The following suggestion and patch depends on suggestions:
250464
250466
250469
To print extra stuff, like page numbers, dates and the likes,
QWebFrame is made to emit a signal for each page Printing.
Support is added to the QWebFrame function, to use an existing
QPainter object, so that one can print multiple web pages into
one document (or a web page and something else). Since a
web page can now be printed as a part of a document. The
countPages function is added to the QWebFrame object, to
figure out how many pages will actually be printed by "print".
A boolean indicator is added to the print method tho specify
if you want to use the screen or the print mediatype.
qtwebkit does not expose DOM, and even if it did there would
in all likely hood be no way of given a DOM element to figure
out where it would be printed. Therefor the headings method is
added, it will return a list of "h?" element in the DOM,
containing their text, the level (the ? part of h?). The
location in screen coordinates. The page on which they are
printed, and the location they are printed on the page
(0.0,0.0) again being left-top, and (1.0,1.0) being the
right-bottom. This can obviously be coupled quite nicely with
the pdf outline patch(task #250464).
Patch:
diff -ur
qt-x11-opensource-src-4.5.0-old/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
qt-x11-opensource-src-4.5.0/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
---
qt-x11-opensource-src-4.5.0-old/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
2009-02-25 22:09:21.000000000 +0100
+++ qt-x11-opensource-src-4.5.0/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
2009-03-14 10:24:02.000000000 +0100
@@ -75,6 +75,7 @@
#include <qevent.h>
#include <qfileinfo.h>
#include <qpainter.h>
+#include <qprintengine.h>
#include <QMultiMap>
#if QT_VERSION >= 0x040400
#include <qnetworkrequest.h>
@@ -886,16 +887,114 @@
}
#ifndef QT_NO_PRINTER
+struct HeadingsGenerator {
+ QVector<QWebFrame::Heading> res;
+ HeadingsGenerator(): res() {};
+
+ static QPoint getObjectLocation(RenderObject * r) {
+ int x=0;
+ int y=r->height()/2;
+ while(r) {
+ x += r->xPos();
+ y += r->yPos();
+ r = r->parent();
+ }
+ return QPoint(x,y);
+ }
+
+ static void extractText(Node * n, QString & text) {
+ text.append(n->nodeValue());
+ for(Node *i=n->firstChild(); i != NULL; i = i->nextSibling())
+ extractText(i,text);
+ }
+
+ bool addHeading(Node * n) {
+ if(!n || n->nodeName()[0] != 'H' || '1' > n->nodeName()[1] ||
n->nodeName()[1] > '6') return false;
+ QWebFrame::Heading h;
+ h.text = QString();
+ h.page = 1;
+ h.locationOnPage = QPointF();
+ h.level = n->nodeName()[1]-'0';
+ extractText(n,h.text);
+ h.text = h.text.simplified();
+ h.location = getObjectLocation(n->renderer());
+ res.push_back(h);
+ return true;
+ }
+
+ void visitNode(Node * n) {
+ if(!addHeading(n))
+ for(Node * i=n->firstChild(); i != NULL; i = i->nextSibling())
+ visitNode(i);
+ }
+};
+
+QVector<QWebFrame::Heading> QWebFrame::headings(QPrinter * printer, bool
usePrintMediaType) {
+ HeadingsGenerator gen;
+ if(!printer) {
+ gen.visitNode(d->frame->document());
+ return gen.res;
+ }
+ const qreal zoomFactorX = printer->logicalDpiX() / qt_defaultDpi();
+ const qreal zoomFactorY = printer->logicalDpiY() / qt_defaultDpi();
+
+ PrintContext printContext(d->frame);
+ float pageHeight = 0;
+ QRect qprinterRect = printer->pageRect();
+ IntRect pageRect(0, 0,
+ int(qprinterRect.width() / zoomFactorX),
+ int(qprinterRect.height() / zoomFactorY));
+ printContext.begin(pageRect.width(), usePrintMediaType);
+ printContext.computePageRects(pageRect, 0, 0, 1.0, pageHeight);
+
+ const Vector<IntRect> & pageRects = printContext.getPageRects();
+ QMap<float, uint> pageEnd;
+ for(uint i=0; i < pageRects.size(); ++i) pageEnd[pageRects[i].bottom()] =
i;
+ for(RenderObject * o=d->frame->document()->renderer(); o;
o=o->nextInPreOrder())
+ if(gen.addHeading(o->node())) {
+ QWebFrame::Heading & h = gen.res.back();
+ h.locationOnPage = gen.getObjectLocation(o);
+ QMap<float, uint>::const_iterator pageI =
pageEnd.upperBound(h.locationOnPage.y());
+ h.page=(pageI == pageEnd.end())?pageRects.size()-1:pageI.value();
+ h.locationOnPage -= QPointF(0,pageRects[h.page].y());
+ h.locationOnPage= QPointF(h.locationOnPage.x() /
pageRects[h.page].x(),
+ h.locationOnPage.y() /
pageRects[h.page].y());
+ }
+ printContext.end();
+ return gen.res;
+}
+
+uint QWebFrame::countPages(QPrinter *printer, bool usePrintMediaType) {
+ const qreal zoomFactorX = printer->logicalDpiX() / qt_defaultDpi();
+ const qreal zoomFactorY = printer->logicalDpiY() / qt_defaultDpi();
+
+ PrintContext printContext(d->frame);
+ float pageHeight = 0;
+
+ QRect qprinterRect = printer->pageRect();
+
+ IntRect pageRect(0, 0,
+ int(qprinterRect.width() / zoomFactorX),
+ int(qprinterRect.height() / zoomFactorY));
+
+ printContext.begin(pageRect.width(), usePrintMediaType);
+ printContext.computePageRects(pageRect, /*headerHeight*/0,
/*footerHeight*/0, /*userScaleFactor*/1.0, pageHeight);
+ uint count = printContext.pageCount();
+ printContext.end();
+ return count;
+}
+
/*!
Prints the frame to the given \a printer.
\sa render()
*/
-void QWebFrame::print(QPrinter *printer) const
+void QWebFrame::print(QPrinter *printer, QPainter * painter, bool
usePrintMediaType) const
{
- QPainter painter;
- if (!painter.begin(printer))
- return;
+ QPainter * ipainter = painter;
+ if(!ipainter) ipainter = new QPainter();
+ if(!ipainter->isActive()) ipainter->begin(printer);
+ ipainter->save();
const qreal zoomFactorX = printer->logicalDpiX() / qt_defaultDpi();
const qreal zoomFactorY = printer->logicalDpiY() / qt_defaultDpi();
@@ -909,7 +999,7 @@
int(qprinterRect.width() / zoomFactorX),
int(qprinterRect.height() / zoomFactorY));
- printContext.begin(pageRect.width());
+ printContext.begin(pageRect.width(), usePrintMediaType);
printContext.computePageRects(pageRect, /*headerHeight*/0,
/*footerHeight*/0, /*userScaleFactor*/1.0, pageHeight);
@@ -942,8 +1032,8 @@
ascending = false;
}
- painter.scale(zoomFactorX, zoomFactorY);
- GraphicsContext ctx(&painter);
+ ipainter->scale(zoomFactorX, zoomFactorY);
+ GraphicsContext ctx(ipainter);
for (int i = 0; i < docCopies; ++i) {
int page = fromPage;
@@ -955,10 +1045,13 @@
return;
}
printContext.spoolPage(ctx, page - 1, pageRect.width());
- if (j < pageCopies - 1)
+ if (j < pageCopies - 1) {
+ emit printingNewPage(printer,fromPage,toPage,page);
printer->newPage();
+ }
}
-
+ emit printingNewPage(printer,fromPage,toPage,page);
+
if (page == toPage)
break;
@@ -975,6 +1068,8 @@
}
printContext.end();
+ ipainter->restore();
+ if(ipainter != painter) delete ipainter;
}
#endif // QT_NO_PRINTER
diff -ur
qt-x11-opensource-src-4.5.0-old/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
qt-x11-opensource-src-4.5.0/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
---
qt-x11-opensource-src-4.5.0-old/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
2009-02-25 22:09:21.000000000 +0100
+++ qt-x11-opensource-src-4.5.0/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
2009-03-14 10:23:07.000000000 +0100
@@ -115,6 +117,14 @@
public:
QWebPage *page() const;
+ struct Heading {
+ QString text;
+ uint level;
+ QPoint location;
+ uint page;
+ QPointF locationOnPage;
+ };
+
void load(const QUrl &url);
#if QT_VERSION < 0x040400
void load(const QWebNetworkRequest &request);
@@ -174,10 +184,13 @@
QWebSecurityOrigin securityOrigin() const;
+ QVector<Heading> headings(QPrinter * printer=NULL, bool
usePrintMediaType=true);
+ uint countPages(QPrinter *printer, bool usePrintMediaType=true);
+
public Q_SLOTS:
QVariant evaluateJavaScript(const QString& scriptSource);
#ifndef QT_NO_PRINTER
- void print(QPrinter *printer) const;
+ void print(QPrinter *printer, QPainter * painter=NULL, bool
usePrintMediaType=true) const;
#endif
Q_SIGNALS:
@@ -191,6 +204,7 @@
void iconChanged();
+ void printingNewPage(QPrinter *p, int fromPage, int toPage, int Page)
const;
private:
friend class QWebPage;
friend class QWebPagePrivate;
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list