Added the missing parameters to make it possible to do POST operations from the publi...
[WebKit-https.git] / WebKit / qt / Api / qwebview.cpp
1 /*
2     Copyright (C) 2007 Trolltech ASA
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18 */
19
20 #include "config.h"
21 #include "qwebview.h"
22 #include "qwebframe.h"
23 #include "qevent.h"
24 #include "qpainter.h"
25
26 class QWebViewPrivate
27 {
28 public:
29     QWebPage *page;
30 };
31
32 /*!
33     \class QWebView
34     \since 4.4
35     \brief The QWebview class provides a widget that is used to view and edit web documents.
36
37     QWebView is the main widget component of the QtWebKit web browsing module.
38 */
39
40 /*!
41     Constructs an empty QWebView with parent \a parent.
42 */
43 QWebView::QWebView(QWidget *parent)
44     : QWidget(parent)
45 {
46     d = new QWebViewPrivate;
47     d->page = 0;
48
49     QPalette pal = palette();
50     pal.setBrush(QPalette::Background, Qt::white);
51
52     setAttribute(Qt::WA_OpaquePaintEvent);
53
54     setPalette(pal);
55     setAcceptDrops(true);
56
57     setMouseTracking(true);
58     setFocusPolicy(Qt::ClickFocus);
59 }
60
61 /*!
62     Destructor.
63 */
64 QWebView::~QWebView()
65 {
66     if (d->page && d->page->parent() == this)
67         delete d->page;
68     delete d;
69 }
70
71 /*!
72     Returns a pointer to the underlying web page.
73
74     \sa setPage()
75 */
76 QWebPage *QWebView::page() const
77 {
78     if (!d->page) {
79         QWebView *that = const_cast<QWebView *>(this);
80         that->setPage(new QWebPage(that));
81     }
82     return d->page;
83 }
84
85 /*!
86     Makes \a page the new web page of the web view.
87
88     The parent QObject of the provided page remains the owner
89     of the object. If the current document is a child of the web
90     view, then it is deleted.
91
92     \sa page()
93 */
94 void QWebView::setPage(QWebPage *page)
95 {
96     if (d->page == page)
97         return;
98     if (d->page) {
99         if (d->page->parent() == this) {
100             delete d->page;
101         } else {
102             d->page->disconnect(this);
103         }
104     }
105     d->page = page;
106     if (d->page) {
107         d->page->setView(this);
108         // #### connect signals
109         QWebFrame *mainFrame = d->page->mainFrame();
110         connect(mainFrame, SIGNAL(loadStarted()),
111                 this, SIGNAL(loadStarted()));
112         connect(mainFrame, SIGNAL(loadFinished()),
113                 this, SIGNAL(loadFinished()));
114         connect(mainFrame, SIGNAL(titleChanged(const QString&)),
115                 this, SIGNAL(titleChanged(const QString&)));
116         connect(mainFrame, SIGNAL(iconLoaded()),
117                 this, SIGNAL(iconLoaded()));
118
119         connect(d->page, SIGNAL(loadProgressChanged(int)),
120                 this, SIGNAL(loadProgressChanged(int)));
121         connect(d->page, SIGNAL(statusBarTextChanged(const QString &)),
122                 this, SIGNAL(statusBarTextChanged(const QString &)));
123     }
124     update();
125 }
126
127 /*!
128     Downloads the specified \a url and displays it.
129 */
130 void QWebView::load(const QUrl &url)
131 {
132     page()->mainFrame()->load(url);
133 }
134
135 #if QT_VERSION < 0x040400
136 void QWebView::load(const QWebNetworkRequest &request)
137 #else
138 void QWebView::load(const QNetworkRequest &request,
139                     QNetworkAccessManager::Operation operation,
140                     const QByteArray &body)
141 #endif
142 {
143     page()->mainFrame()->load(request
144 #if QT_VERSION >= 0x040400
145                               , operation, body
146 #endif
147                              );
148 }
149
150 /*!
151     Sets the content of the web view to the specified \a html.
152
153     External objects referenced in the HTML document are located relative to \a baseUrl.
154 */
155 void QWebView::setHtml(const QString &html, const QUrl &baseUrl)
156 {
157     page()->mainFrame()->setHtml(html, baseUrl);
158 }
159
160 /*!
161     Sets the content of the web view to the specified \a html.
162
163     External objects referenced in the HTML document are located relative to \a baseUrl.
164 */
165 void QWebView::setHtml(const QByteArray &html, const QUrl &baseUrl)
166 {
167     page()->mainFrame()->setHtml(html, baseUrl);
168 }
169
170 /*!
171     Sets the content of the web view to the specified content \a data. If the \a mimeType argument
172     is empty it is assumed that the content is HTML.
173
174     External objects referenced in the HTML document are located relative to \a baseUrl.
175 */
176 void QWebView::setContent(const QByteArray &data, const QString &mimeType, const QUrl &baseUrl)
177 {
178     page()->mainFrame()->setContent(data, mimeType, baseUrl);
179 }
180
181 /*!
182     Returns a pointer to the view's history of navigated web pages.
183
184     It is equivalent to
185
186     \code
187     view->page()->history();
188     \endcode
189 */
190 QWebPageHistory *QWebView::history() const
191 {
192     return page()->history();
193 }
194
195 /*!
196     Returns a pointer to the view/page specific settings object.
197
198     It is equivalent to
199
200     \code
201     view->page()->settings();
202     \endcode
203 */
204 QWebSettings *QWebView::settings() const
205 {
206     return page()->settings();
207 }
208
209 /*!
210   \property QWebView::documentTitle
211   \brief the title of the web page currently viewed.
212 */
213
214 QString QWebView::title() const
215 {
216     if (d->page)
217         return d->page->mainFrame()->title();
218     return QString();
219 }
220
221 /*!
222     \property QWebView::url
223     \brief the url of the web page currently viewed.
224 */
225
226 QUrl QWebView::url() const
227 {
228     if (d->page)
229         return d->page->mainFrame()->url();
230     return QUrl();
231 }
232
233 /*!
234     \property QWebView::icon
235     \brief the icon associated with the web page currently viewed.
236 */
237
238 QPixmap QWebView::icon() const
239 {
240     if (d->page)
241         return d->page->mainFrame()->icon();
242     return QPixmap();
243 }
244
245 /*!
246     \property QWebView::selectedText
247     \brief the text currently selected.
248 */
249
250 QString QWebView::selectedText() const
251 {
252     if (d->page)
253         return d->page->selectedText();
254     return QString();
255 }
256
257 /*!
258     Returns a pointer to a QAction that encapsulates the specified web action \a action.
259 */
260 QAction *QWebView::action(QWebPage::WebAction action) const
261 {
262     return page()->action(action);
263 }
264
265 /*!
266     Triggers the specified \a action. If it is a checkable action the specified \a checked state is assumed.
267
268     The following example triggers the copy action and therefore copies any selected text to the clipboard.
269
270     \code
271     view->triggerAction(QWebPage::Copy);
272     \endcode
273 */
274 void QWebView::triggerAction(QWebPage::WebAction action, bool checked)
275 {
276     page()->triggerAction(action, checked);
277 }
278
279 /*!
280     \propery QWebView::modified
281     \brief Indicates whether the document was modified by the user or not.
282
283     Parts of HTML documents can be editable for example through the \c{contenteditable} attribute on
284     HTML elements.
285 */
286 bool QWebView::isModified() const
287 {
288     if (d->page)
289         return d->page->isModified();
290     return false;
291 }
292
293 Qt::TextInteractionFlags QWebView::textInteractionFlags() const
294 {
295     // ### FIXME (add to page)
296     return Qt::TextInteractionFlags();
297 }
298
299 /*!
300     \property QWebView::textInteractionFlags
301
302     Specifies how the view should interact with user input.
303 */
304
305 void QWebView::setTextInteractionFlags(Qt::TextInteractionFlags flags)
306 {
307     Q_UNUSED(flags)
308     // ### FIXME (add to page)
309 }
310
311 QSize QWebView::sizeHint() const
312 {
313     return QSize(800, 600); // ####...
314 }
315
316 /*!
317     Convenience slot that stops loading the document.
318
319     It is equivalent to
320
321     \code
322     view->page()->triggerAction(QWebPage::Stop);
323     \endcode
324 */
325 void QWebView::stop()
326 {
327     if (d->page)
328         d->page->triggerAction(QWebPage::Stop);
329 }
330
331 /*!
332     Convenience slot that loads the previous document in the list of
333     documents built by navigating links. Does nothing if there is no
334     previous document.
335
336     It is equivalent to
337
338     \code
339     view->page()->triggerAction(QWebPage::GoBack);
340     \endcode
341 */
342 void QWebView::backward()
343 {
344     if (d->page)
345         d->page->triggerAction(QWebPage::GoBack);
346 }
347
348 /*!
349     Convenience slot that loads the next document in the list of
350     documents built by navigating links. Does nothing if there is no
351     next document.
352
353     It is equivalent to
354
355     \code
356     view->page()->triggerAction(QWebPage::GoForward);
357     \endcode
358 */
359 void QWebView::forward()
360 {
361     if (d->page)
362         d->page->triggerAction(QWebPage::GoForward);
363 }
364
365 /*!
366     Reloads the current document.
367 */
368 void QWebView::reload()
369 {
370     if (d->page)
371         d->page->triggerAction(QWebPage::Reload);
372 }
373
374 /*! \reimp
375 */
376 void QWebView::resizeEvent(QResizeEvent *e)
377 {
378     if (d->page)
379         d->page->setViewportSize(e->size());
380 }
381
382
383 void QWebView::paintEvent(QPaintEvent *ev)
384 {
385 #ifdef QWEBKIT_TIME_RENDERING
386     QTime time;
387     time.start();
388 #endif
389
390     QWebFrame *frame = d->page->mainFrame();
391     QPainter p(this);
392
393     QVector<QRect> vector = ev->region().rects();
394     if (!vector.isEmpty()) {
395         for (int i = 0; i < vector.size(); ++i) {
396             frame->render(&p, vector.at(i));
397         }
398     } else {
399         frame->render(&p, ev->rect());
400     }
401
402 #ifdef    QWEBKIT_TIME_RENDERING
403     int elapsed = time.elapsed();
404     qDebug()<<"paint event on "<<ev->region()<<", took to render =  "<<elapsed;
405 #endif
406 }
407
408 /*! \reimp
409 */
410 void QWebView::mouseMoveEvent(QMouseEvent* ev)
411 {
412     d->page->event(ev);
413 }
414
415 /*! \reimp
416 */
417 void QWebView::mousePressEvent(QMouseEvent* ev)
418 {
419     d->page->event(ev);
420 }
421
422 /*! \reimp
423 */
424 void QWebView::mouseDoubleClickEvent(QMouseEvent* ev)
425 {
426     d->page->event(ev);
427 }
428
429 /*! \reimp
430 */
431 void QWebView::mouseReleaseEvent(QMouseEvent* ev)
432 {
433     d->page->event(ev);
434 }
435
436 /*! \reimp
437 */
438 void QWebView::contextMenuEvent(QContextMenuEvent* ev)
439 {
440     d->page->event(ev);
441 }
442
443 /*! \reimp
444 */
445 void QWebView::wheelEvent(QWheelEvent* ev)
446 {
447     d->page->event(ev);
448
449     if (!ev->isAccepted())
450         return QWidget::wheelEvent(ev);
451 }
452
453 /*! \reimp
454 */
455 void QWebView::keyPressEvent(QKeyEvent* ev)
456 {
457     d->page->event(ev);
458 }
459
460 /*! \reimp
461 */
462 void QWebView::keyReleaseEvent(QKeyEvent* ev)
463 {
464     d->page->event(ev);
465 }
466
467 /*! \reimp
468 */
469 void QWebView::focusInEvent(QFocusEvent* ev)
470 {
471     d->page->event(ev);
472     QWidget::focusInEvent(ev);
473 }
474
475 /*! \reimp
476 */
477 void QWebView::focusOutEvent(QFocusEvent* ev)
478 {
479     QWidget::focusOutEvent(ev);
480     d->page->event(ev);
481 }
482
483 /*! \reimp
484 */
485 void QWebView::dragEnterEvent(QDragEnterEvent* ev)
486 {
487     d->page->event(ev);
488 }
489
490 /*! \reimp
491 */
492 void QWebView::dragLeaveEvent(QDragLeaveEvent* ev)
493 {
494     d->page->event(ev);
495 }
496
497 /*! \reimp
498 */
499 void QWebView::dragMoveEvent(QDragMoveEvent* ev)
500 {
501     d->page->event(ev);
502 }
503
504 /*! \reimp
505 */
506 void QWebView::dropEvent(QDropEvent* ev)
507 {
508     d->page->event(ev);
509 }
510
511 /*! \reimp
512 */
513 bool QWebView::focusNextPrevChild(bool next)
514 {
515     return d->page->focusNextPrevChild(next);
516 }
517