Source/WebKit2/ChangeLog

 1 2011-10-20 Zeno Albisser <zeno.albisser@nokia.com>
 2
 3 [Qt][WK2] Rewrite MiniBrowser in QML
 4 https://bugs.webkit.org/show_bug.cgi?id=70315
 5
 6 Add a first QML based implementation of MiniBrowser.
 7
 8 Patch by Jocelyn Turcotte <jocelyn.turcotte@nokia.com>,
 9 Zeno Albisser <zeno.albisser@nokia.com>
 10
 11 Need a short description and bug URL (OOPS!)
 12
 13 Reviewed by NOBODY (OOPS!).
 14
 15 * UIProcess/API/qt/qdesktopwebview.cpp:
 16 (QDesktopWebView::mousePressEvent):
 17
1182011-10-20 Zeno Albisser <zeno.albisser@nokia.com>
219
320

Source/WebKit2/UIProcess/API/qt/qdesktopwebview.cpp

@@void QDesktopWebView::focusOutEvent(QFocusEvent* event)
331331
332332void QDesktopWebView::mousePressEvent(QMouseEvent* event)
333333{
 334 forceActiveFocus();
334335 this->event(event);
335336}
336337

Tools/ChangeLog

 1 2011-10-20 Zeno Albisser <zeno.albisser@nokia.com>
 2
 3 [Qt][WK2] Rewrite MiniBrowser in QML
 4 https://bugs.webkit.org/show_bug.cgi?id=70315
 5
 6
 7 Add a first QML based implementation of MiniBrowser.
 8
 9 Patch by Jocelyn Turcotte <jocelyn.turcotte@nokia.com>,
 10 Zeno Albisser <zeno.albisser@nokia.com>
 11
 12 Reviewed by NOBODY (OOPS!).
 13
 14 * MiniBrowser/qt/BrowserWindow.cpp:
 15 (BrowserWindow::BrowserWindow):
 16 (BrowserWindow::webView):
 17 (BrowserWindow::load):
 18 (BrowserWindow::keyPressEvent):
 19 (BrowserWindow::~BrowserWindow):
 20 * MiniBrowser/qt/BrowserWindow.h:
 21 * MiniBrowser/qt/MiniBrowser.pro:
 22 * MiniBrowser/qt/MiniBrowser.qrc:
 23 * MiniBrowser/qt/MiniBrowserApplication.cpp:
 24 (MiniBrowserApplication::MiniBrowserApplication):
 25 (MiniBrowserApplication::handleUserOptions):
 26 * MiniBrowser/qt/MiniBrowserApplication.h:
 27 (WindowOptions::WindowOptions):
 28 * MiniBrowser/qt/UrlLoader.cpp:
 29 (UrlLoader::UrlLoader):
 30 * MiniBrowser/qt/icons/next.png: Added.
 31 * MiniBrowser/qt/icons/previous.png: Added.
 32 * MiniBrowser/qt/icons/refresh.png: Added.
 33 * MiniBrowser/qt/icons/stop.png: Added.
 34 * MiniBrowser/qt/main.cpp:
 35 (main):
 36 * MiniBrowser/qt/qml/BrowserWindow.qml: Added.
 37
1382011-10-20 Zeno Albisser <zeno.albisser@nokia.com>
239
340

Tools/MiniBrowser/qt/BrowserWindow.cpp

2828
2929#include "BrowserWindow.h"
3030
31 #include "UrlLoader.h"
3231#include "qdesktopwebview.h"
3332#include "qtouchwebview.h"
3433#include "qtouchwebpage.h"
3534
 35#include <QtDeclarative/QDeclarativeContext>
 36
 37Q_DECLARE_METATYPE(QDesktopWebView*)
 38Q_DECLARE_METATYPE(QTouchWebView*)
3639
3740BrowserWindow::BrowserWindow(WindowOptions* options)
38  : m_urlLoader(0)
3941{
40  if (options)
41  m_windowOptions = *options;
42  else {
43  WindowOptions tmpOptions;
44  m_windowOptions = tmpOptions;
45  }
 42 setWindowTitle("Just a Title");
 43 setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
 44 setResizeMode(QSGView::SizeRootObjectToView);
 45 setSource(QUrl("qrc:/qml/BrowserWindow.qml"));
4646
47  if (m_windowOptions.startMaximized)
 47 rootObject()->setProperty("printLoadedUrls", options->printLoadedUrls);
 48 connect(rootObject(), SIGNAL(pageTitleChanged(QString)), this, SLOT(setWindowTitle(QString)));
 49 if (options->startMaximized)
4850 setWindowState(Qt::WindowMaximized);
4951 else
5052 resize(800, 600);
5153 show();
5254}
5355
 56QObject* BrowserWindow::webView() const
 57{
 58 QObject* webView = rootObject()->property("webView").value<QDesktopWebView*>();
 59 if (!webView)
 60 webView = rootObject()->property("webView").value<QTouchWebView*>();
 61 return webView;
 62}
 63
