mirror of
https://github.com/overte-org/overte.git
synced 2025-06-21 17:20:46 +02:00
moved missed QtWebEngine references to +webengines
This commit is contained in:
parent
54109deab9
commit
d71fb2a100
14 changed files with 208 additions and 531 deletions
108
interface/resources/qml/+webengine/QmlWebWindow.qml
Normal file
108
interface/resources/qml/+webengine/QmlWebWindow.qml
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
//
|
||||||
|
// QmlWebWindow.qml
|
||||||
|
//
|
||||||
|
// Created by Bradley Austin Davis on 17 Dec 2015
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
import QtQuick 2.5
|
||||||
|
import QtWebEngine 1.1
|
||||||
|
import QtWebChannel 1.0
|
||||||
|
|
||||||
|
import "qrc:////qml//windows" as Windows
|
||||||
|
import controlsUit 1.0 as Controls
|
||||||
|
import stylesUit 1.0
|
||||||
|
|
||||||
|
Windows.ScrollingWindow {
|
||||||
|
id: root
|
||||||
|
HifiConstants { id: hifi }
|
||||||
|
title: "WebWindow"
|
||||||
|
resizable: true
|
||||||
|
shown: false
|
||||||
|
// Don't destroy on close... otherwise the JS/C++ will have a dangling pointer
|
||||||
|
destroyOnCloseButton: false
|
||||||
|
property alias source: webview.url
|
||||||
|
property alias scriptUrl: webview.userScriptUrl
|
||||||
|
|
||||||
|
// This is for JS/QML communication, which is unused in a WebWindow,
|
||||||
|
// but not having this here results in spurious warnings about a
|
||||||
|
// missing signal
|
||||||
|
signal sendToScript(var message);
|
||||||
|
|
||||||
|
signal moved(vector2d position);
|
||||||
|
signal resized(size size);
|
||||||
|
|
||||||
|
function notifyMoved() {
|
||||||
|
moved(Qt.vector2d(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifyResized() {
|
||||||
|
resized(Qt.size(width, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
onXChanged: notifyMoved();
|
||||||
|
onYChanged: notifyMoved();
|
||||||
|
|
||||||
|
onWidthChanged: notifyResized();
|
||||||
|
onHeightChanged: notifyResized();
|
||||||
|
|
||||||
|
onShownChanged: {
|
||||||
|
keyboardEnabled = HMD.active;
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: pane.contentWidth
|
||||||
|
implicitHeight: pane.scrollHeight
|
||||||
|
|
||||||
|
Controls.WebView {
|
||||||
|
id: webview
|
||||||
|
url: "about:blank"
|
||||||
|
anchors.fill: parent
|
||||||
|
focus: true
|
||||||
|
profile: HFWebEngineProfile;
|
||||||
|
|
||||||
|
property string userScriptUrl: ""
|
||||||
|
|
||||||
|
// Create a global EventBridge object for raiseAndLowerKeyboard.
|
||||||
|
WebEngineScript {
|
||||||
|
id: createGlobalEventBridge
|
||||||
|
sourceCode: eventBridgeJavaScriptToInject
|
||||||
|
injectionPoint: WebEngineScript.DocumentCreation
|
||||||
|
worldId: WebEngineScript.MainWorld
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect when may want to raise and lower keyboard.
|
||||||
|
WebEngineScript {
|
||||||
|
id: raiseAndLowerKeyboard
|
||||||
|
injectionPoint: WebEngineScript.Deferred
|
||||||
|
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
|
||||||
|
worldId: WebEngineScript.MainWorld
|
||||||
|
}
|
||||||
|
|
||||||
|
// User script.
|
||||||
|
WebEngineScript {
|
||||||
|
id: userScript
|
||||||
|
sourceUrl: webview.userScriptUrl
|
||||||
|
injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished.
|
||||||
|
worldId: WebEngineScript.MainWorld
|
||||||
|
}
|
||||||
|
|
||||||
|
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
|
||||||
|
|
||||||
|
function onWebEventReceived(event) {
|
||||||
|
if (event.slice(0, 17) === "CLARA.IO DOWNLOAD") {
|
||||||
|
ApplicationInterface.addAssetToWorldFromURL(event.slice(18));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
webChannel.registerObject("eventBridge", eventBridge);
|
||||||
|
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
|
||||||
|
eventBridge.webEventReceived.connect(onWebEventReceived);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,8 +9,6 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
import QtQuick 2.5
|
import QtQuick 2.5
|
||||||
import QtWebEngine 1.1
|
|
||||||
import QtWebChannel 1.0
|
|
||||||
|
|
||||||
import "windows" as Windows
|
import "windows" as Windows
|
||||||
import controlsUit 1.0 as Controls
|
import controlsUit 1.0 as Controls
|
||||||
|
@ -62,47 +60,6 @@ Windows.ScrollingWindow {
|
||||||
url: "about:blank"
|
url: "about:blank"
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
focus: true
|
focus: true
|
||||||
profile: HFWebEngineProfile;
|
|
||||||
|
|
||||||
property string userScriptUrl: ""
|
|
||||||
|
|
||||||
// Create a global EventBridge object for raiseAndLowerKeyboard.
|
|
||||||
WebEngineScript {
|
|
||||||
id: createGlobalEventBridge
|
|
||||||
sourceCode: eventBridgeJavaScriptToInject
|
|
||||||
injectionPoint: WebEngineScript.DocumentCreation
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detect when may want to raise and lower keyboard.
|
|
||||||
WebEngineScript {
|
|
||||||
id: raiseAndLowerKeyboard
|
|
||||||
injectionPoint: WebEngineScript.Deferred
|
|
||||||
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
// User script.
|
|
||||||
WebEngineScript {
|
|
||||||
id: userScript
|
|
||||||
sourceUrl: webview.userScriptUrl
|
|
||||||
injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished.
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
|
|
||||||
|
|
||||||
function onWebEventReceived(event) {
|
|
||||||
if (event.slice(0, 17) === "CLARA.IO DOWNLOAD") {
|
|
||||||
ApplicationInterface.addAssetToWorldFromURL(event.slice(18));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
webChannel.registerObject("eventBridge", eventBridge);
|
|
||||||
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
|
|
||||||
eventBridge.webEventReceived.connect(onWebEventReceived);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
//
|
||||||
|
// WebSpinner.qml
|
||||||
|
//
|
||||||
|
// Created by David Rowe on 23 May 2017
|
||||||
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
import QtQuick 2.5
|
||||||
|
import QtWebEngine 1.5
|
||||||
|
|
||||||
|
AnimatedImage {
|
||||||
|
property WebEngineView webview: parent
|
||||||
|
source: "../../icons/loader-snake-64-w.gif"
|
||||||
|
visible: webview.loading && /^(http.*|)$/i.test(webview.url.toString())
|
||||||
|
playing: visible
|
||||||
|
z: 10000
|
||||||
|
anchors {
|
||||||
|
horizontalCenter: parent.horizontalCenter
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,10 +9,14 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
import QtQuick 2.5
|
import QtQuick 2.5
|
||||||
import QtWebEngine 1.5
|
|
||||||
|
|
||||||
AnimatedImage {
|
AnimatedImage {
|
||||||
property WebEngineView webview: parent
|
Item {
|
||||||
|
id: webView
|
||||||
|
property bool loading: false
|
||||||
|
property string url: ""
|
||||||
|
}
|
||||||
|
|
||||||
source: "../../icons/loader-snake-64-w.gif"
|
source: "../../icons/loader-snake-64-w.gif"
|
||||||
visible: webview.loading && /^(http.*|)$/i.test(webview.url.toString())
|
visible: webview.loading && /^(http.*|)$/i.test(webview.url.toString())
|
||||||
playing: visible
|
playing: visible
|
||||||
|
|
44
interface/resources/qml/hifi/+webengine/DesktopWebEngine.qml
Normal file
44
interface/resources/qml/hifi/+webengine/DesktopWebEngine.qml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
import QtQuick 2.7
|
||||||
|
import QtWebEngine 1.5
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property bool webViewProfileSetup: false
|
||||||
|
property string currentUrl: ""
|
||||||
|
property string downloadUrl: ""
|
||||||
|
property string adaptedPath: ""
|
||||||
|
property string tempDir: ""
|
||||||
|
function setupWebEngineSettings() {
|
||||||
|
WebEngine.settings.javascriptCanOpenWindows = true;
|
||||||
|
WebEngine.settings.javascriptCanAccessClipboard = false;
|
||||||
|
WebEngine.settings.spatialNavigationEnabled = false;
|
||||||
|
WebEngine.settings.localContentCanAccessRemoteUrls = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function initWebviewProfileHandlers(profile) {
|
||||||
|
downloadUrl = currentUrl;
|
||||||
|
if (webViewProfileSetup) return;
|
||||||
|
webViewProfileSetup = true;
|
||||||
|
|
||||||
|
profile.downloadRequested.connect(function(download){
|
||||||
|
adaptedPath = File.convertUrlToPath(downloadUrl);
|
||||||
|
tempDir = File.getTempDir();
|
||||||
|
download.path = tempDir + "/" + adaptedPath;
|
||||||
|
download.accept();
|
||||||
|
if (download.state === WebEngineDownloadItem.DownloadInterrupted) {
|
||||||
|
console.log("download failed to complete");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
profile.downloadFinished.connect(function(download){
|
||||||
|
if (download.state === WebEngineDownloadItem.DownloadCompleted) {
|
||||||
|
File.runUnzip(download.path, downloadUrl, autoAdd);
|
||||||
|
} else {
|
||||||
|
console.log("The download was corrupted, state: " + download.state);
|
||||||
|
}
|
||||||
|
autoAdd = false;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
import QtQuick 2.7
|
import QtQuick 2.7
|
||||||
import QtWebEngine 1.5;
|
|
||||||
import Qt.labs.settings 1.0 as QtSettings
|
import Qt.labs.settings 1.0 as QtSettings
|
||||||
|
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
|
@ -88,43 +87,20 @@ OriginalDesktop.Desktop {
|
||||||
})({});
|
})({});
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
WebEngine.settings.javascriptCanOpenWindows = true;
|
webEngineConfig.setupWebEngineSettings();
|
||||||
WebEngine.settings.javascriptCanAccessClipboard = false;
|
|
||||||
WebEngine.settings.spatialNavigationEnabled = false;
|
|
||||||
WebEngine.settings.localContentCanAccessRemoteUrls = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accept a download through the webview
|
// Accept a download through the webview
|
||||||
property bool webViewProfileSetup: false
|
property alias webViewProfileSetup: webEngineConfig.webViewProfileSetup
|
||||||
property string currentUrl: ""
|
property alias currentUrl: webEngineConfig.currentUrl
|
||||||
property string downloadUrl: ""
|
property alias downloadUrl: webEngineConfig.downloadUrl
|
||||||
property string adaptedPath: ""
|
property alias adaptedPath: webEngineConfig.adaptedPath
|
||||||
property string tempDir: ""
|
property alias tempDir: webEngineConfig.tempDir
|
||||||
|
property var initWebviewProfileHandlers: webEngineConfig.initWebviewProfileHandlers
|
||||||
property bool autoAdd: false
|
property bool autoAdd: false
|
||||||
|
|
||||||
function initWebviewProfileHandlers(profile) {
|
DesktopWebEngine {
|
||||||
downloadUrl = currentUrl;
|
id: webEngineConfig
|
||||||
if (webViewProfileSetup) return;
|
|
||||||
webViewProfileSetup = true;
|
|
||||||
|
|
||||||
profile.downloadRequested.connect(function(download){
|
|
||||||
adaptedPath = File.convertUrlToPath(downloadUrl);
|
|
||||||
tempDir = File.getTempDir();
|
|
||||||
download.path = tempDir + "/" + adaptedPath;
|
|
||||||
download.accept();
|
|
||||||
if (download.state === WebEngineDownloadItem.DownloadInterrupted) {
|
|
||||||
console.log("download failed to complete");
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
profile.downloadFinished.connect(function(download){
|
|
||||||
if (download.state === WebEngineDownloadItem.DownloadCompleted) {
|
|
||||||
File.runUnzip(download.path, downloadUrl, autoAdd);
|
|
||||||
} else {
|
|
||||||
console.log("The download was corrupted, state: " + download.state);
|
|
||||||
}
|
|
||||||
autoAdd = false;
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setAutoAdd(auto) {
|
function setAutoAdd(auto) {
|
||||||
|
|
17
interface/resources/qml/hifi/DesktopWebEngine.qml
Normal file
17
interface/resources/qml/hifi/DesktopWebEngine.qml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import QtQuick 2.7
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property bool webViewProfileSetup: false
|
||||||
|
property string currentUrl: ""
|
||||||
|
property string downloadUrl: ""
|
||||||
|
property string adaptedPath: ""
|
||||||
|
property string tempDir: ""
|
||||||
|
function setupWebEngineSettings() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function initWebviewProfileHandlers(profile) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,443 +0,0 @@
|
||||||
|
|
||||||
//
|
|
||||||
// WebBrowser.qml
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Created by Vlad Stelmahovsky on 06/22/2017
|
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
import QtQuick 2.7
|
|
||||||
import QtQuick.Controls 2.2 as QQControls
|
|
||||||
import QtQuick.Layouts 1.3
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
|
|
||||||
import QtWebEngine 1.5
|
|
||||||
import QtWebChannel 1.0
|
|
||||||
|
|
||||||
import stylesUit 1.0
|
|
||||||
import controlsUit 1.0 as HifiControls
|
|
||||||
import "../windows"
|
|
||||||
import "../controls"
|
|
||||||
|
|
||||||
import HifiWeb 1.0
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: root;
|
|
||||||
|
|
||||||
HifiConstants { id: hifi; }
|
|
||||||
|
|
||||||
property string title: "";
|
|
||||||
signal sendToScript(var message);
|
|
||||||
property bool keyboardEnabled: true // FIXME - Keyboard HMD only: Default to false
|
|
||||||
property bool keyboardRaised: false
|
|
||||||
property bool punctuationMode: false
|
|
||||||
property var suggestionsList: []
|
|
||||||
readonly property string searchUrlTemplate: "https://www.google.com/search?client=hifibrowser&q=";
|
|
||||||
|
|
||||||
|
|
||||||
WebBrowserSuggestionsEngine {
|
|
||||||
id: searchEngine
|
|
||||||
|
|
||||||
onSuggestions: {
|
|
||||||
if (suggestions.length > 0) {
|
|
||||||
suggestionsList = []
|
|
||||||
suggestionsList.push(addressBarInput.text); //do not overwrite edit text
|
|
||||||
for(var i = 0; i < suggestions.length; i++) {
|
|
||||||
suggestionsList.push(suggestions[i]);
|
|
||||||
}
|
|
||||||
addressBar.model = suggestionsList
|
|
||||||
if (!addressBar.popup.visible) {
|
|
||||||
addressBar.popup.open();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
id: suggestionRequestTimer
|
|
||||||
interval: 200
|
|
||||||
repeat: false
|
|
||||||
onTriggered: {
|
|
||||||
if (addressBar.editText !== "") {
|
|
||||||
searchEngine.querySuggestions(addressBarInput.text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
color: hifi.colors.baseGray;
|
|
||||||
|
|
||||||
function goTo(url) {
|
|
||||||
//must be valid attempt to open an site with dot
|
|
||||||
var urlNew = url
|
|
||||||
if (url.indexOf(".") > 0) {
|
|
||||||
if (url.indexOf("http") < 0) {
|
|
||||||
urlNew = "http://" + url;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
urlNew = searchUrlTemplate + url
|
|
||||||
}
|
|
||||||
|
|
||||||
addressBar.model = []
|
|
||||||
//need to rebind if binfing was broken by selecting from suggestions
|
|
||||||
addressBar.editText = Qt.binding( function() { return webStack.currentItem.webEngineView.url; });
|
|
||||||
webStack.currentItem.webEngineView.url = urlNew
|
|
||||||
suggestionRequestTimer.stop();
|
|
||||||
addressBar.popup.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
spacing: 2
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
id: addressBarRow
|
|
||||||
width: parent.width;
|
|
||||||
height: 48
|
|
||||||
|
|
||||||
HifiControls.WebGlyphButton {
|
|
||||||
enabled: webStack.currentItem.webEngineView.canGoBack || webStack.depth > 1
|
|
||||||
glyph: hifi.glyphs.backward;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
size: 38;
|
|
||||||
onClicked: {
|
|
||||||
if (webStack.currentItem.webEngineView.canGoBack) {
|
|
||||||
webStack.currentItem.webEngineView.goBack();
|
|
||||||
} else if (webStack.depth > 1) {
|
|
||||||
webStack.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HifiControls.WebGlyphButton {
|
|
||||||
enabled: webStack.currentItem.webEngineView.canGoForward
|
|
||||||
glyph: hifi.glyphs.forward;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
size: 38;
|
|
||||||
onClicked: {
|
|
||||||
webStack.currentItem.webEngineView.goForward();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QQControls.ComboBox {
|
|
||||||
id: addressBar
|
|
||||||
|
|
||||||
//selectByMouse: true
|
|
||||||
focus: true
|
|
||||||
|
|
||||||
editable: true
|
|
||||||
//flat: true
|
|
||||||
indicator: Item {}
|
|
||||||
background: Item {}
|
|
||||||
onActivated: {
|
|
||||||
goTo(textAt(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
onHighlightedIndexChanged: {
|
|
||||||
if (highlightedIndex >= 0) {
|
|
||||||
addressBar.editText = textAt(highlightedIndex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
popup.height: webStack.height
|
|
||||||
|
|
||||||
onFocusChanged: {
|
|
||||||
if (focus) {
|
|
||||||
addressBarInput.selectAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
contentItem: QQControls.TextField {
|
|
||||||
id: addressBarInput
|
|
||||||
leftPadding: 26
|
|
||||||
rightPadding: hifi.dimensions.controlLineHeight + 5
|
|
||||||
text: addressBar.editText
|
|
||||||
placeholderText: qsTr("Enter URL")
|
|
||||||
font: addressBar.font
|
|
||||||
selectByMouse: true
|
|
||||||
horizontalAlignment: Text.AlignLeft
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
onFocusChanged: {
|
|
||||||
if (focus) {
|
|
||||||
selectAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Keys.onDeletePressed: {
|
|
||||||
addressBarInput.text = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
Keys.onPressed: {
|
|
||||||
if (event.key === Qt.Key_Return) {
|
|
||||||
goTo(addressBarInput.text);
|
|
||||||
event.accepted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
x: 5
|
|
||||||
z: 2
|
|
||||||
id: faviconImage
|
|
||||||
width: 16; height: 16
|
|
||||||
sourceSize: Qt.size(width, height)
|
|
||||||
source: webStack.currentItem.webEngineView.icon
|
|
||||||
}
|
|
||||||
|
|
||||||
HifiControls.WebGlyphButton {
|
|
||||||
glyph: webStack.currentItem.webEngineView.loading ? hifi.glyphs.closeSmall : hifi.glyphs.reloadSmall;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
width: hifi.dimensions.controlLineHeight
|
|
||||||
z: 2
|
|
||||||
x: addressBarInput.width - implicitWidth
|
|
||||||
onClicked: {
|
|
||||||
if (webStack.currentItem.webEngineView.loading) {
|
|
||||||
webStack.currentItem.webEngineView.stop();
|
|
||||||
} else {
|
|
||||||
webStack.currentItem.reloadTimer.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: ScriptDiscoveryService.scriptsModelFilter.filterRegExp = new RegExp("^.*$", "i");
|
|
||||||
|
|
||||||
Keys.onPressed: {
|
|
||||||
if (event.key === Qt.Key_Return) {
|
|
||||||
goTo(addressBarInput.text);
|
|
||||||
event.accepted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onEditTextChanged: {
|
|
||||||
if (addressBar.editText !== "" && addressBar.editText !== webStack.currentItem.webEngineView.url.toString()) {
|
|
||||||
suggestionRequestTimer.restart();
|
|
||||||
} else {
|
|
||||||
addressBar.model = []
|
|
||||||
addressBar.popup.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Layout.fillWidth: true
|
|
||||||
editText: webStack.currentItem.webEngineView.url
|
|
||||||
onAccepted: goTo(addressBarInput.text);
|
|
||||||
}
|
|
||||||
|
|
||||||
HifiControls.WebGlyphButton {
|
|
||||||
checkable: true
|
|
||||||
checked: webStack.currentItem.webEngineView.audioMuted
|
|
||||||
glyph: checked ? hifi.glyphs.unmuted : hifi.glyphs.muted
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
width: hifi.dimensions.controlLineHeight
|
|
||||||
onClicked: {
|
|
||||||
webStack.currentItem.webEngineView.audioMuted = !webStack.currentItem.webEngineView.audioMuted
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QQControls.ProgressBar {
|
|
||||||
id: loadProgressBar
|
|
||||||
background: Rectangle {
|
|
||||||
implicitHeight: 2
|
|
||||||
color: "#6A6A6A"
|
|
||||||
}
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
implicitHeight: 2
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: loadProgressBar.visualPosition * parent.width
|
|
||||||
height: parent.height
|
|
||||||
color: "#00B4EF"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
width: parent.width;
|
|
||||||
from: 0
|
|
||||||
to: 100
|
|
||||||
value: webStack.currentItem.webEngineView.loadProgress
|
|
||||||
height: 2
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: webViewComponent
|
|
||||||
Rectangle {
|
|
||||||
property alias webEngineView: webEngineView
|
|
||||||
property alias reloadTimer: reloadTimer
|
|
||||||
|
|
||||||
property WebEngineNewViewRequest request: null
|
|
||||||
|
|
||||||
property bool isDialog: QQControls.StackView.index > 0
|
|
||||||
property real margins: isDialog ? 10 : 0
|
|
||||||
|
|
||||||
color: "#d1d1d1"
|
|
||||||
|
|
||||||
QQControls.StackView.onActivated: {
|
|
||||||
addressBar.editText = Qt.binding( function() { return webStack.currentItem.webEngineView.url; });
|
|
||||||
}
|
|
||||||
|
|
||||||
onRequestChanged: {
|
|
||||||
if (isDialog && request !== null && request !== undefined) {//is Dialog ?
|
|
||||||
request.openIn(webEngineView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HifiControls.BaseWebView {
|
|
||||||
id: webEngineView
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: parent.margins
|
|
||||||
|
|
||||||
layer.enabled: parent.isDialog
|
|
||||||
layer.effect: DropShadow {
|
|
||||||
verticalOffset: 8
|
|
||||||
horizontalOffset: 8
|
|
||||||
color: "#330066ff"
|
|
||||||
samples: 10
|
|
||||||
spread: 0.5
|
|
||||||
}
|
|
||||||
|
|
||||||
focus: true
|
|
||||||
objectName: "tabletWebEngineView"
|
|
||||||
|
|
||||||
//profile: HFWebEngineProfile;
|
|
||||||
profile.httpUserAgent: "Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0"
|
|
||||||
|
|
||||||
property string userScriptUrl: ""
|
|
||||||
|
|
||||||
onLoadingChanged: {
|
|
||||||
if (!loading) {
|
|
||||||
addressBarInput.cursorPosition = 0 //set input field cursot to beginning
|
|
||||||
suggestionRequestTimer.stop();
|
|
||||||
addressBar.popup.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onLinkHovered: {
|
|
||||||
//TODO: change cursor shape?
|
|
||||||
}
|
|
||||||
|
|
||||||
// creates a global EventBridge object.
|
|
||||||
WebEngineScript {
|
|
||||||
id: createGlobalEventBridge
|
|
||||||
sourceCode: eventBridgeJavaScriptToInject
|
|
||||||
injectionPoint: WebEngineScript.Deferred
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
// detects when to raise and lower virtual keyboard
|
|
||||||
WebEngineScript {
|
|
||||||
id: raiseAndLowerKeyboard
|
|
||||||
injectionPoint: WebEngineScript.Deferred
|
|
||||||
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
// User script.
|
|
||||||
WebEngineScript {
|
|
||||||
id: userScript
|
|
||||||
sourceUrl: webEngineView.userScriptUrl
|
|
||||||
injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished.
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
|
|
||||||
|
|
||||||
settings.autoLoadImages: true
|
|
||||||
settings.javascriptEnabled: true
|
|
||||||
settings.errorPageEnabled: true
|
|
||||||
settings.pluginsEnabled: true
|
|
||||||
settings.fullScreenSupportEnabled: true
|
|
||||||
settings.autoLoadIconsForPage: true
|
|
||||||
settings.touchIconsEnabled: true
|
|
||||||
|
|
||||||
onCertificateError: {
|
|
||||||
error.defer();
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
webChannel.registerObject("eventBridge", eventBridge);
|
|
||||||
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
onFeaturePermissionRequested: {
|
|
||||||
grantFeaturePermission(securityOrigin, feature, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
onNewViewRequested: {
|
|
||||||
if (request.destination == WebEngineView.NewViewInDialog) {
|
|
||||||
webStack.push(webViewComponent, {"request": request});
|
|
||||||
} else {
|
|
||||||
request.openIn(webEngineView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onRenderProcessTerminated: {
|
|
||||||
var status = "";
|
|
||||||
switch (terminationStatus) {
|
|
||||||
case WebEngineView.NormalTerminationStatus:
|
|
||||||
status = "(normal exit)";
|
|
||||||
break;
|
|
||||||
case WebEngineView.AbnormalTerminationStatus:
|
|
||||||
status = "(abnormal exit)";
|
|
||||||
break;
|
|
||||||
case WebEngineView.CrashedTerminationStatus:
|
|
||||||
status = "(crashed)";
|
|
||||||
break;
|
|
||||||
case WebEngineView.KilledTerminationStatus:
|
|
||||||
status = "(killed)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.error("Render process exited with code " + exitCode + " " + status);
|
|
||||||
reloadTimer.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
onFullScreenRequested: {
|
|
||||||
if (request.toggleOn) {
|
|
||||||
webEngineView.state = "FullScreen";
|
|
||||||
} else {
|
|
||||||
webEngineView.state = "";
|
|
||||||
}
|
|
||||||
request.accept();
|
|
||||||
}
|
|
||||||
|
|
||||||
onWindowCloseRequested: {
|
|
||||||
webStack.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Timer {
|
|
||||||
id: reloadTimer
|
|
||||||
interval: 0
|
|
||||||
running: false
|
|
||||||
repeat: false
|
|
||||||
onTriggered: webEngineView.reload()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QQControls.StackView {
|
|
||||||
id: webStack
|
|
||||||
width: parent.width;
|
|
||||||
property real webViewHeight: root.height - loadProgressBar.height - 48 - 4
|
|
||||||
height: keyboardEnabled && keyboardRaised ? webViewHeight - keyboard.height : webViewHeight
|
|
||||||
|
|
||||||
Component.onCompleted: webStack.push(webViewComponent, {"webEngineView.url": "https://www.highfidelity.com"});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HifiControls.Keyboard {
|
|
||||||
id: keyboard
|
|
||||||
raised: parent.keyboardEnabled && parent.keyboardRaised
|
|
||||||
numeric: parent.punctuationMode
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
import QtQuick 2.5
|
import QtQuick 2.5
|
||||||
import QtWebEngine 1.5
|
|
||||||
|
|
||||||
AnimatedImage {
|
AnimatedImage {
|
||||||
source: "../../../icons/loader-snake-64-w.gif"
|
source: "../../../icons/loader-snake-64-w.gif"
|
||||||
|
|
|
@ -15,7 +15,6 @@ import Hifi 1.0 as Hifi
|
||||||
import QtQuick 2.9
|
import QtQuick 2.9
|
||||||
import QtQuick.Controls 2.2
|
import QtQuick.Controls 2.2
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
import QtWebEngine 1.5
|
|
||||||
import stylesUit 1.0
|
import stylesUit 1.0
|
||||||
import controlsUit 1.0 as HifiControlsUit
|
import controlsUit 1.0 as HifiControlsUit
|
||||||
import "../../../controls" as HifiControls
|
import "../../../controls" as HifiControls
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtWebEngine 1.2
|
|
||||||
|
|
||||||
import "../../controls" as Controls
|
import "../../controls" as Controls
|
||||||
|
|
||||||
Controls.TabletWebView {
|
Controls.TabletWebView {
|
||||||
|
|
|
@ -2,8 +2,6 @@ import QtQuick 2.5
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
import QtQml 2.2
|
import QtQml 2.2
|
||||||
import QtWebChannel 1.0
|
|
||||||
import QtWebEngine 1.1
|
|
||||||
|
|
||||||
|
|
||||||
import "."
|
import "."
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtWebEngine 1.2
|
|
||||||
|
|
||||||
import "../../controls" as Controls
|
import "../../controls" as Controls
|
||||||
|
|
||||||
Controls.TabletWebScreen {
|
Controls.TabletWebScreen {
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtWebEngine 1.2
|
|
||||||
|
|
||||||
import "../../controls" as Controls
|
import "../../controls" as Controls
|
||||||
|
|
||||||
Controls.WebView {
|
Controls.WebView {
|
||||||
|
|
Loading…
Reference in a new issue