4896900a3a61cad1bc09ee657f3ac09c40f4462c
[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 #endif
140 {
141     page()->mainFrame()->load(request);
142 }
143
144 /*!
145     Sets the content of the web view to the specified \a html.
146
147     External objects referenced in the HTML document are located relative to \a baseUrl.
148 */
149 void QWebView::setHtml(const QString &html, const QUrl &baseUrl)
150 {
151     page()->mainFrame()->setHtml(html, baseUrl);
152 }
153
154 /*!
155     Sets the content of the web view to the specified \a html.
156
157     External objects referenced in the HTML document are located relative to \a baseUrl.
158 */
159 void QWebView::setHtml(const QByteArray &html, const QUrl &baseUrl)
160 {
161     page()->mainFrame()->setHtml(html, baseUrl);
162 }
163
164 /*!
165     Sets the content of the web view to the specified content \a data. If the \a mimeType argument
166     is empty it is assumed that the content is HTML.
167
168     External objects referenced in the HTML document are located relative to \a baseUrl.
169 */
170 void QWebView::setContent(const QByteArray &data, const QString &mimeType, const QUrl &baseUrl)
171 {
172     page()->mainFrame()->setContent(data, mimeType, baseUrl);
173 }
174
175 /*!
176     Returns a pointer to the view's history of navigated web pages.
177
178     It is equivalent to
179
180     \code
181     view->page()->history();
182     \endcode
183 */
184 QWebPageHistory *QWebView::history() const
185 {
186     return page()->history();
187 }
188
189 /*!
190     Returns a pointer to the view/page specific settings object.
191
192     It is equivalent to
193
194     \code
195     view->page()->settings();
196     \endcode
197 */
198 QWebSettings *QWebView::settings() const
199 {
200     return page()->settings();
201 }
202
203 /*!
204   \property QWebView::documentTitle
205   \brief the title of the web page currently viewed.
206 */
207
208 QString QWebView::title() const
209 {
210     if (d->page)
211         return d->page->mainFrame()->title();
212     return QString();
213 }
214
215 /*!
216     \property QWebView::url
217     \brief the url of the web page currently viewed.
218 */
219
220 QUrl QWebView::url() const
221 {
222     if (d->page)
223         return d->page->mainFrame()->url();
224     return QUrl();
225 }
226
227 /*!
228     \property QWebView::icon
229     \brief the icon associated with the web page currently viewed.
230 */
231
232 QPixmap QWebView::icon() const
233 {
234     if (d->page)
235         return d->page->mainFrame()->icon();
236     return QPixmap();
237 }
238
239 /*!
240     \property QWebView::selectedText
241     \brief the text currently selected.
242 */
243
244 QString QWebView::selectedText() const
245 {
246     if (d->page)
247         return d->page->selectedText();
248     return QString();
249 }
250
251 /*!
252     Returns a pointer to a QAction that encapsulates the specified web action \a action.
253 */
254 QAction *QWebView::action(QWebPage::WebAction action) const
255 {
256     return page()->action(action);
257 }
258
259 /*!
260     Triggers the specified \a action. If it is a checkable action the specified \a checked state is assumed.
261
262     The following example triggers the copy action and therefore copies any selected text to the clipboard.
263
264     \code
265     view->triggerAction(QWebPage::Copy);
266     \endcode
267 */
268 void QWebView::triggerAction(QWebPage::WebAction action, bool checked)
269 {
270     page()->triggerAction(action, checked);
271 }
272
273 /*!
274     \propery QWebView::modified
275     \brief Indicates whether the document was modified by the user or not.
276
277     Parts of HTML documents can be editable for example through the \c{contenteditable} attribute on
278     HTML elements.
279 */
280 bool QWebView::isModified() const
281 {
282     if (d->page)
283         return d->page->isModified();
284     return false;
285 }
286
287 Qt::TextInteractionFlags QWebView::textInteractionFlags() const
288 {
289     // ### FIXME (add to page)
290     return Qt::TextInteractionFlags();
291 }
292
293 /*!
294     \property QWebView::textInteractionFlags
295
296     Specifies how the view should interact with user input.
297 */
298
299 void QWebView::setTextInteractionFlags(Qt::TextInteractionFlags flags)
300 {
301     Q_UNUSED(flags)
302     // ### FIXME (add to page)
303 }
304
305 QSize QWebView::sizeHint() const
306 {
307     return QSize(800, 600); // ####...
308 }
309
310 /*!
311     Convenience slot that stops loading the document.
312
313     It is equivalent to
314
315     \code
316     view->page()->triggerAction(QWebPage::Stop);
317     \endcode
318 */
319 void QWebView::stop()
320 {
321     if (d->page)
322         d->page->triggerAction(QWebPage::Stop);
323 }
324
325 /*!
326     Convenience slot that loads the previous document in the list of
327     documents built by navigating links. Does nothing if there is no
328     previous document.
329
330     It is equivalent to
331
332     \code
333     view->page()->triggerAction(QWebPage::GoBack);
334     \endcode
335 */
336 void QWebView::backward()
337 {
338     if (d->page)
339         d->page->triggerAction(QWebPage::GoBack);
340 }
341
342 /*!
343     Convenience slot that loads the next document in the list of
344     documents built by navigating links. Does nothing if there is no
345     next document.
346
347     It is equivalent to
348
349     \code
350     view->page()->triggerAction(QWebPage::GoForward);
351     \endcode
352 */
353 void QWebView::forward()
354 {
355     if (d->page)
356         d->page->triggerAction(QWebPage::GoForward);
357 }
358
359 /*!
360     Reloads the current document.
361 */
362 void QWebView::reload()
363 {
364     if (d->page)
365         d->page->triggerAction(QWebPage::Reload);
366 }
367
368 /*! \reimp
369 */
370 void QWebView::resizeEvent(QResizeEvent *e)
371 {
372     if (d->page)
373         d->page->setViewportSize(e->size());
374 }
375
376
377 void QWebView::paintEvent(QPaintEvent *ev)
378 {
379 #ifdef QWEBKIT_TIME_RENDERING
380     QTime time;
381     time.start();
382 #endif
383
384     QWebFrame *frame = d->page->mainFrame();
385     QPainter p(this);
386
387     QVector<QRect> vector = ev->region().rects();
388     if (!vector.isEmpty()) {
389         for (int i = 0; i < vector.size(); ++i) {
390             frame->render(&p, vector.at(i));
391         }
392     } else {
393         frame->render(&p, ev->rect());
394     }
395
396 #ifdef    QWEBKIT_TIME_RENDERING
397     int elapsed = time.elapsed();
398     qDebug()<<"paint event on "<<ev->region()<<", took to render =  "<<elapsed;
399 #endif
400 }
401
402 /*! \reimp
403 */
404 void QWebView::mouseMoveEvent(QMouseEvent* ev)
405 {
406     d->page->event(ev);
407 }
408
409 /*! \reimp
410 */
411 void QWebView::mousePressEvent(QMouseEvent* ev)
412 {
413     d->page->event(ev);
414 }
415
416 /*! \reimp
417 */
418 void QWebView::mouseDoubleClickEvent(QMouseEvent* ev)
419 {
420     d->page->event(ev);
421 }
422
423 /*! \reimp
424 */
425 void QWebView::mouseReleaseEvent(QMouseEvent* ev)
426 {
427     d->page->event(ev);
428 }
429
430 /*! \reimp
431 */
432 void QWebView::contextMenuEvent(QContextMenuEvent* ev)
433 {
434     d->page->event(ev);
435 }
436
437 /*! \reimp
438 */
439 void QWebView::wheelEvent(QWheelEvent* ev)
440 {
441     d->page->event(ev);
442
443     if (!ev->isAccepted())
444         return QWidget::wheelEvent(ev);
445 }
446
447 /*! \reimp
448 */
449 void QWebView::keyPressEvent(QKeyEvent* ev)
450 {
451     d->page->event(ev);
452 }
453
454 /*! \reimp
455 */
456 void QWebView::keyReleaseEvent(QKeyEvent* ev)
457 {
458     d->page->event(ev);
459 }
460
461 /*! \reimp
462 */
463 void QWebView::focusInEvent(QFocusEvent* ev)
464 {
465     d->page->event(ev);
466     QWidget::focusInEvent(ev);
467 }
468
469 /*! \reimp
470 */
471 void QWebView::focusOutEvent(QFocusEvent* ev)
472 {
473     QWidget::focusOutEvent(ev);
474     d->page->event(ev);
475 }
476
477 /*! \reimp
478 */
479 void QWebView::dragEnterEvent(QDragEnterEvent* ev)
480 {
481     d->page->event(ev);
482 }
483
484 /*! \reimp
485 */
486 void QWebView::dragLeaveEvent(QDragLeaveEvent* ev)
487 {
488     d->page->event(ev);
489 }
490
491 /*! \reimp
492 */
493 void QWebView::dragMoveEvent(QDragMoveEvent* ev)
494 {
495     d->page->event(ev);
496 }
497
498 /*! \reimp
499 */
500 void QWebView::dropEvent(QDropEvent* ev)
501 {
502     d->page->event(ev);
503 }
504
505 /*! \reimp
506 */
507 bool QWebView::focusNextPrevChild(bool next)
508 {
509     return d->page->focusNextPrevChild(next);
510 }
511