• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
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 "qwebinspector.h"
22 
23 #include "Element.h"
24 #include "InspectorController.h"
25 #include "qwebelement.h"
26 #include "qwebinspector_p.h"
27 #include "qwebpage_p.h"
28 
29 #include <QResizeEvent>
30 
31 /*!
32     \class QWebInspector
33     \since 4.6
34     \inmodule QtWebKit
35     \brief The QWebInspector class allows the placement and control of a
36     QWebPage's inspector.
37     The inspector can display a page's hierarchy, its loading statistics and
38     the current state of its individual elements. It is mostly used by web
39     developers.
40 
41     The QWebPage to be inspected must be specified using the setPage() method.
42 
43     A typical use of QWebInspector follows:
44 
45     \snippet webkitsnippets/qtwebkit_qwebinspector_snippet.cpp 0
46 
47     A QWebInspector can be made visible either programmatically using
48     setVisible(), or by the user through the attached QWebPage's context
49     menu.
50 
51     \note A QWebInspector will display a blank widget if either:
52     \list
53         \o page() is null
54         \o QWebSettings::DeveloperExtrasEnabled is false
55     \endlist
56 
57     \section1 Resources
58 
59     This class acts mostly as a container and a controller for the inspector.
60     Most of the resources needed by the inspector are owned by the associated
61     QWebPage and are allocated the first time that:
62     \list
63         \o an element is inspected
64         \o the QWebInspector is shown.
65     \endlist
66 
67     \section1 Inspector configuration persistence
68 
69     The inspector allows the user to configure some options through its
70     user interface (e.g. the resource tracking "Always enable" option).
71     These settings will be persisted automatically by QtWebKit only if
72     your application previously called QCoreApplication::setOrganizationName()
73     and QCoreApplication::setApplicationName().
74     See QSettings's default constructor documentation for an explanation
75     of why this is necessary.
76 */
77 
78 /*!
79     Constructs an unbound QWebInspector with \a parent as its parent.
80 */
QWebInspector(QWidget * parent)81 QWebInspector::QWebInspector(QWidget* parent)
82     : QWidget(parent)
83     , d(new QWebInspectorPrivate(this))
84 {
85 }
86 
87 /*!
88     Destroys the inspector.
89 */
~QWebInspector()90 QWebInspector::~QWebInspector()
91 {
92     // Remove association principally to prevent deleting a child frontend
93     setPage(0);
94     delete d;
95     d = 0;
96 }
97 
98 /*!
99     Bind this inspector to the QWebPage to be inspected.
100 
101     \bold {Notes:}
102     \list
103         \o There can only be one QWebInspector associated with a QWebPage
104            and vice versa.
105         \o Calling this method with a null \a page will break the current association, if any.
106         \o If \a page is already associated to another QWebInspector, the association
107            will be replaced and the previous QWebInspector will become unbound
108     \endlist
109 
110     \sa page()
111 */
setPage(QWebPage * page)112 void QWebInspector::setPage(QWebPage* page)
113 {
114     if (d->page) {
115         // Break currentPage-->this
116         d->page->d->setInspector(0);
117     }
118     if (page && page->d->inspector && page->d->inspector != this) {
119         // Break newPage<->newPageCurrentInspector
120         page->d->inspector->setPage(0);
121     }
122 
123     d->page = page;
124 
125     if (page) {
126         // Setup the reciprocal association
127         page->d->setInspector(this);
128     }
129 }
130 
131 /*!
132     Returns the inspected QWebPage.
133     If no web page is currently associated, a null pointer is returned.
134 */
page() const135 QWebPage* QWebInspector::page() const
136 {
137     return d->page;
138 }
139 
140 /*! \reimp */
sizeHint() const141 QSize QWebInspector::sizeHint() const
142 {
143     return QSize(450, 300);
144 }
145 
146 /*! \reimp */
event(QEvent * ev)147 bool QWebInspector::event(QEvent* ev)
148 {
149     return QWidget::event(ev);
150 }
151 
152 /*! \reimp */
resizeEvent(QResizeEvent * event)153 void QWebInspector::resizeEvent(QResizeEvent* event)
154 {
155     d->adjustFrontendSize(event->size());
156 }
157 
158 /*! \reimp */
showEvent(QShowEvent * event)159 void QWebInspector::showEvent(QShowEvent* event)
160 {
161 #if ENABLE(INSPECTOR)
162     // Allows QWebInspector::show() to init the inspector.
163     if (d->page)
164         d->page->d->inspectorController()->show();
165 #endif
166 }
167 
168 /*! \reimp */
hideEvent(QHideEvent * event)169 void QWebInspector::hideEvent(QHideEvent* event)
170 {
171 #if ENABLE(INSPECTOR)
172     if (d->page)
173         d->page->d->inspectorController()->close();
174 #endif
175 }
176 
177 /*! \reimp */
closeEvent(QCloseEvent * event)178 void QWebInspector::closeEvent(QCloseEvent* event)
179 {
180 #if ENABLE(INSPECTOR)
181     if (d->page)
182         d->page->d->inspectorController()->close();
183 #endif
184 }
185 
186 /*! \internal */
setFrontend(QWidget * newFrontend)187 void QWebInspectorPrivate::setFrontend(QWidget* newFrontend)
188 {
189     if (frontend)
190         frontend->setParent(0);
191 
192     frontend = newFrontend;
193 
194     if (frontend) {
195         frontend->setParent(q);
196         frontend->show();
197         adjustFrontendSize(q->size());
198     }
199 }
200 
201 /*!
202  * \internal
203  */
attachAndReplaceRemoteFrontend(QObject * newRemoteFrontend)204 void QWebInspectorPrivate::attachAndReplaceRemoteFrontend(QObject* newRemoteFrontend)
205 {
206     if (remoteFrontend)
207         remoteFrontend->setParent(0);
208 
209     remoteFrontend = newRemoteFrontend;
210 
211     if (remoteFrontend)
212         remoteFrontend->setParent(q);
213 }
214 
215 /*!
216  * \internal
217  */
detachRemoteFrontend()218 void QWebInspectorPrivate::detachRemoteFrontend()
219 {
220     if (remoteFrontend) {
221         remoteFrontend->deleteLater();
222         remoteFrontend = 0;
223     }
224 }
225 
adjustFrontendSize(const QSize & size)226 void QWebInspectorPrivate::adjustFrontendSize(const QSize& size)
227 {
228     if (frontend)
229         frontend->resize(size);
230 }
231 
232