diff --git a/examples/webengine/quicknanobrowser/BrowserWindow.qml b/examples/webengine/quicknanobrowser/BrowserWindow.qml index 0b87727918ccbec53475515606cc4f4036d27d38..df13f99b9f6c68042e5823522f258f6d3e03f6ef 100644 --- a/examples/webengine/quicknanobrowser/BrowserWindow.qml +++ b/examples/webengine/quicknanobrowser/BrowserWindow.qml @@ -46,6 +46,7 @@ import QtQuick.Layouts 1.0 import QtQuick.Window 2.1 import QtQuick.Controls.Private 1.0 import QtQuick.Dialogs 1.2 +import Qt.labs.settings 1.0 ApplicationWindow { id: browserWindow @@ -62,6 +63,34 @@ ApplicationWindow { StyleItem { id: styleItem } property bool platformIsMac: styleItem.style == "mac" + Settings { + property alias autoLoadImages: loadImages.checked; + property alias javaScriptEnabled: javaScriptEnabled.checked; + property alias errorPageEnabled: errorPageEnabled.checked; + } + + WebEngineProfile { + id: defaultProfile + storageName: "Default" + httpCacheType: httpDiskCacheEnabled.checked ? WebEngineProfile.DiskHttpCache : WebEngineProfile.MemoryHttpCache; + onDownloadRequested: { + downloadView.visible = true + downloadView.append(download) + download.accept() + } + } + + WebEngineProfile { + id: otrProfile + offTheRecord: true + } + + Action { + shortcut: "Ctrl+D" + onTriggered: { + downloadView.visible = !downloadView.visible + } + } Action { id: focus shortcut: "Ctrl+L" @@ -151,6 +180,44 @@ ApplicationWindow { text: currentWebView && currentWebView.url onAccepted: currentWebView.url = utils.fromUserInput(text) } + ToolButton { + id: settingsMenuButton + menu: Menu { + MenuItem { + id: loadImages + text: "Autoload images" + checkable: true + checked: WebEngine.settings.autoLoadImages + onCheckedChanged: WebEngine.settings.autoLoadImages = checked + } + MenuItem { + id: javaScriptEnabled + text: "JavaScript On" + checkable: true + checked: WebEngine.settings.javascriptEnabled + onCheckedChanged: WebEngine.settings.javascriptEnabled = checked + } + MenuItem { + id: errorPageEnabled + text: "ErrorPage On" + checkable: true + checked: WebEngine.settings.errorPageEnabled + onCheckedChanged: WebEngine.settings.errorPageEnabled = checked + } + MenuItem { + id: offTheRecordEnabled + text: "Off The Record" + checkable: true + checked: false + } + MenuItem { + id: httpDiskCacheEnabled + text: "HTTP Disk Cache" + checkable: true + checked: (defaultProfile.httpCacheType == WebEngineProfile.DiskHttpCache) + } + } + } } ProgressBar { id: progressBar @@ -190,6 +257,7 @@ ApplicationWindow { WebEngineView { id: webEngineView focus: true + profile: offTheRecordEnabled.checked ? otrProfile : defaultProfile onLinkHovered: { if (hoveredUrl == "") @@ -236,6 +304,11 @@ ApplicationWindow { onAccepted: certError.ignoreCertificateError() onRejected: certError.rejectCertificate() } + DownloadView { + id: downloadView + visible: false + anchors.fill: parent + } Rectangle { id: statusBubble color: "oldlace" diff --git a/examples/webengine/quicknanobrowser/DownloadView.qml b/examples/webengine/quicknanobrowser/DownloadView.qml new file mode 100644 index 0000000000000000000000000000000000000000..763c02cd45e631bea3340e0cfabea1fdbf36732a --- /dev/null +++ b/examples/webengine/quicknanobrowser/DownloadView.qml @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 +import QtWebEngine 1.0 +import QtQuick.Layouts 1.0 + +Rectangle { + id: downloadView + color: "lightgray" + + ListModel { + id: downloadModel + property var downloads: [] + } + + function append(download) { + downloadModel.append(download) + downloadModel.downloads.push(download) + } + + Component { + id: downloadItemDelegate + + Rectangle { + width: listView.width + height: childrenRect.height + anchors.margins: 10 + radius: 3 + color: "transparent" + border.color: "black" + Rectangle { + id: progressBar + + property real progress: downloadModel.downloads[index] + ? downloadModel.downloads[index].receivedBytes / downloadModel.downloads[index].totalBytes : 0 + + radius: 3 + color: width == listView.width ? "green" : "#2b74c7" + width: listView.width * progress + height: cancelButton.height + + Behavior on width { + SmoothedAnimation { duration: 100 } + } + } + Rectangle { + anchors { + left: parent.left + right: parent.right + leftMargin: 20 + } + Label { + id: label + text: path + anchors { + verticalCenter: cancelButton.verticalCenter + left: parent.left + right: cancelButton.left + } + } + Button { + id: cancelButton + anchors.right: parent.right + iconSource: "icons/process-stop.png" + onClicked: { + var download = downloadModel.downloads[index] + + download.cancel() + + downloadModel.downloads = downloadModel.downloads.filter(function (el) { + return el.id !== download.id; + }); + downloadModel.remove(index) + } + } + } + } + + } + ListView { + id: listView + anchors { + topMargin: 10 + top: parent.top + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + width: parent.width - 20 + spacing: 5 + + model: downloadModel + delegate: downloadItemDelegate + + Text { + visible: !listView.count + horizontalAlignment: Text.AlignHCenter + height: 30 + anchors { + top: parent.top + left: parent.left + right: parent.right + } + font.pixelSize: 20 + text: "No active downloads." + } + + Rectangle { + color: "gray" + anchors { + bottom: parent.bottom + left: parent.left + right: parent.right + } + height: 30 + Button { + id: okButton + text: "OK" + anchors.centerIn: parent + onClicked: { + downloadView.visible = false + } + } + } + } +} diff --git a/examples/webengine/quicknanobrowser/quicknanobrowser.pro b/examples/webengine/quicknanobrowser/quicknanobrowser.pro index b6bc2e0db17418d2ef5758b2fe54ce288e570913..1447af92777ebbc6f10463e5355ece59470b5300 100644 --- a/examples/webengine/quicknanobrowser/quicknanobrowser.pro +++ b/examples/webengine/quicknanobrowser/quicknanobrowser.pro @@ -8,7 +8,8 @@ SOURCES = main.cpp OTHER_FILES += ApplicationRoot.qml \ BrowserDialog.qml \ - BrowserWindow.qml + BrowserWindow.qml \ + DownloadView.qml RESOURCES += resources.qrc diff --git a/examples/webengine/quicknanobrowser/resources.qrc b/examples/webengine/quicknanobrowser/resources.qrc index 2c1aea802b43450475d651c723884eded0cb00b9..28fd7b7dc2d9afc7ceee7e223906514750e9bb0c 100644 --- a/examples/webengine/quicknanobrowser/resources.qrc +++ b/examples/webengine/quicknanobrowser/resources.qrc @@ -3,6 +3,7 @@ <file>ApplicationRoot.qml</file> <file>BrowserDialog.qml</file> <file>BrowserWindow.qml</file> + <file>DownloadView.qml</file> </qresource> <qresource prefix="icons"> <file alias="go-next.png">icons/go-next.png</file> diff --git a/src/webengine/plugin/experimental/plugin.cpp b/src/webengine/plugin/experimental/plugin.cpp index cd38f744cee003c30df0103e2ed62d841ad4e0c2..4d00a4d3dd6ab5c1ddedc189c88d5fc0279f5f14 100644 --- a/src/webengine/plugin/experimental/plugin.cpp +++ b/src/webengine/plugin/experimental/plugin.cpp @@ -36,19 +36,12 @@ #include <QtQml/qqmlextensionplugin.h> -#include "qquickwebenginedownloaditem_p.h" #include "qquickwebenginehistory_p.h" -#include "qquickwebenginesingleton_p.h" #include "qquickwebengineview_p.h" #include "qquickwebengineview_p_p.h" QT_BEGIN_NAMESPACE -static QObject *webEngineSingletonProvider(QQmlEngine *, QJSEngine *) -{ - return new QQuickWebEngineSingleton; -} - class QQuickWebEngineViewExperimentalExtension : public QObject { Q_OBJECT Q_PROPERTY(QQuickWebEngineViewExperimental* experimental READ experimental CONSTANT FINAL) @@ -78,9 +71,6 @@ public: QObject::tr("Cannot create a separate instance of NavigationHistory")); qmlRegisterUncreatableType<QQuickWebEngineHistoryListModel>(uri, 1, 0, "NavigationHistoryListModel", QObject::tr("Cannot create a separate instance of NavigationHistory")); - qmlRegisterUncreatableType<QQuickWebEngineDownloadItem>(uri, 1, 0, "WebEngineDownloadItem", - QObject::tr("Cannot create a separate instance of WebEngineDownloadItem")); - qmlRegisterSingletonType<QQuickWebEngineSingleton>(uri, 1, 0, "WebEngine", webEngineSingletonProvider); // Use the latest revision of QQuickWebEngineView when importing QtWebEngine.experimental 1.0 qmlRegisterRevision<QQuickWebEngineView, 1>(uri, 1, 0); diff --git a/src/webengine/plugin/plugin.cpp b/src/webengine/plugin/plugin.cpp index 1a74741327000e8afe0cf1736ee961fd82bca562..b6ac8407c6119694dbee413f5a46548d16c11882 100644 --- a/src/webengine/plugin/plugin.cpp +++ b/src/webengine/plugin/plugin.cpp @@ -37,19 +37,22 @@ #include <QtQml/qqmlextensionplugin.h> #include "qquickwebenginecertificateerror_p.h" +#include "qquickwebenginedownloaditem_p.h" #include "qquickwebengineloadrequest_p.h" #include "qquickwebenginenavigationrequest_p.h" #include "qquickwebenginenewviewrequest_p.h" #include "qquickwebengineprofile_p.h" #include "qquickwebenginesettings_p.h" +#include "qquickwebenginesingleton_p.h" #include "qquickwebengineview_p.h" #include "qtwebengineversion.h" QT_BEGIN_NAMESPACE -class QQuickWebEngineVersionBumper : public QObject { - Q_OBJECT -}; +static QObject *webEngineSingletonProvider(QQmlEngine *, QJSEngine *) +{ + return new QQuickWebEngineSingleton; +} class QtWebEnginePlugin : public QQmlExtensionPlugin { @@ -67,8 +70,11 @@ public: qmlRegisterType<QQuickWebEngineView, 1>(uri, 1, 1, "WebEngineView"); qmlRegisterType<QQuickWebEngineProfile>(uri, 1, 1, "WebEngineProfile"); qmlRegisterUncreatableType<QQuickWebEngineCertificateError>(uri, 1, 1, "WebEngineCertificateError", QObject::tr("Cannot create separate instance of WebEngineCertificateError")); + qmlRegisterUncreatableType<QQuickWebEngineDownloadItem>(uri, 1, 1, "WebEngineDownloadItem", + QObject::tr("Cannot create a separate instance of WebEngineDownloadItem")); qmlRegisterUncreatableType<QQuickWebEngineNewViewRequest>(uri, 1, 1, "WebEngineNewViewRequest", QObject::tr("Cannot create separate instance of WebEngineNewViewRequest")); qmlRegisterUncreatableType<QQuickWebEngineSettings>(uri, 1, 1, "WebEngineSettings", QObject::tr("Cannot create a separate instance of WebEngineSettings")); + qmlRegisterSingletonType<QQuickWebEngineSingleton>(uri, 1, 1, "WebEngine", webEngineSingletonProvider); } };