annotate demos/browser/webview.d @ 45:71b382c10ef6

add coarse and incomplete QT browser port
author mandel
date Sun, 17 May 2009 18:49:59 +0000
parents
children 7bfd46c330dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1 /****************************************************************************
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
2 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
4 ** Contact: Qt Software Information (qt-info@nokia.com)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
5 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
6 ** This file is part of the demonstration applications of the Qt Toolkit.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
7 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
8 ** $QT_BEGIN_LICENSE:LGPL$
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
9 ** Commercial Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
10 ** Licensees holding valid Qt Commercial licenses may use this file in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
11 ** accordance with the Qt Commercial License Agreement provided with the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
13 ** a written agreement between you and Nokia.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
14 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
15 ** GNU Lesser General Public License Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
17 ** General Public License version 2.1 as published by the Free Software
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
19 ** packaging of this file. Please review the following information to
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
22 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
23 ** In addition, as a special exception, Nokia gives you certain
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
24 ** additional rights. These rights are described in the Nokia Qt LGPL
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
26 ** package.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
27 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
28 ** GNU General Public License Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
29 ** Alternatively, this file may be used under the terms of the GNU
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
30 ** General Public License version 3.0 as published by the Free Software
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
31 ** Foundation and appearing in the file LICENSE.GPL included in the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
32 ** packaging of this file. Please review the following information to
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
33 ** ensure the GNU General Public License version 3.0 requirements will be
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
34 ** met: http://www.gnu.org/copyleft/gpl.html.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
35 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
36 ** If you are unsure which license is appropriate for your use, please
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
37 ** contact the sales department at qt-sales@nokia.com.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
38 ** $QT_END_LICENSE$
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
39 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
40 ****************************************************************************/
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
41
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
42 import QtWebKit.QWebView;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
43
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
44 import browserapplication;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
45 import browsermainwindow;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
46 import cookiejar;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
47 import downloadmanager;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
48 import networkaccessmanager;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
49 import tabwidget;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
50 import webview;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
51
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
52 import QtGui.QClipboard;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
53 import QtGui.QMenu;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
54 import QtGui.QMessageBox;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
55 import QtGui.QMouseEvent;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
56
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
57 import QtWebKit.QWebHitTestResult;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
58
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
59 import QtUiTools.QUiLoader;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
60
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
61 import QtCore.QDebug;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
62 import QtCore.QBuffer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
63
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
64 /*
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
65 QT_BEGIN_NAMESPACE
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
66 class QAuthenticator;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
67 class QMouseEvent;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
68 class QNetworkProxy;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
69 class QNetworkReply;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
70 class QSslError;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
71 QT_END_NAMESPACE
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
72
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
73 class BrowserMainWindow;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
74 */
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
75
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
76 class WebPage : public QWebPage {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
77 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
78
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
79 signals:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
80 void loadingUrl(const QUrl &url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
81
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
82 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
83 this(QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
84 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
85 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
86 m_keyboardModifiers = Qt.NoModifier;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
87 m_pressedButtons = Qt.NoButton;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
88 m_openInNewTab = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
89 setNetworkAccessManager(BrowserApplication::networkAccessManager());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
90 connect(this, SIGNAL(unsupportedContent(QNetworkReply *)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
91 this, SLOT(handleUnsupportedContent(QNetworkReply *)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
92 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
93 BrowserMainWindow *mainWindow()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
94 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
95 QObject *w = this.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
96 while (w) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
97 if (BrowserMainWindow *mw = qobject_cast<BrowserMainWindow*>(w))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
98 return mw;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
99 w = w.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
100 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
101 return BrowserApplication::instance().mainWindow();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
102 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
103
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
104 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
105 bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
106 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
107 // ctrl open in new tab
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
108 // ctrl-shift open in new tab and select
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
109 // ctrl-alt open in new window
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
110 if (type == QWebPage::NavigationTypeLinkClicked
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
111 && (m_keyboardModifiers & Qt.ControlModifier
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
112 || m_pressedButtons == Qt.MidButton)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
113 bool newWindow = (m_keyboardModifiers & Qt.AltModifier);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
114 WebView *webView;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
115 if (newWindow) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
116 BrowserApplication::instance().newMainWindow();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
117 BrowserMainWindow *newMainWindow = BrowserApplication::instance().mainWindow();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
118 webView = newMainWindow.currentTab();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
119 newMainWindow.raise();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
120 newMainWindow.activateWindow();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
121 webView.setFocus();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
122 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
123 bool selectNewTab = (m_keyboardModifiers & Qt.ShiftModifier);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
124 webView = mainWindow().tabWidget().newTab(selectNewTab);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
125 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
126 webView.load(request);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
127 m_keyboardModifiers = Qt.NoModifier;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
128 m_pressedButtons = Qt.NoButton;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
129 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
130 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
131 if (frame == mainFrame()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
132 m_loadingUrl = request.url();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
133 emit loadingUrl(m_loadingUrl);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
134 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
135 return QWebPage::acceptNavigationRequest(frame, request, type);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
136 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
137
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
138 QWebPage *createWindow(QWebPage::WebWindowType type)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
139 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
140 Q_UNUSED(type);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
141 if (m_keyboardModifiers & Qt.ControlModifier || m_pressedButtons == Qt.MidButton)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
142 m_openInNewTab = true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
143 if (m_openInNewTab) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
144 m_openInNewTab = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
145 return mainWindow().tabWidget().newTab().page();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
146 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
147 BrowserApplication::instance().newMainWindow();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
148 BrowserMainWindow *mainWindow = BrowserApplication::instance().mainWindow();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
149 return mainWindow.currentTab().page();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
150 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
151
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
152 version(QT_NO_UITOOLS) {} else
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
153 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
154 QObject *createPlugin(const QString &classId, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
155 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
156 Q_UNUSED(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
157 Q_UNUSED(paramNames);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
158 Q_UNUSED(paramValues);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
159 QUiLoader loader;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
160 return loader.createWidget(classId, view());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
161 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
162 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
163
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
164
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
165
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
166 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
167 void handleUnsupportedContent(QNetworkReply *reply)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
168 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
169 if (reply.error() == QNetworkReply::NoError) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
170 BrowserApplication::downloadManager().handleUnsupportedContent(reply);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
171 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
172 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
173
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
174 QFile file(QLatin1String(":/notfound.html"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
175 bool isOpened = file.open(QIODevice::ReadOnly);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
176 Q_ASSERT(isOpened);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
177 QString title = tr("Error loading page: %1").arg(reply.url().toString());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
178 QString html = QString(QLatin1String(file.readAll()))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
179 .arg(title)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
180 .arg(reply.errorString())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
181 .arg(reply.url().toString());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
182
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
183 QBuffer imageBuffer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
184 imageBuffer.open(QBuffer::ReadWrite);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
185 QIcon icon = view().style().standardIcon(QStyle::SP_MessageBoxWarning, 0, view());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
186 QPixmap pixmap = icon.pixmap(QSize(32,32));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
187 if (pixmap.save(&imageBuffer, "PNG")) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
188 html.replace(QLatin1String("IMAGE_BINARY_DATA_HERE"),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
189 QString(QLatin1String(imageBuffer.buffer().toBase64())));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
190 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
191
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
192 QList<QWebFrame*> frames;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
193 frames.append(mainFrame());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
194 while (!frames.isEmpty()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
195 QWebFrame *frame = frames.takeFirst();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
196 if (frame.url() == reply.url()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
197 frame.setHtml(html, reply.url());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
198 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
199 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
200 QList<QWebFrame *> children = frame.childFrames();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
201 foreach(QWebFrame *frame, children)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
202 frames.append(frame);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
203 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
204 if (m_loadingUrl == reply.url()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
205 mainFrame().setHtml(html, reply.url());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
206 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
207 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
208
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
209 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
210 friend class WebView;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
211
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
212 // set the webview mousepressedevent
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
213 Qt.KeyboardModifiers m_keyboardModifiers;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
214 Qt.MouseButtons m_pressedButtons;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
215 bool m_openInNewTab;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
216 QUrl m_loadingUrl;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
217 };
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
218
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
219 class WebView : public QWebView {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
220 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
221
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
222 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
223 WebView(QWidget *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
224 : QWebView(parent)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
225 , m_progress(0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
226 , m_page(new WebPage(this))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
227 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
228 setPage(m_page);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
229 connect(page(), SIGNAL(statusBarMessage(const QString&)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
230 SLOT(setStatusBarText(const QString&)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
231 connect(this, SIGNAL(loadProgress(int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
232 this, SLOT(setProgress(int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
233 connect(this, SIGNAL(loadFinished(bool)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
234 this, SLOT(loadFinished()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
235 connect(page(), SIGNAL(loadingUrl(const QUrl&)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
236 this, SIGNAL(urlChanged(const QUrl &)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
237 connect(page(), SIGNAL(downloadRequested(const QNetworkRequest &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
238 this, SLOT(downloadRequested(const QNetworkRequest &)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
239 page().setForwardUnsupportedContent(true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
240
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
241 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
242
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
243 WebPage *webPage() const { return m_page; }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
244
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
245 void loadUrl(const QUrl &url)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
246 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
247 m_initialUrl = url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
248 load(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
249 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
250
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
251 QUrl url() const
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
252 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
253 QUrl url = QWebView::url();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
254 if (!url.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
255 return url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
256
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
257 return m_initialUrl;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
258 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
259
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
260 QString lastStatusBarText() const
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
261 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
262 return m_statusBarText;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
263 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
264
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
265 inline int progress() const { return m_progress; }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
266
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
267 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
268 void mousePressEvent(QMouseEvent *event);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
269 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
270 m_page.m_pressedButtons = event.buttons();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
271 m_page.m_keyboardModifiers = event.modifiers();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
272 QWebView::mousePressEvent(event);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
273 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
274
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
275 void mouseReleaseEvent(QMouseEvent *event)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
276 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
277 QWebView::mouseReleaseEvent(event);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
278 if (!event.isAccepted() && (m_page.m_pressedButtons & Qt.MidButton)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
279 QUrl url(QApplication::clipboard().text(QClipboard::Selection));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
280 if (!url.isEmpty() && url.isValid() && !url.scheme().isEmpty()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
281 setUrl(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
282 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
283 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
284 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
285
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
286 void contextMenuEvent(QContextMenuEvent *event)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
287 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
288 QWebHitTestResult r = page().mainFrame().hitTestContent(event.pos());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
289 if (!r.linkUrl().isEmpty()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
290 QMenu menu(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
291 menu.addAction(pageAction(QWebPage::OpenLinkInNewWindow));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
292 menu.addAction(tr("Open in New Tab"), this, SLOT(openLinkInNewTab()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
293 menu.addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
294 menu.addAction(pageAction(QWebPage::DownloadLinkToDisk));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
295 // Add link to bookmarks...
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
296 menu.addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
297 menu.addAction(pageAction(QWebPage::CopyLinkToClipboard));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
298 if (page().settings().testAttribute(QWebSettings::DeveloperExtrasEnabled))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
299 menu.addAction(pageAction(QWebPage::InspectElement));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
300 menu.exec(mapToGlobal(event.pos()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
301 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
302 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
303 QWebView::contextMenuEvent(event);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
304 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
305
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
306 void wheelEvent(QWheelEvent *event)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
307 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
308 if (QApplication::keyboardModifiers() & Qt.ControlModifier) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
309 int numDegrees = event.delta() / 8;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
310 int numSteps = numDegrees / 15;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
311 setTextSizeMultiplier(textSizeMultiplier() + numSteps * 0.1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
312 event.accept();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
313 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
314 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
315 QWebView::wheelEvent(event);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
316 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
317
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
318
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
319 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
320 void setProgress(int progress)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
321 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
322 m_progress = progress;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
323 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
324
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
325 void loadFinished()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
326 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
327 if (100 != m_progress) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
328 qWarning() << "Recieved finished signal while progress is still:" << progress()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
329 << "Url:" << url();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
330 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
331 m_progress = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
332 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
333
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
334 void setStatusBarText(const QString &string)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
335 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
336 m_statusBarText = string;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
337 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
338
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
339 void downloadRequested(const QNetworkRequest &request)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
340 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
341 BrowserApplication::downloadManager().download(request);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
342 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
343
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
344 void openLinkInNewTab()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
345 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
346 m_page.m_openInNewTab = true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
347 pageAction(QWebPage::OpenLinkInNewWindow).trigger();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
348 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
349 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
350 QString m_statusBarText;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
351 QUrl m_initialUrl;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
352 int m_progress;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
353 WebPage *m_page;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
354 }