5464void BrowserWindow::load(const QString& url)
5565{
 66 QUrl completedUrl = QUrl::fromUserInput(url);
 67 QMetaObject::invokeMethod(rootObject(), "load", Qt::DirectConnection, Q_ARG(QVariant, completedUrl));
5668}
5769
5870BrowserWindow* BrowserWindow::newWindow(const QString& url)

@@void BrowserWindow::screenshot()
6678{
6779}
6880
69 void BrowserWindow::loadURLListFromFile()
 81void BrowserWindow::keyPressEvent(QKeyEvent *event)
7082{
 83 if ((event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_L)
 84 || event->key() == Qt::Key_F6) {
 85 QMetaObject::invokeMethod(rootObject(), "setFocusToAddressBar", Qt::DirectConnection);
 86 event->accept();
 87 } else
 88 QSGView::keyPressEvent(event);
7189}
7290
7391void BrowserWindow::updateUserAgentList()

@@void BrowserWindow::updateUserAgentList()
7694
7795BrowserWindow::~BrowserWindow()
7896{
79  delete m_urlLoader;
8097}

Tools/MiniBrowser/qt/BrowserWindow.h

3131
3232#include "MiniBrowserApplication.h"
3333#include <QStringList>
34 #include <QTimer>
3534#include <QtDeclarative/QSGView>
3635
37 class UrlLoader;
38 
3936class BrowserWindow : public QSGView {
4037 Q_OBJECT
4138

@@public slots:
5148protected slots:
5249 void screenshot();
5350
54  void loadURLListFromFile();
 51protected:
 52 virtual void keyPressEvent(QKeyEvent *);
5553
5654private:
5755 void updateUserAgentList();
58 
59  UrlLoader* m_urlLoader;
60  WindowOptions m_windowOptions;
6156 QStringList m_userAgentList;
6257};
6358

Tools/MiniBrowser/qt/MiniBrowser.pro

@@DEFINES -= QT_ASCII_CAST_WARNINGS
4848
4949# Use the MiniBrowser.qrc file from the sources.
5050RESOURCES += MiniBrowser.qrc
 51
 52OTHER_FILES += \
 53 qml/BrowserWindow.qml

Tools/MiniBrowser/qt/MiniBrowser.qrc

11<RCC>
22 <qresource prefix="/">
 3 <file>icons/next.png</file>
 4 <file>icons/previous.png</file>
 5 <file>icons/refresh.png</file>
 6 <file>icons/stop.png</file>
 7 <file>qml/BrowserWindow.qml</file>
38 <file>useragentlist.txt</file>
49 </qresource>
510</RCC>

Tools/MiniBrowser/qt/MiniBrowserApplication.cpp

2828
2929#include "MiniBrowserApplication.h"
3030
 31#include "qdesktopwebview.h"
 32#include "qtouchwebview.h"
 33#include "qwebnavigationcontroller.h"
3134#include "utils.h"
3235#include <QRegExp>
3336#include <QEvent>

@@MiniBrowserApplication::MiniBrowserApplication(int& argc, char** argv)
7073 setApplicationName("QtMiniBrowser");
7174 setApplicationVersion("0.1");
7275
 76 qmlRegisterType<QWebNavigationController>();
7377 handleUserOptions();
7478}
7579

@@void MiniBrowserApplication::handleUserOptions()
136140 << "[-r list]"
137141 << "[-robot-timeout seconds]"
138142 << "[-robot-extra-time seconds]"
139  << "[-chunked-drawing-area]"
140143 << "[-print-loaded-urls]"
141 #if defined(QT_CONFIGURED_WITH_OPENGL)
142  << "[-gl-viewport]"
143 #endif
144144 << "URLs";
145145 appQuit(0);
146146 }
147147
148  if (args.contains("-touch"))
 148 if (args.contains("-touch")) {
149149 m_windowOptions.useTouchWebView = true;
 150 qmlRegisterType<QTouchWebView>("QtQuick", 2, 0, "BrowserView");
 151 } else
 152 qmlRegisterType<QDesktopWebView>("QtQuick", 2, 0, "BrowserView");
