fix a crash on exit
[WebKit-https.git] / WebKitQt / Api / qwebpage.cpp
1 /*
2     Copyright (C) 2007 Trolltech ASA
3     Copyright (C) 2007 Staikos Computing Services Inc.
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18     Boston, MA 02111-1307, USA.
19
20     This class provides all functionality needed for loading images, style sheets and html
21     pages from the web. It has a memory cache for these objects.
22 */
23
24 #include "qwebpage.h"
25 #include "qwebframe.h"
26 #include "qwebpage_p.h"
27 #include "qwebframe_p.h"
28 #include "qwebpagehistory.h"
29 #include "qwebpagehistory_p.h"
30
31 #include "FrameQt.h"
32 #include "ChromeClientQt.h"
33 #include "ContextMenuClientQt.h"
34 #include "DragClientQt.h"
35 #include "EditorClientQt.h"
36 #include "Settings.h"
37 #include "Page.h"
38 #include "FrameLoader.h"
39 #include "KURL.h"
40
41 #include <QDebug>
42 #include <QUrl>
43 #include <QVBoxLayout>
44
45 using namespace WebCore;
46
47 QWebPagePrivate::QWebPagePrivate(QWebPage *qq)
48     : q(qq)
49 {
50     chromeClient = new ChromeClientQt(q);
51     contextMenuClient = new ContextMenuClientQt();
52     editorClient = new EditorClientQt();
53     page = new Page(chromeClient, contextMenuClient, editorClient,
54                     new DragClientQt());
55
56     Settings *settings = page->settings();
57     settings->setLoadsImagesAutomatically(true);
58     settings->setMinimumFontSize(5);
59     settings->setMinimumLogicalFontSize(5);
60     settings->setShouldPrintBackgrounds(true);
61     settings->setJavaScriptEnabled(true);
62
63     settings->setDefaultFixedFontSize(14);
64     settings->setDefaultFontSize(14);
65     settings->setSerifFontFamily("Times New Roman");
66     settings->setSansSerifFontFamily("Arial");
67     settings->setFixedFontFamily("Courier");
68     settings->setStandardFontFamily("Arial");
69
70     mainFrame = 0;
71 }
72
73 QWebPagePrivate::~QWebPagePrivate()
74 {
75     delete page;
76 }
77
78 void QWebPagePrivate::createMainFrame()
79 {
80     if (!mainFrame) {
81         QWebFrameData frameData;
82         frameData.ownerElement = 0;
83         frameData.allowsScrolling = true;
84         frameData.marginWidth = 0;
85         frameData.marginHeight = 0;
86         mainFrame = q->createFrame(0, &frameData);
87         layout->addWidget(mainFrame);
88     }
89 }
90
91
92 QWebPage::QWebPage(QWidget *parent)
93     : QWidget(parent)
94     , d(new QWebPagePrivate(this))
95 {
96     d->layout = new QVBoxLayout(this);
97     d->layout->setMargin(0);
98     d->layout->setSpacing(0);
99 }
100
101 QWebPage::~QWebPage()
102 {
103     FrameLoader *loader = d->mainFrame->d->frame->loader();
104     if (loader)
105         loader->detachFromParent();
106     delete d;
107 }
108
109 QWebFrame *QWebPage::createFrame(QWebFrame *parentFrame, QWebFrameData *frameData)
110 {
111     if (parentFrame)
112         return new QWebFrame(parentFrame, frameData);
113     QWebFrame *f = new QWebFrame(this, frameData);
114     connect(f, SIGNAL(titleChanged(const QString&)), this, SIGNAL(titleChanged(const QString&)));
115     return f;
116 }
117
118 void QWebPage::open(const QUrl &url)
119 {
120     mainFrame()->d->frame->loader()->load(KURL(url.toString()));
121 }
122
123 QUrl QWebPage::url() const
124 {
125     return QUrl((QString)mainFrame()->d->frame->loader()->url().url());
126 }
127
128 QString QWebPage::title() const
129 {
130     return mainFrame()->title();
131 }
132
133 QWebFrame *QWebPage::mainFrame() const
134 {
135     d->createMainFrame();
136     return d->mainFrame;
137 }
138
139 QSize QWebPage::sizeHint() const
140 {
141     return QSize(800, 600);
142 }
143
144 void QWebPage::stop()
145 {
146     FrameLoader *f = mainFrame()->d->frame->loader();
147     f->cancelMainResourceLoad();
148     f->stopAllLoaders();
149 }
150
151 QWebPageHistory QWebPage::history() const
152 {
153     WebCore::BackForwardList *lst = d->page->backForwardList();
154     QWebPageHistoryPrivate *priv = new QWebPageHistoryPrivate(lst);
155     return QWebPageHistory(priv);
156 }
157
158 void QWebPage::goBack()
159 {
160     d->page->goBack();
161 }
162
163 void QWebPage::goForward()
164 {
165     d->page->goForward();
166 }
167
168 void QWebPage::goToHistoryItem(const QWebHistoryItem &item)
169 {
170     d->page->goToItem(item.d->item, FrameLoadTypeIndexedBackForward);
171 }
172
173 void QWebPage::javaScriptConsoleMessage(const QString& message, unsigned int lineNumber, const QString& sourceID)
174 {
175 }
176
177 void QWebPage::statusTextChanged(const QString& text)
178 {
179 }
180
181 void QWebPage::runJavaScriptAlert(QWebFrame *frame, const QString& msg)
182 {
183 }
184
185 QWebPage *QWebPage::createWindow()
186 {
187     return 0;
188 }
189
190 void QWebPage::setWindowGeometry(const QRect& geom)
191 {
192     Q_UNUSED(geom)
193 }
194
195 #include "qwebpage.moc"