diff --git a/interface/resources/qml/controls/TabletWebScreen.qml b/interface/resources/qml/controls/TabletWebScreen.qml index 1de31aba41..e1615e1442 100644 --- a/interface/resources/qml/controls/TabletWebScreen.qml +++ b/interface/resources/qml/controls/TabletWebScreen.qml @@ -1,5 +1,5 @@ -import QtQuick 2.5 -import QtWebEngine 1.1 +import QtQuick 2.7 +import QtWebEngine 1.5 import QtWebChannel 1.0 import "../controls-uit" as HiFiControls @@ -23,91 +23,124 @@ Item { property alias viewProfile: root.profile - WebEngineView { - id: root - objectName: "webEngineView" + Flickable { + id: flick x: 0 y: 0 width: parent.width height: keyboardEnabled && keyboardRaised ? parent.height - keyboard.height : parent.height - profile: HFWebEngineProfile; + WebEngineView { + id: root + objectName: "webEngineView" + anchors.fill: parent - property string userScriptUrl: "" + profile: HFWebEngineProfile; - // creates a global EventBridge object. - WebEngineScript { - id: createGlobalEventBridge - sourceCode: eventBridgeJavaScriptToInject - injectionPoint: WebEngineScript.DocumentCreation - worldId: WebEngineScript.MainWorld - } + property string userScriptUrl: "" - // detects when to raise and lower virtual keyboard - WebEngineScript { - id: raiseAndLowerKeyboard - injectionPoint: WebEngineScript.Deferred - sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" - worldId: WebEngineScript.MainWorld - } + // creates a global EventBridge object. + WebEngineScript { + id: createGlobalEventBridge + sourceCode: eventBridgeJavaScriptToInject + injectionPoint: WebEngineScript.DocumentCreation + worldId: WebEngineScript.MainWorld + } - // User script. - WebEngineScript { - id: userScript - sourceUrl: root.userScriptUrl - injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished. - worldId: WebEngineScript.MainWorld - } - - property string urlTag: "noDownload=false"; + // detects when to raise and lower virtual keyboard + WebEngineScript { + id: raiseAndLowerKeyboard + injectionPoint: WebEngineScript.Deferred + sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" + worldId: WebEngineScript.MainWorld + } - userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] + // User script. + WebEngineScript { + id: userScript + sourceUrl: root.userScriptUrl + injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished. + worldId: WebEngineScript.MainWorld + } - property string newUrl: "" - + property string urlTag: "noDownload=false"; - Component.onCompleted: { - webChannel.registerObject("eventBridge", eventBridge); - webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper); - // Ensure the JS from the web-engine makes it to our logging - root.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { - console.log("Web Entity JS message: " + sourceID + " " + lineNumber + " " + message); - }); + userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] - root.profile.httpUserAgent = "Mozilla/5.0 Chrome (HighFidelityInterface)"; - } + property string newUrl: "" - onFeaturePermissionRequested: { - grantFeaturePermission(securityOrigin, feature, true); - } + onContentsSizeChanged: { + console.log("WebView contentsSize", contentsSize) + flick.contentWidth = Math.max(contentsSize.width, flick.width) + flick.contentHeight = Math.max(contentsSize.height, flick.height) + } - onLoadingChanged: { - keyboardRaised = false; - punctuationMode = false; - keyboard.resetShiftMode(false); + Component.onCompleted: { + webChannel.registerObject("eventBridge", eventBridge); + webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper); + // Ensure the JS from the web-engine makes it to our logging + root.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { + console.log("Web Entity JS message: " + sourceID + " " + lineNumber + " " + message); + }); - // Required to support clicking on "hifi://" links - if (WebEngineView.LoadStartedStatus == loadRequest.status) { - var url = loadRequest.url.toString(); - url = (url.indexOf("?") >= 0) ? url + urlTag : url + "?" + urlTag; - if (urlHandler.canHandleUrl(url)) { - if (urlHandler.handleUrl(url)) { - root.stop(); + root.profile.httpUserAgent = "Mozilla/5.0 Chrome (HighFidelityInterface)"; + } + + onFeaturePermissionRequested: { + grantFeaturePermission(securityOrigin, feature, true); + } + + onLoadingChanged: { + console.log("loading changed", loadRequest.status) + keyboardRaised = false; + punctuationMode = false; + keyboard.resetShiftMode(false); + + // Required to support clicking on "hifi://" links + if (WebEngineView.LoadStartedStatus == loadRequest.status) { + flick.contentWidth = -1 + flick.contentHeight = -1 + var url = loadRequest.url.toString(); + url = (url.indexOf("?") >= 0) ? url + urlTag : url + "?" + urlTag; + if (urlHandler.canHandleUrl(url)) { + if (urlHandler.handleUrl(url)) { + root.stop(); + } } } - } - } + if (WebEngineView.LoadSucceededStatus == loadRequest.status) { +// flick.contentWidth = Math.max(contentsSize.width, flick.width) +// flick.contentHeight = Math.max(contentsSize.height, flick.height) + root.runJavaScript( + "document.body.scrollHeight;", + function (i_actualPageHeight) { + console.log("on reloaded documentElement.scrollHeigh:", i_actualPageHeight) +// flick.contentHeight = Math.max ( +// i_actualPageHeight, flick.height); + }) + root.runJavaScript( + "document.body.scrollWidth;", + function (i_actualPageWidth) { + console.log("on reloaded documentElement.scrollWidth:", i_actualPageWidth) - onNewViewRequested:{ - // desktop is not defined for web-entities or tablet - if (typeof desktop !== "undefined") { - desktop.openBrowserWindow(request, profile); - } else { - tabletRoot.openBrowserWindow(request, profile); +// flick.contentWidth = Math.max ( +// i_actualPageWidth, flick.width); + }) + console.log("on reloaded content size:", contentsSize) + } } - } - HiFiControls.WebSpinner { } + onNewViewRequested:{ + // desktop is not defined for web-entities or tablet + if (typeof desktop !== "undefined") { + desktop.openBrowserWindow(request, profile); + } else { + tabletRoot.openBrowserWindow(request, profile); + } + } + + HiFiControls.WebSpinner { } + } } HiFiControls.Keyboard { diff --git a/interface/resources/qml/controls/TabletWebView.qml b/interface/resources/qml/controls/TabletWebView.qml index 8547f67468..6fafab81a9 100644 --- a/interface/resources/qml/controls/TabletWebView.qml +++ b/interface/resources/qml/controls/TabletWebView.qml @@ -1,6 +1,6 @@ -import QtQuick 2.5 +import QtQuick 2.7 import QtQuick.Controls 1.4 -import QtWebEngine 1.2 +import QtWebEngine 1.5 import QtWebChannel 1.0 import "../controls-uit" as HiFiControls import "../styles" as HifiStyles @@ -136,99 +136,107 @@ Item { loadUrl(url); } - WebEngineView { - id: webview - objectName: "webEngineView" + Flickable { + id: flick x: 0 y: 0 width: parent.width height: keyboardEnabled && keyboardRaised ? parent.height - keyboard.height - web.headerHeight : parent.height - web.headerHeight anchors.top: buttons.bottom - profile: HFWebEngineProfile; - property string userScriptUrl: "" + WebEngineView { + id: webview + objectName: "webEngineView" + anchors.fill: parent - // creates a global EventBridge object. - WebEngineScript { - id: createGlobalEventBridge - sourceCode: eventBridgeJavaScriptToInject - injectionPoint: WebEngineScript.DocumentCreation - worldId: WebEngineScript.MainWorld - } + profile: HFWebEngineProfile; - // detects when to raise and lower virtual keyboard - WebEngineScript { - id: raiseAndLowerKeyboard - injectionPoint: WebEngineScript.Deferred - sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" - worldId: WebEngineScript.MainWorld - } + property string userScriptUrl: "" - // User script. - WebEngineScript { - id: userScript - sourceUrl: webview.userScriptUrl - injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished. - worldId: WebEngineScript.MainWorld - } - - property string urlTag: "noDownload=false"; - userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] - - property string newUrl: "" - - Component.onCompleted: { - webChannel.registerObject("eventBridge", eventBridge); - webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper); - // Ensure the JS from the web-engine makes it to our logging - webview.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { - console.log("Web Entity JS message: " + sourceID + " " + lineNumber + " " + message); - }); - } - - onFeaturePermissionRequested: { - grantFeaturePermission(securityOrigin, feature, true); - } - - onUrlChanged: { - // Record history, skipping null and duplicate items. - var urlString = url + ""; - urlString = urlString.replace(/\//g, "%2F"); // Consistent representation of "/"s to avoid false differences. - if (urlString.length > 0 && (historyIndex === -1 || urlString !== history[historyIndex])) { - historyIndex++; - history = history.slice(0, historyIndex); - history.push(urlString); + // creates a global EventBridge object. + WebEngineScript { + id: createGlobalEventBridge + sourceCode: eventBridgeJavaScriptToInject + injectionPoint: WebEngineScript.DocumentCreation + worldId: WebEngineScript.MainWorld } - } - onLoadingChanged: { - keyboardRaised = false; - punctuationMode = false; - keyboard.resetShiftMode(false); - // Required to support clicking on "hifi://" links - if (WebEngineView.LoadStartedStatus == loadRequest.status) { - var url = loadRequest.url.toString(); - if (urlHandler.canHandleUrl(url)) { - if (urlHandler.handleUrl(url)) { - root.stop(); - } + // 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: webview.userScriptUrl + injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished. + worldId: WebEngineScript.MainWorld + } + + property string urlTag: "noDownload=false"; + userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] + + property string newUrl: "" + + Component.onCompleted: { + webChannel.registerObject("eventBridge", eventBridge); + webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper); + // Ensure the JS from the web-engine makes it to our logging + webview.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { + console.log("Web Entity JS message: " + sourceID + " " + lineNumber + " " + message); + }); + } + + onFeaturePermissionRequested: { + grantFeaturePermission(securityOrigin, feature, true); + } + + onUrlChanged: { + // Record history, skipping null and duplicate items. + var urlString = url + ""; + urlString = urlString.replace(/\//g, "%2F"); // Consistent representation of "/"s to avoid false differences. + if (urlString.length > 0 && (historyIndex === -1 || urlString !== history[historyIndex])) { + historyIndex++; + history = history.slice(0, historyIndex); + history.push(urlString); } } - if (WebEngineView.LoadFailedStatus == loadRequest.status) { - console.log(" Tablet WebEngineView failed to load url: " + loadRequest.url.toString()); + onLoadingChanged: { + keyboardRaised = false; + punctuationMode = false; + keyboard.resetShiftMode(false); + // Required to support clicking on "hifi://" links + if (WebEngineView.LoadStartedStatus == loadRequest.status) { + var url = loadRequest.url.toString(); + if (urlHandler.canHandleUrl(url)) { + if (urlHandler.handleUrl(url)) { + root.stop(); + } + } + } + + if (WebEngineView.LoadFailedStatus == loadRequest.status) { + console.log(" Tablet WebEngineView failed to load url: " + loadRequest.url.toString()); + } + + if (WebEngineView.LoadSucceededStatus == loadRequest.status) { + flick.contentWidth = Math.max(contentsSize.width, flick.width) + flick.contentHeight = Math.max(contentsSize.height, flick.height) + webview.forceActiveFocus(); + } } - if (WebEngineView.LoadSucceededStatus == loadRequest.status) { - webview.forceActiveFocus(); + onNewViewRequested: { + request.openIn(webview); } - } - - onNewViewRequested: { - request.openIn(webview); - } - HiFiControls.WebSpinner { } + HiFiControls.WebSpinner { } + } } HiFiControls.Keyboard { diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml index 3f2ac6363b..2013de4ef9 100644 --- a/interface/resources/qml/controls/WebView.qml +++ b/interface/resources/qml/controls/WebView.qml @@ -1,5 +1,5 @@ -import QtQuick 2.5 -import QtWebEngine 1.1 +import QtQuick 2.7 +import QtWebEngine 1.5 import QtWebChannel 1.0 import "../controls-uit" as HiFiControls @@ -23,89 +23,119 @@ Item { property alias viewProfile: root.profile - WebEngineView { - id: root - objectName: "webEngineView" + Flickable { + id: flick x: 0 y: 0 width: parent.width height: keyboardEnabled && keyboardRaised ? parent.height - keyboard.height : parent.height - profile: HFWebEngineProfile; - property string userScriptUrl: "" + WebEngineView { + id: root + objectName: "webEngineView" + anchors.fill: parent - // creates a global EventBridge object. - WebEngineScript { - id: createGlobalEventBridge - sourceCode: eventBridgeJavaScriptToInject - injectionPoint: WebEngineScript.DocumentCreation - worldId: WebEngineScript.MainWorld - } + profile: HFWebEngineProfile; - // detects when to raise and lower virtual keyboard - WebEngineScript { - id: raiseAndLowerKeyboard - injectionPoint: WebEngineScript.Deferred - sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" - worldId: WebEngineScript.MainWorld - } + property string userScriptUrl: "" - // User script. - WebEngineScript { - id: userScript - sourceUrl: root.userScriptUrl - injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished. - worldId: WebEngineScript.MainWorld - } - - property string urlTag: "noDownload=false"; + // creates a global EventBridge object. + WebEngineScript { + id: createGlobalEventBridge + sourceCode: eventBridgeJavaScriptToInject + injectionPoint: WebEngineScript.DocumentCreation + worldId: WebEngineScript.MainWorld + } - userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] + // detects when to raise and lower virtual keyboard + WebEngineScript { + id: raiseAndLowerKeyboard + injectionPoint: WebEngineScript.Deferred + sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" + worldId: WebEngineScript.MainWorld + } - property string newUrl: "" + // User script. + WebEngineScript { + id: userScript + sourceUrl: root.userScriptUrl + injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished. + worldId: WebEngineScript.MainWorld + } - Component.onCompleted: { - webChannel.registerObject("eventBridge", eventBridge); - webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper); - // Ensure the JS from the web-engine makes it to our logging - root.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { - console.log("Web Entity JS message: " + sourceID + " " + lineNumber + " " + message); - }); + property string urlTag: "noDownload=false"; - } + userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] - onFeaturePermissionRequested: { - grantFeaturePermission(securityOrigin, feature, true); - } + property string newUrl: "" - onLoadingChanged: { - keyboardRaised = false; - punctuationMode = false; - keyboard.resetShiftMode(false); + Component.onCompleted: { + webChannel.registerObject("eventBridge", eventBridge); + webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper); + // Ensure the JS from the web-engine makes it to our logging + root.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { + console.log("Web Entity JS message: " + sourceID + " " + lineNumber + " " + message); + }); - // Required to support clicking on "hifi://" links - if (WebEngineView.LoadStartedStatus == loadRequest.status) { - var url = loadRequest.url.toString(); - url = (url.indexOf("?") >= 0) ? url + urlTag : url + "?" + urlTag; - if (urlHandler.canHandleUrl(url)) { - if (urlHandler.handleUrl(url)) { - root.stop(); + } + + onFeaturePermissionRequested: { + grantFeaturePermission(securityOrigin, feature, true); + } + + onContentsSizeChanged: { + console.log("WebView contentsSize", contentsSize) + flick.contentWidth = Math.max(contentsSize.width, flick.width) + flick.contentHeight = Math.max(contentsSize.height, flick.height) + } + + onLoadingChanged: { + keyboardRaised = false; + punctuationMode = false; + keyboard.resetShiftMode(false); + + // Required to support clicking on "hifi://" links + if (WebEngineView.LoadStartedStatus == loadRequest.status) { + var url = loadRequest.url.toString(); + url = (url.indexOf("?") >= 0) ? url + urlTag : url + "?" + urlTag; + if (urlHandler.canHandleUrl(url)) { + if (urlHandler.handleUrl(url)) { + root.stop(); + } } } - } - } + if (WebEngineView.LoadSucceededStatus == loadRequest.status) { - onNewViewRequested:{ - // desktop is not defined for web-entities or tablet - if (typeof desktop !== "undefined") { - desktop.openBrowserWindow(request, profile); - } else { - tabletRoot.openBrowserWindow(request, profile); - } - } +// flick.contentWidth = Math.max(contentsSize.width, flick.width) +// flick.contentHeight = Math.max(contentsSize.height, flick.height) + root.runJavaScript( + "document.body.scrollHeight;", + function (i_actualPageHeight) { + flick.contentHeight = Math.max ( + i_actualPageHeight, flick.height); + }) + root.runJavaScript( + "document.body.scrollWidth;", + function (i_actualPageWidth) { + flick.contentWidth = Math.max ( + i_actualPageWidth, flick.width); + }) - HiFiControls.WebSpinner { } + } + } + + onNewViewRequested:{ + // desktop is not defined for web-entities or tablet + if (typeof desktop !== "undefined") { + desktop.openBrowserWindow(request, profile); + } else { + tabletRoot.openBrowserWindow(request, profile); + } + } + + HiFiControls.WebSpinner { } + } } HiFiControls.Keyboard {