150153
151154 if (args.contains("-maximize"))
152155 m_windowOptions.startMaximized = true;

@@void MiniBrowserApplication::handleUserOptions()
176179
177180 if (args.contains("-print-loaded-urls"))
178181 m_windowOptions.printLoadedUrls = true;
179 
180 #if defined(QT_CONFIGURED_WITH_OPENGL)
181  if (args.contains("-gl-viewport"))
182  m_windowOptions.useQGLWidgetViewport = true;
183 #endif
184182}

Tools/MiniBrowser/qt/MiniBrowserApplication.h

@@struct WindowOptions {
4141 : printLoadedUrls(false)
4242 , useTouchWebView(false)
4343 , startMaximized(false)
44 #if defined(QT_CONFIGURED_WITH_OPENGL)
45  , useQGLWidgetViewport(false)
46 #endif
4744 {
4845 }
4946
5047 bool printLoadedUrls;
5148 bool useTouchWebView;
5249 bool startMaximized;
53 #if defined(QT_CONFIGURED_WITH_OPENGL)
54  bool useQGLWidgetViewport;
55 #endif
5650};
5751
5852class MiniBrowserApplication : public QGuiApplication {

Tools/MiniBrowser/qt/UrlLoader.cpp

@@UrlLoader::UrlLoader(BrowserWindow* browserWindow, const QString& inputFileName,
4141 m_checkIfFinishedTimer.setSingleShot(true);
4242 connect(&m_checkIfFinishedTimer, SIGNAL(timeout()), this, SLOT(checkIfFinished()));
4343 // loadStarted and loadFinished on QWebPage is emitted for each frame/sub-frame
44 
45  // FIXME: Reconnect this signals after Qt5/QtQuick rewrite if necessary.
46  // connect(m_browserWindow->webView(), SIGNAL(loadStarted()), this, SLOT(frameLoadStarted()));
47  // connect(m_browserWindow->webView(), SIGNAL(loadFinished(bool)), this, SLOT(frameLoadFinished()));
 44 connect(m_browserWindow->webView(), SIGNAL(loadStarted()), this, SLOT(frameLoadStarted()));
 45 connect(m_browserWindow->webView(), SIGNAL(loadSucceeded()), this, SLOT(frameLoadFinished()));
 46 connect(m_browserWindow->webView(), SIGNAL(loadFailed(QDesktopWebView::ErrorType, int, const QUrl&)), this, SLOT(frameLoadFinished()));
4847
4948 if (timeoutSeconds) {
5049 m_timeoutTimer.setInterval(timeoutSeconds * 1000);
5150 m_timeoutTimer.setSingleShot(true);
52  // FIXME: Reconnect this signal after Qt5/QtQuick rewrite if necessary.
53  // connect(m_browserWindow->webView(), SIGNAL(loadStarted()), &m_timeoutTimer, SLOT(start()));
 51 connect(m_browserWindow->webView(), SIGNAL(loadStarted()), &m_timeoutTimer, SLOT(start()));
5452 connect(&m_timeoutTimer, SIGNAL(timeout()), this, SLOT(loadNext()));
5553 }
5654 if (extraTimeSeconds) {

Tools/MiniBrowser/qt/icons/next.png

index 0000000..6f3f65d
Binary files /dev/null and b/Tools/MiniBrowser/qt/icons/next.png differ

Tools/MiniBrowser/qt/icons/previous.png

index 0000000..93be3d1
Binary files /dev/null and b/Tools/MiniBrowser/qt/icons/previous.png differ

Tools/MiniBrowser/qt/icons/refresh.png

index 0000000..cab4d02
Binary files /dev/null and b/Tools/MiniBrowser/qt/icons/refresh.png differ

Tools/MiniBrowser/qt/icons/stop.png

index 0000000..b68290b
Binary files /dev/null and b/Tools/MiniBrowser/qt/icons/stop.png differ

Tools/MiniBrowser/qt/main.cpp

@@int main(int argc, char** argv)
6161
6262 BrowserWindow* window = new BrowserWindow(&app.m_windowOptions);
6363 window->load(urls.at(0));
 64 window->setGeometry(100, 100, 800, 600);
6465
6566 for (int i = 1; i < urls.size(); ++i)
6667 window->newWindow(urls.at(i));

Tools/MiniBrowser/qt/qml/BrowserWindow.qml

 1import QtQuick 2.0
 2
 3
 4Rectangle {
 5 //do not define anchors or a initialisize here! This would messup with QSGViewSizeRootObjetToView.
 6
 7 property bool printLoadedUrls: false
 8 property alias navigation: browserView.navigation
 9 property alias title: browserView.title
 10 property alias webView: browserView
 11
 12 signal pageTitleChanged(string title)
 13
 14 function load(address) {
 15 browserView.load(address)
 16 }
 17
 18 function setFocusToAddressBar() {
 19 addressLine.forceActiveFocus()
 20 addressLine.selectAll()
 21 }
 22
 23 Rectangle {
 24 id: navigationBar
 25 color: "#efefef"
 26 anchors.top: parent.top
 27 anchors.left: parent.left
 28 anchors.right: parent.right
 29 height: 30
 30
 31 Row {
 32 id: controlsRow
 33 spacing: 4
 34 Rectangle {
 35 id: backButton
 36 height: navigationBar.height-2
 37 width: height
 38 color: "#efefef"
 39
 40 Image {
 41 anchors.centerIn: parent
 42 source: "../icons/previous.png"
 43 }
 44
 45 Rectangle {
 46 anchors.fill: parent
 47 color: reloadButton.color
 48 opacity: 0.8
 49 visible: !navigation.canGoBack
 50 }
 51
 52 MouseArea {
 53 anchors.fill: parent
 54 onClicked: {
 55 console.log("going back")
 56 navigation.goBack()
 57 }
 58 }
 59 }
 60 Rectangle {
 61 id: forwardButton
 62 height: navigationBar.height-2
 63 width: height
 64 color: "#efefef"
 65
 66 Image {
 67 anchors.centerIn: parent
 68 source: "../icons/next.png"
 69 }
 70
 71 Rectangle {
 72 anchors.fill: parent
 73 color: forwardButton.color
 74 opacity: 0.8
 75 visible: !navigation.canGoForward
 76 }
 77
 78 MouseArea {
 79 anchors.fill: parent
 80 onClicked: {
 81 console.log("going forward")
 82 navigation.goForward()
 83 }
 84 }
 85 }
 86 Rectangle {
 87 id: reloadButton
 88 height: navigationBar.height-2
 89 width: height
 90 color: "#efefef"
 91
 92 Image {
 93 anchors.centerIn: parent
 94 source: navigation.canStop ? "../icons/stop.png" : "../icons/refresh.png"
 95 }
 96
 97 MouseArea {
 98 anchors.fill: parent
 99 onClicked: {
 100 if (navigation.canStop) {
 101 console.log("stop loading")
 102 navigation.stop()
 103 } else {
 104 console.log("reloading")
 105 navigation.reload()
 106 }
 107 }
 108 }
 109 }
 110 }
 111 Rectangle {
 112 color: "white"
 113 anchors.left: controlsRow.right
 114 anchors.right: parent.right
 115 anchors.margins: 2
 116 anchors.verticalCenter: parent.verticalCenter
 117 height: navigationBar.height-4
 118 border.width: 1
 119 Rectangle {
 120 anchors.top: parent.top
 121 anchors.bottom: parent.bottom
 122 anchors.left: parent.left
 123 width: parent.width/100*browserView.loadProgress
 124 color: "blue"
 125 opacity: 0.3
 126 visible: browserView.loadProgress != 100
 127 }
 128
 129 TextInput {
 130 id: addressLine
 131 anchors.verticalCenter: parent.verticalCenter
 132 anchors.left: parent.left
 133 anchors.right: parent.right
 134 anchors.margins: 2
 135 font.pointSize: 14
 136 font.family: "Helvetica"
 137 clip: true
 138 selectByMouse: true
 139
 140 Keys.onReturnPressed:{
 141 console.log("going to: ", addressLine.text)
 142 browserView.load(addressLine.text)
 143 }
 144 }
 145 }
 146 }
 147
 148 BrowserView {
 149 id: browserView
 150 anchors.top: navigationBar.bottom
 151 anchors.left: parent.left
 152 anchors.right: parent.right
 153 anchors.bottom: parent.bottom
 154
 155 onTitleChanged: {
 156 pageTitleChanged(title)
 157 }
 158
 159 onUrlChanged: {
 160 addressLine.text = url
 161 if (printLoadedUrls)
 162 console.log("Loaded:", url);
 163 forceActiveFocus();
 164 }
 165 }
 166}