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