diff --git a/interface/resources/html/createGlobalEventBridge.js b/interface/resources/html/createGlobalEventBridge.js
index 027d6fe8db..4a0de464c3 100644
--- a/interface/resources/html/createGlobalEventBridge.js
+++ b/interface/resources/html/createGlobalEventBridge.js
@@ -32,7 +32,7 @@ var EventBridge;
var webChannel = new QWebChannel(qt.webChannelTransport, function (channel) {
// replace the TempEventBridge with the real one.
var tempEventBridge = EventBridge;
- EventBridge = channel.objects.eventBridgeWrapper.eventBridge;
+ EventBridge = channel.objects.eventBridge;
tempEventBridge._callbacks.forEach(function (callback) {
EventBridge.scriptEventReceived.connect(callback);
});
diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml
index 4f7639dd0e..55927fda24 100644
--- a/interface/resources/qml/Browser.qml
+++ b/interface/resources/qml/Browser.qml
@@ -21,8 +21,6 @@ ScrollingWindow {
property alias url: webview.url
property alias webView: webview
- property alias eventBridge: eventBridgeWrapper.eventBridge
-
signal loadingChanged(int status)
x: 100
@@ -210,17 +208,6 @@ ScrollingWindow {
url: "https://highfidelity.com/"
profile: FileTypeProfile;
- property alias eventBridgeWrapper: eventBridgeWrapper
-
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
-
- webChannel.registeredObjects: [eventBridgeWrapper]
-
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
@@ -267,6 +254,8 @@ ScrollingWindow {
}
Component.onCompleted: {
+ webChannel.registerObject("eventBridge", eventBridge);
+ webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
desktop.initWebviewProfileHandlers(webview.profile);
}
}
diff --git a/interface/resources/qml/QmlWebWindow.qml b/interface/resources/qml/QmlWebWindow.qml
index d40b1595ba..d2daf0fa1d 100644
--- a/interface/resources/qml/QmlWebWindow.qml
+++ b/interface/resources/qml/QmlWebWindow.qml
@@ -26,15 +26,8 @@ Windows.ScrollingWindow {
// Don't destroy on close... otherwise the JS/C++ will have a dangling pointer
destroyOnCloseButton: false
property alias source: webview.url
- property alias eventBridge: eventBridgeWrapper.eventBridge;
property alias scriptUrl: webview.userScriptUrl
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
// 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
@@ -70,7 +63,6 @@ Windows.ScrollingWindow {
url: "about:blank"
anchors.fill: parent
focus: true
- webChannel.registeredObjects: [eventBridgeWrapper]
property string userScriptUrl: ""
@@ -107,6 +99,8 @@ Windows.ScrollingWindow {
}
Component.onCompleted: {
+ webChannel.registerObject("eventBridge", eventBridge);
+ webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
eventBridge.webEventReceived.connect(onWebEventReceived);
}
}
diff --git a/interface/resources/qml/QmlWindow.qml b/interface/resources/qml/QmlWindow.qml
index ac18d36ce6..9ef151b32e 100644
--- a/interface/resources/qml/QmlWindow.qml
+++ b/interface/resources/qml/QmlWindow.qml
@@ -30,15 +30,6 @@ Windows.Window {
property bool keyboardRaised: false
property bool punctuationMode: false
- // JavaScript event bridge object in case QML content includes Web content.
- property alias eventBridge: eventBridgeWrapper.eventBridge;
-
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
onSourceChanged: {
if (dynamicContent) {
dynamicContent.destroy();
diff --git a/interface/resources/qml/TabletBrowser.qml b/interface/resources/qml/TabletBrowser.qml
index d89aa8626f..c3d879c513 100644
--- a/interface/resources/qml/TabletBrowser.qml
+++ b/interface/resources/qml/TabletBrowser.qml
@@ -18,7 +18,6 @@ Item {
property variant permissionsBar: {'securityOrigin':'none','feature':'none'}
property alias url: webview.url
property WebEngineView webView: webview
- property alias eventBridge: eventBridgeWrapper.eventBridge
property bool canGoBack: webview.canGoBack
property bool canGoForward: webview.canGoForward
@@ -32,12 +31,6 @@ Item {
webview.profile = profile;
}
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
WebEngineView {
id: webview
objectName: "webEngineView"
@@ -78,9 +71,10 @@ Item {
property string newUrl: ""
- webChannel.registeredObjects: [eventBridgeWrapper]
-
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);
diff --git a/interface/resources/qml/ToolWindow.qml b/interface/resources/qml/ToolWindow.qml
index 9c0b0a8c1a..b1120058f9 100644
--- a/interface/resources/qml/ToolWindow.qml
+++ b/interface/resources/qml/ToolWindow.qml
@@ -79,15 +79,11 @@ ScrollingWindow {
id: webView
anchors.fill: parent
enabled: false
- property alias eventBridgeWrapper: eventBridgeWrapper
-
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge
+ Component.onCompleted: {
+ webChannel.registerObject("eventBridge", eventBridge);
+ webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
}
- webChannel.registeredObjects: [eventBridgeWrapper]
onEnabledChanged: toolWindow.updateVisiblity()
}
}
@@ -251,12 +247,9 @@ ScrollingWindow {
tab.enabled = true;
tab.originalUrl = properties.source;
- var eventBridge = properties.eventBridge;
-
var result = tab.item;
result.enabled = true;
tabView.tabCount++;
- result.eventBridgeWrapper.eventBridge = eventBridge;
result.url = properties.source;
return result;
}
diff --git a/interface/resources/qml/controls/TabletWebScreen.qml b/interface/resources/qml/controls/TabletWebScreen.qml
index 0b265f6fbb..68f8226e21 100644
--- a/interface/resources/qml/controls/TabletWebScreen.qml
+++ b/interface/resources/qml/controls/TabletWebScreen.qml
@@ -6,7 +6,6 @@ import "../controls-uit" as HiFiControls
Item {
property alias url: root.url
property alias scriptURL: root.userScriptUrl
- property alias eventBridge: eventBridgeWrapper.eventBridge
property alias canGoBack: root.canGoBack;
property var goBack: root.goBack;
property alias urlTag: root.urlTag
@@ -22,12 +21,6 @@ Item {
}
*/
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
property alias viewProfile: root.profile
WebEngineView {
@@ -71,10 +64,11 @@ Item {
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
property string newUrl: ""
-
- webChannel.registeredObjects: [eventBridgeWrapper]
+
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);
diff --git a/interface/resources/qml/controls/TabletWebView.qml b/interface/resources/qml/controls/TabletWebView.qml
index 3b23cbc19e..0a5a68717e 100644
--- a/interface/resources/qml/controls/TabletWebView.qml
+++ b/interface/resources/qml/controls/TabletWebView.qml
@@ -17,7 +17,6 @@ Item {
property int headerHeight: 70
property string url
property string scriptURL
- property alias eventBridge: eventBridgeWrapper.eventBridge
property bool keyboardEnabled: false
property bool keyboardRaised: false
property bool punctuationMode: false
@@ -135,12 +134,6 @@ Item {
loadUrl(url);
}
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
WebEngineView {
id: webview
objectName: "webEngineView"
@@ -182,9 +175,9 @@ Item {
property string newUrl: ""
- webChannel.registeredObjects: [eventBridgeWrapper]
-
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);
diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml
index d08562eea3..38136c7eec 100644
--- a/interface/resources/qml/controls/WebView.qml
+++ b/interface/resources/qml/controls/WebView.qml
@@ -6,7 +6,6 @@ import "../controls-uit" as HiFiControls
Item {
property alias url: root.url
property alias scriptURL: root.userScriptUrl
- property alias eventBridge: eventBridgeWrapper.eventBridge
property alias canGoBack: root.canGoBack;
property var goBack: root.goBack;
property alias urlTag: root.urlTag
@@ -22,12 +21,6 @@ Item {
}
*/
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
property alias viewProfile: root.profile
WebEngineView {
@@ -72,9 +65,9 @@ Item {
property string newUrl: ""
- webChannel.registeredObjects: [eventBridgeWrapper]
-
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);
diff --git a/interface/resources/qml/dialogs/TabletLoginDialog.qml b/interface/resources/qml/dialogs/TabletLoginDialog.qml
index 30c3e678b4..36ca480b24 100644
--- a/interface/resources/qml/dialogs/TabletLoginDialog.qml
+++ b/interface/resources/qml/dialogs/TabletLoginDialog.qml
@@ -20,7 +20,6 @@ TabletModalWindow {
id: loginDialogRoot
objectName: "LoginDialog"
- property var eventBridge;
signal sendToScript(var message);
property bool isHMD: false
property bool gotoPreviousApp: false;
diff --git a/interface/resources/qml/dialogs/preferences/AvatarBrowser.qml b/interface/resources/qml/dialogs/preferences/AvatarBrowser.qml
index 652e02b6b9..e2a012ad46 100644
--- a/interface/resources/qml/dialogs/preferences/AvatarBrowser.qml
+++ b/interface/resources/qml/dialogs/preferences/AvatarBrowser.qml
@@ -24,8 +24,6 @@ Window {
resizable: true
modality: Qt.ApplicationModal
- property alias eventBridge: eventBridgeWrapper.eventBridge
-
Item {
anchors.fill: parent
@@ -45,16 +43,6 @@ Window {
bottom: keyboard.top
}
- property alias eventBridgeWrapper: eventBridgeWrapper
-
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
- webChannel.registeredObjects: [eventBridgeWrapper]
-
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
@@ -73,6 +61,10 @@ Window {
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ]
+ Component.onCompleted: {
+ webChannel.registerObject("eventBridge", eventBridge);
+ webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
+ }
}
Keyboard {
diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml
index bcc5a1d9e6..b27827d9d7 100644
--- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml
+++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml
@@ -116,9 +116,7 @@ Preference {
Component {
id: tabletAvatarBrowserBuilder;
- TabletAvatarBrowser {
- eventBridge: tabletRoot.eventBridge
- }
+ TabletAvatarBrowser { }
}
}
diff --git a/interface/resources/qml/hifi/Audio.qml b/interface/resources/qml/hifi/Audio.qml
index 46cec99e69..48de891733 100644
--- a/interface/resources/qml/hifi/Audio.qml
+++ b/interface/resources/qml/hifi/Audio.qml
@@ -31,7 +31,6 @@ Rectangle {
HifiConstants { id: hifi; }
objectName: "AudioWindow"
- property var eventBridge;
property string title: "Audio Options"
signal sendToScript(var message);
diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml
index 2d6b21b219..250015bab9 100644
--- a/interface/resources/qml/hifi/Pal.qml
+++ b/interface/resources/qml/hifi/Pal.qml
@@ -44,7 +44,6 @@ Rectangle {
property var activeTab: "nearbyTab";
property bool currentlyEditingDisplayName: false
property bool punctuationMode: false;
- property var eventBridge;
HifiConstants { id: hifi; }
@@ -1043,7 +1042,6 @@ Rectangle {
} // Keyboard
HifiControls.TabletWebView {
- eventBridge: pal.eventBridge;
id: userInfoViewer;
anchors {
top: parent.top;
diff --git a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml
index 6e0263787b..47c9af1f57 100644
--- a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml
@@ -24,7 +24,6 @@ Rectangle {
property string title: "Asset Browser"
property bool keyboardRaised: false
- property var eventBridge;
signal sendToScript(var message);
property bool isHMD: false
diff --git a/interface/resources/qml/hifi/dialogs/TabletDCDialog.qml b/interface/resources/qml/hifi/dialogs/TabletDCDialog.qml
index b33b957e15..0f363d1be9 100644
--- a/interface/resources/qml/hifi/dialogs/TabletDCDialog.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletDCDialog.qml
@@ -20,7 +20,6 @@ Rectangle {
id: root
objectName: "DCConectionTiming"
- property var eventBridge;
signal sendToScript(var message);
property bool isHMD: false
diff --git a/interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml b/interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml
index d4bbe0af04..22e9dc07a2 100644
--- a/interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml
@@ -19,7 +19,6 @@ Rectangle {
id: root
objectName: "DebugWindow"
- property var eventBridge;
property var title: "Debug Window"
property bool isHMD: false
diff --git a/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml b/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml
index 35ee58be0c..da295917a0 100644
--- a/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml
@@ -20,7 +20,6 @@ Rectangle {
id: root
objectName: "EntityStatistics"
- property var eventBridge;
signal sendToScript(var message);
property bool isHMD: false
diff --git a/interface/resources/qml/hifi/dialogs/TabletLODTools.qml b/interface/resources/qml/hifi/dialogs/TabletLODTools.qml
index 26e9759e0d..2291a42bf6 100644
--- a/interface/resources/qml/hifi/dialogs/TabletLODTools.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletLODTools.qml
@@ -20,7 +20,6 @@ Rectangle {
id: root
objectName: "LODTools"
- property var eventBridge;
signal sendToScript(var message);
property bool isHMD: false
diff --git a/interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml b/interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml
index d826b40ad1..11643ae1f1 100644
--- a/interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml
@@ -23,7 +23,6 @@ Rectangle {
property string title: "Running Scripts"
HifiConstants { id: hifi }
signal sendToScript(var message);
- property var eventBridge;
property var scripts: ScriptDiscoveryService;
property var scriptsModel: scripts.scriptsModelFilter
property var runningScriptsModel: ListModel { }
diff --git a/interface/resources/qml/hifi/tablet/Edit.qml b/interface/resources/qml/hifi/tablet/Edit.qml
index ea31eb26d8..e2e8c4362e 100644
--- a/interface/resources/qml/hifi/tablet/Edit.qml
+++ b/interface/resources/qml/hifi/tablet/Edit.qml
@@ -7,14 +7,12 @@ StackView {
objectName: "stack"
initialItem: Qt.resolvedUrl('EditTabView.qml')
- property var eventBridge;
signal sendToScript(var message);
HifiConstants { id: hifi }
function pushSource(path) {
editRoot.push(Qt.resolvedUrl(path));
- editRoot.currentItem.eventBridge = editRoot.eventBridge;
editRoot.currentItem.sendToScript.connect(editRoot.sendToScript);
}
diff --git a/interface/resources/qml/hifi/tablet/EditTabView.qml b/interface/resources/qml/hifi/tablet/EditTabView.qml
index d084f1c7b3..e4a20a0316 100644
--- a/interface/resources/qml/hifi/tablet/EditTabView.qml
+++ b/interface/resources/qml/hifi/tablet/EditTabView.qml
@@ -181,7 +181,6 @@ TabView {
WebView {
id: entityListToolWebView
url: "../../../../../scripts/system/html/entityList.html"
- eventBridge: editRoot.eventBridge
anchors.fill: parent
enabled: true
}
@@ -196,7 +195,6 @@ TabView {
WebView {
id: entityPropertiesWebView
url: "../../../../../scripts/system/html/entityProperties.html"
- eventBridge: editRoot.eventBridge
anchors.fill: parent
enabled: true
}
@@ -211,7 +209,6 @@ TabView {
WebView {
id: gridControlsWebView
url: "../../../../../scripts/system/html/gridControls.html"
- eventBridge: editRoot.eventBridge
anchors.fill: parent
enabled: true
}
@@ -226,7 +223,6 @@ TabView {
WebView {
id: particleExplorerWebView
url: "../../../../../scripts/system/particle_explorer/particleExplorer.html"
- eventBridge: editRoot.eventBridge
anchors.fill: parent
enabled: true
}
@@ -289,7 +285,7 @@ TabView {
editTabView.currentIndex = id;
} else {
console.warn('Attempt to switch to invalid tab:', id);
- }
+ }
} else if (typeof id === 'string'){
switch (id.toLowerCase()) {
case 'create':
diff --git a/interface/resources/qml/hifi/tablet/InputRecorder.qml b/interface/resources/qml/hifi/tablet/InputRecorder.qml
index 76b122d07d..292deb751e 100644
--- a/interface/resources/qml/hifi/tablet/InputRecorder.qml
+++ b/interface/resources/qml/hifi/tablet/InputRecorder.qml
@@ -18,7 +18,6 @@ import "../../dialogs"
Rectangle {
id: inputRecorder
- property var eventBridge;
HifiConstants { id: hifi }
signal sendToScript(var message);
color: hifi.colors.baseGray;
diff --git a/interface/resources/qml/hifi/tablet/NewModelDialog.qml b/interface/resources/qml/hifi/tablet/NewModelDialog.qml
index 2d9d121209..5040c043f4 100644
--- a/interface/resources/qml/hifi/tablet/NewModelDialog.qml
+++ b/interface/resources/qml/hifi/tablet/NewModelDialog.qml
@@ -20,7 +20,6 @@ Rectangle {
// height: parent.height
HifiConstants { id: hifi }
color: hifi.colors.baseGray;
- property var eventBridge;
signal sendToScript(var message);
property bool keyboardEnabled: false
property bool punctuationMode: false
diff --git a/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml b/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml
index 7159b078ee..073f143dbe 100644
--- a/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml
+++ b/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml
@@ -29,7 +29,6 @@ StackView {
initialItem: addressBarDialog
width: parent !== null ? parent.width : undefined
height: parent !== null ? parent.height : undefined
- property var eventBridge;
property int cardWidth: 212;
property int cardHeight: 152;
property string metaverseBase: addressBarDialog.metaverseServerUrl + "/api/v1/";
@@ -80,7 +79,6 @@ StackView {
var card = tabletWebView.createObject();
card.url = addressBarDialog.metaverseServerUrl + targetString;
card.parentStackItem = root;
- card.eventBridge = root.eventBridge;
root.push(card);
return;
}
diff --git a/interface/resources/qml/hifi/tablet/TabletAttachmentsDialog.qml b/interface/resources/qml/hifi/tablet/TabletAttachmentsDialog.qml
index 634c9d41ec..19548365aa 100644
--- a/interface/resources/qml/hifi/tablet/TabletAttachmentsDialog.qml
+++ b/interface/resources/qml/hifi/tablet/TabletAttachmentsDialog.qml
@@ -25,7 +25,6 @@ Item {
property bool keyboardRaised: false
property bool punctuationMode: false
- property var eventBridge;
signal sendToScript(var message);
anchors.fill: parent
diff --git a/interface/resources/qml/hifi/tablet/TabletAudioPreferences.qml b/interface/resources/qml/hifi/tablet/TabletAudioPreferences.qml
index 2046071e4c..b30e741be9 100644
--- a/interface/resources/qml/hifi/tablet/TabletAudioPreferences.qml
+++ b/interface/resources/qml/hifi/tablet/TabletAudioPreferences.qml
@@ -19,7 +19,6 @@ StackView {
objectName: "stack"
property string title: "Audio Settings"
- property var eventBridge;
signal sendToScript(var message);
function pushSource(path) {
diff --git a/interface/resources/qml/hifi/tablet/TabletAvatarPreferences.qml b/interface/resources/qml/hifi/tablet/TabletAvatarPreferences.qml
index 75973f32ae..94fb29c6a1 100644
--- a/interface/resources/qml/hifi/tablet/TabletAvatarPreferences.qml
+++ b/interface/resources/qml/hifi/tablet/TabletAvatarPreferences.qml
@@ -19,7 +19,6 @@ StackView {
objectName: "stack"
property string title: "Avatar Settings"
- property var eventBridge;
signal sendToScript(var message);
function pushSource(path) {
diff --git a/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml b/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml
index 17d3f1b959..fe043f6ac7 100644
--- a/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml
+++ b/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml
@@ -19,7 +19,6 @@ StackView {
objectName: "stack"
property string title: "General Settings"
property alias gotoPreviousApp: root.gotoPreviousApp;
- property var eventBridge;
signal sendToScript(var message);
function pushSource(path) {
diff --git a/interface/resources/qml/hifi/tablet/TabletGraphicsPreferences.qml b/interface/resources/qml/hifi/tablet/TabletGraphicsPreferences.qml
index 95ee2c3a72..25b5be05f2 100644
--- a/interface/resources/qml/hifi/tablet/TabletGraphicsPreferences.qml
+++ b/interface/resources/qml/hifi/tablet/TabletGraphicsPreferences.qml
@@ -19,7 +19,6 @@ StackView {
objectName: "stack"
property string title: "Graphics Settings"
- property var eventBridge;
signal sendToScript(var message);
function pushSource(path) {
diff --git a/interface/resources/qml/hifi/tablet/TabletLodPreferences.qml b/interface/resources/qml/hifi/tablet/TabletLodPreferences.qml
index 6f38fee8b9..b502c26245 100644
--- a/interface/resources/qml/hifi/tablet/TabletLodPreferences.qml
+++ b/interface/resources/qml/hifi/tablet/TabletLodPreferences.qml
@@ -19,7 +19,6 @@ StackView {
objectName: "stack"
property string title: "LOD Settings"
- property var eventBridge;
signal sendToScript(var message);
function pushSource(path) {
diff --git a/interface/resources/qml/hifi/tablet/TabletMenu.qml b/interface/resources/qml/hifi/tablet/TabletMenu.qml
index 62b61d129b..457fe84c3a 100644
--- a/interface/resources/qml/hifi/tablet/TabletMenu.qml
+++ b/interface/resources/qml/hifi/tablet/TabletMenu.qml
@@ -21,7 +21,6 @@ FocusScope {
property var point: Qt.point(50, 50);
TabletMenuStack { id: menuPopperUpper }
property string subMenu: ""
- property var eventBridge;
signal sendToScript(var message);
Rectangle {
diff --git a/interface/resources/qml/hifi/tablet/TabletMenuStack.qml b/interface/resources/qml/hifi/tablet/TabletMenuStack.qml
index bacc11228e..2fd33e9cbc 100644
--- a/interface/resources/qml/hifi/tablet/TabletMenuStack.qml
+++ b/interface/resources/qml/hifi/tablet/TabletMenuStack.qml
@@ -49,7 +49,6 @@ Item {
function pushSource(path) {
d.push(Qt.resolvedUrl(path));
- d.currentItem.eventBridge = tabletMenu.eventBridge
d.currentItem.sendToScript.connect(tabletMenu.sendToScript);
d.currentItem.focus = true;
d.currentItem.forceActiveFocus();
diff --git a/interface/resources/qml/hifi/tablet/TabletNetworkingPreferences.qml b/interface/resources/qml/hifi/tablet/TabletNetworkingPreferences.qml
index 7184d91044..91d6140fc3 100644
--- a/interface/resources/qml/hifi/tablet/TabletNetworkingPreferences.qml
+++ b/interface/resources/qml/hifi/tablet/TabletNetworkingPreferences.qml
@@ -19,7 +19,6 @@ StackView {
objectName: "stack"
property var title: "Networking Settings"
- property var eventBridge;
signal sendToScript(var message);
function pushSource(path) {
diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml
index e7654d9ff1..b6cdce0853 100644
--- a/interface/resources/qml/hifi/tablet/TabletRoot.qml
+++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml
@@ -8,7 +8,6 @@ Item {
id: tabletRoot
objectName: "tabletRoot"
property string username: "Unknown user"
- property var eventBridge;
property var rootMenu;
property var openModal: null;
property var openMessage: null;
@@ -111,7 +110,6 @@ Item {
function openBrowserWindow(request, profile) {
var component = Qt.createComponent("../../controls/TabletWebView.qml");
var newWindow = component.createObject(tabletRoot);
- newWindow.eventBridge = tabletRoot.eventBridge;
newWindow.remove = true;
newWindow.profile = profile;
request.openIn(newWindow.webView);
@@ -175,7 +173,7 @@ Item {
// Hook up callback for clara.io download from the marketplace.
Connections {
id: eventBridgeConnection
- target: null
+ target: eventBridge
onWebEventReceived: {
if (message.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(message.slice(18));
@@ -184,10 +182,6 @@ Item {
}
onLoaded: {
- if (loader.item.hasOwnProperty("eventBridge")) {
- loader.item.eventBridge = eventBridge;
- eventBridgeConnection.target = eventBridge
- }
if (loader.item.hasOwnProperty("sendToScript")) {
loader.item.sendToScript.connect(tabletRoot.sendToScript);
}
diff --git a/interface/resources/qml/hifi/tablet/WindowRoot.qml b/interface/resources/qml/hifi/tablet/WindowRoot.qml
index ee8dbbff59..12f302d60a 100644
--- a/interface/resources/qml/hifi/tablet/WindowRoot.qml
+++ b/interface/resources/qml/hifi/tablet/WindowRoot.qml
@@ -18,7 +18,6 @@ Windows.ScrollingWindow {
id: tabletRoot
objectName: "tabletRoot"
property string username: "Unknown user"
- property var eventBridge;
property var rootMenu;
property string subMenu: ""
@@ -93,7 +92,7 @@ Windows.ScrollingWindow {
// Hook up callback for clara.io download from the marketplace.
Connections {
id: eventBridgeConnection
- target: null
+ target: eventBridge
onWebEventReceived: {
if (message.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(message.slice(18));
@@ -102,10 +101,6 @@ Windows.ScrollingWindow {
}
onLoaded: {
- if (loader.item.hasOwnProperty("eventBridge")) {
- loader.item.eventBridge = eventBridge;
- eventBridgeConnection.target = eventBridge
- }
if (loader.item.hasOwnProperty("sendToScript")) {
loader.item.sendToScript.connect(tabletRoot.sendToScript);
}
diff --git a/interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletAvatarBrowser.qml b/interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletAvatarBrowser.qml
index 029cf7d46b..cab76bf818 100644
--- a/interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletAvatarBrowser.qml
+++ b/interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletAvatarBrowser.qml
@@ -27,8 +27,6 @@ Item {
property bool keyboardRaised: false
property bool punctuationMode: false
- property alias eventBridge: eventBridgeWrapper.eventBridge
-
anchors.fill: parent
BaseWebView {
@@ -43,14 +41,6 @@ Item {
bottom: footer.top
}
- QtObject {
- id: eventBridgeWrapper
- WebChannel.id: "eventBridgeWrapper"
- property var eventBridge;
- }
-
- webChannel.registeredObjects: [eventBridgeWrapper]
-
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
@@ -68,6 +58,11 @@ Item {
}
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ]
+
+ Component.onCompleted: {
+ webChannel.registerObject("eventBridge", eventBridge);
+ webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
+ }
}
Rectangle {
diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp
index 65c311424f..9dcc1d7991 100644
--- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp
+++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp
@@ -277,6 +277,23 @@ QString getEventBridgeJavascript() {
return javaScriptToInject;
}
+class EventBridgeWrapper : public QObject {
+ Q_OBJECT
+ Q_PROPERTY(QObject* eventBridge READ getEventBridge CONSTANT);
+
+public:
+ EventBridgeWrapper(QObject* eventBridge, QObject* parent = nullptr) : QObject(parent), _eventBridge(eventBridge) {
+ }
+
+ QObject* getEventBridge() {
+ return _eventBridge;
+ }
+
+private:
+ QObject* _eventBridge;
+};
+
+
QQmlEngine* acquireEngine(QQuickWindow* window) {
Q_ASSERT(QThread::currentThread() == qApp->thread());
@@ -430,7 +447,6 @@ OffscreenQmlSurface::~OffscreenQmlSurface() {
_canvas->deleteLater();
_rootItem->deleteLater();
- _qmlComponent->deleteLater();
_quickWindow->deleteLater();
releaseEngine();
}
@@ -473,11 +489,12 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) {
_qmlContext = new QQmlContext(qmlEngine->rootContext());
_qmlContext->setContextProperty("offscreenWindow", QVariant::fromValue(getWindow()));
- _qmlContext->setContextProperty("globalEventBridge", this);
+ _qmlContext->setContextProperty("eventBridge", this);
_qmlContext->setContextProperty("webEntity", this);
- _qmlComponent = new QQmlComponent(qmlEngine);
-
+ // FIXME Compatibility mechanism for existing HTML and JS that uses eventBridgeWrapper
+ // Find a way to flag older scripts using this mechanism and wanr that this is deprecated
+ _qmlContext->setContextProperty("eventBridgeWrapper", new EventBridgeWrapper(this, _qmlContext));
if (!_canvas->makeCurrent()) {
qWarning("Failed to make context current for QML Renderer");
@@ -577,71 +594,79 @@ void OffscreenQmlSurface::setBaseUrl(const QUrl& baseUrl) {
_qmlContext->setBaseUrl(baseUrl);
}
-QObject* OffscreenQmlSurface::load(const QUrl& qmlSource, std::function f) {
+QObject* OffscreenQmlSurface::load(const QUrl& qmlSource, bool createNewContext, std::function f) {
// Synchronous loading may take a while; restart the deadlock timer
QMetaObject::invokeMethod(qApp, "updateHeartbeat", Qt::DirectConnection);
- if ((qmlSource.isRelative() && !qmlSource.isEmpty()) || qmlSource.scheme() == QLatin1String("file")) {
- _qmlComponent->loadUrl(_qmlContext->resolvedUrl(qmlSource), QQmlComponent::PreferSynchronous);
- } else {
- _qmlComponent->loadUrl(qmlSource, QQmlComponent::PreferSynchronous);
+ QQmlContext* targetContext = _qmlContext;
+ if (_rootItem && createNewContext) {
+ targetContext = new QQmlContext(targetContext);
}
+ QUrl finalQmlSource = qmlSource;
+ if ((qmlSource.isRelative() && !qmlSource.isEmpty()) || qmlSource.scheme() == QLatin1String("file")) {
+ finalQmlSource = _qmlContext->resolvedUrl(qmlSource);
+ }
- if (_qmlComponent->isLoading()) {
- connect(_qmlComponent, &QQmlComponent::statusChanged, this,
- [this, f](QQmlComponent::Status){
- finishQmlLoad(f);
- });
+ auto qmlComponent = new QQmlComponent(_qmlContext->engine(), finalQmlSource, QQmlComponent::PreferSynchronous);
+ if (qmlComponent->isLoading()) {
+ connect(qmlComponent, &QQmlComponent::statusChanged, this,
+ [this, qmlComponent, targetContext, f](QQmlComponent::Status) {
+ finishQmlLoad(qmlComponent, targetContext, f);
+ });
return nullptr;
}
- return finishQmlLoad(f);
+ return finishQmlLoad(qmlComponent, targetContext, f);
+}
+
+QObject* OffscreenQmlSurface::loadInNewContext(const QUrl& qmlSource, std::function f) {
+ return load(qmlSource, true, f);
+}
+
+QObject* OffscreenQmlSurface::load(const QUrl& qmlSource, std::function f) {
+ return load(qmlSource, false, f);
}
void OffscreenQmlSurface::clearCache() {
_qmlContext->engine()->clearComponentCache();
}
-QObject* OffscreenQmlSurface::finishQmlLoad(std::function f) {
-#if 0
- if (!_rootItem) {
- QQmlComponent component(_qmlContext->engine());
- component.setData(R"QML(
-import QtQuick 2.0
-import QtWebChannel 1.0
-Item { Component.onCompleted: globalEventBridge.WebChannel.id = "globalEventBridge"; }
-)QML", QUrl());
- QObject *helper = component.create(_qmlContext);
- qDebug() << "Created helper";
- }
-#endif
- disconnect(_qmlComponent, &QQmlComponent::statusChanged, this, 0);
- if (_qmlComponent->isError()) {
- QList errorList = _qmlComponent->errors();
- foreach(const QQmlError& error, errorList) {
- qWarning() << error.url() << error.line() << error;
+QObject* OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext* qmlContext, std::function f) {
+ disconnect(qmlComponent, &QQmlComponent::statusChanged, this, 0);
+ if (qmlComponent->isError()) {
+ for (const auto& error : qmlComponent->errors()) {
+ qCWarning(glLogging) << error.url() << error.line() << error;
}
+ qmlComponent->deleteLater();
return nullptr;
}
- QObject* newObject = _qmlComponent->beginCreate(_qmlContext);
- if (_qmlComponent->isError()) {
- QList errorList = _qmlComponent->errors();
- foreach(const QQmlError& error, errorList)
+ QObject* newObject = qmlComponent->beginCreate(qmlContext);
+ if (qmlComponent->isError()) {
+ for (const auto& error : qmlComponent->errors()) {
qCWarning(glLogging) << error.url() << error.line() << error;
+ }
if (!_rootItem) {
qFatal("Unable to finish loading QML root");
}
+ qmlComponent->deleteLater();
return nullptr;
}
- _qmlContext->engine()->setObjectOwnership(this, QQmlEngine::CppOwnership);
- newObject->setProperty("eventBridge", QVariant::fromValue(this));
+ qmlContext->engine()->setObjectOwnership(this, QQmlEngine::CppOwnership);
+ f(qmlContext, newObject);
- f(_qmlContext, newObject);
- _qmlComponent->completeCreate();
+ QObject* eventBridge = qmlContext->contextProperty("eventBridge").value();
+ if (qmlContext != _qmlContext && eventBridge && eventBridge != this) {
+ // FIXME Compatibility mechanism for existing HTML and JS that uses eventBridgeWrapper
+ // Find a way to flag older scripts using this mechanism and wanr that this is deprecated
+ qmlContext->setContextProperty("eventBridgeWrapper", new EventBridgeWrapper(eventBridge, qmlContext));
+ }
+
+ qmlComponent->completeCreate();
+ qmlComponent->deleteLater();
// All quick items should be focusable
diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h
index 2a078d2b4f..ae81ae48b4 100644
--- a/libraries/gl/src/gl/OffscreenQmlSurface.h
+++ b/libraries/gl/src/gl/OffscreenQmlSurface.h
@@ -48,6 +48,8 @@ public:
void resize(const QSize& size, bool forceResize = false);
QSize size() const;
+ Q_INVOKABLE QObject* load(const QUrl& qmlSource, bool createNewContext, std::function f = [](QQmlContext*, QObject*) {});
+ Q_INVOKABLE QObject* loadInNewContext(const QUrl& qmlSource, std::function f = [](QQmlContext*, QObject*) {});
Q_INVOKABLE QObject* load(const QUrl& qmlSource, std::function f = [](QQmlContext*, QObject*) {});
Q_INVOKABLE QObject* load(const QString& qmlSourceFile, std::function f = [](QQmlContext*, QObject*) {}) {
return load(QUrl(qmlSourceFile), f);
@@ -118,7 +120,7 @@ protected:
void setFocusText(bool newFocusText);
private:
- QObject* finishQmlLoad(std::function f);
+ QObject* finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext* qmlContext, std::function f);
QPointF mapWindowToUi(const QPointF& sourcePosition, QObject* sourceObject);
void setupFbo();
bool allowNewFrame(uint8_t fps);
@@ -134,7 +136,6 @@ private:
QQuickWindow* _quickWindow { nullptr };
QMyQuickRenderControl* _renderControl{ nullptr };
QQmlContext* _qmlContext { nullptr };
- QQmlComponent* _qmlComponent { nullptr };
QQuickItem* _rootItem { nullptr };
OffscreenGLCanvas* _canvas { nullptr };
diff --git a/libraries/ui/src/QmlWindowClass.cpp b/libraries/ui/src/QmlWindowClass.cpp
index c0e94058ae..58d39448ac 100644
--- a/libraries/ui/src/QmlWindowClass.cpp
+++ b/libraries/ui/src/QmlWindowClass.cpp
@@ -104,9 +104,9 @@ void QmlWindowClass::initQml(QVariantMap properties) {
Q_ASSERT(invokeResult);
} else {
// Build the event bridge and wrapper on the main thread
- offscreenUi->load(qmlSource(), [&](QQmlContext* context, QObject* object) {
+ offscreenUi->loadInNewContext(qmlSource(), [&](QQmlContext* context, QObject* object) {
_qmlWindow = object;
- _qmlWindow->setProperty("eventBridge", QVariant::fromValue(this));
+ context->setContextProperty("eventBridge", this);
context->engine()->setObjectOwnership(this, QQmlEngine::CppOwnership);
context->engine()->setObjectOwnership(object, QQmlEngine::CppOwnership);
if (properties.contains(TITLE_PROPERTY)) {
diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp
index b5fa7cadad..7330daf228 100644
--- a/plugins/openvr/src/ViveControllerManager.cpp
+++ b/plugins/openvr/src/ViveControllerManager.cpp
@@ -123,15 +123,18 @@ bool ViveControllerManager::isSupported() const {
bool ViveControllerManager::activate() {
InputPlugin::activate();
- _container->addMenu(MENU_PATH);
- _container->addMenuItem(PluginType::INPUT_PLUGIN, MENU_PATH, RENDER_CONTROLLERS,
- [this] (bool clicked) { this->setRenderControllers(clicked); },
- true, true);
-
if (!_system) {
_system = acquireOpenVrSystem();
}
- Q_ASSERT(_system);
+
+ if (!_system) {
+ return false;
+ }
+
+ _container->addMenu(MENU_PATH);
+ _container->addMenuItem(PluginType::INPUT_PLUGIN, MENU_PATH, RENDER_CONTROLLERS,
+ [this](bool clicked) { this->setRenderControllers(clicked); },
+ true, true);
enableOpenVrKeyboard(_container);
diff --git a/scripts/system/html/js/eventBridgeLoader.js b/scripts/system/html/js/eventBridgeLoader.js
index 0e95345b40..411780853b 100644
--- a/scripts/system/html/js/eventBridgeLoader.js
+++ b/scripts/system/html/js/eventBridgeLoader.js
@@ -13,7 +13,7 @@ var WebChannel;
openEventBridge = function(callback) {
WebChannel = new QWebChannel(qt.webChannelTransport, function (channel) {
- EventBridge = WebChannel.objects.eventBridgeWrapper.eventBridge;
+ EventBridge = WebChannel.objects.eventBridge;
callback(EventBridge);
});
}