summaryrefslogtreecommitdiff
path: root/src/MetaObjectPublisher.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/MetaObjectPublisher.qml')
-rw-r--r--src/MetaObjectPublisher.qml59
1 files changed, 58 insertions, 1 deletions
diff --git a/src/MetaObjectPublisher.qml b/src/MetaObjectPublisher.qml
index 2b97c02..226e0a3 100644
--- a/src/MetaObjectPublisher.qml
+++ b/src/MetaObjectPublisher.qml
@@ -78,6 +78,25 @@ MetaObjectPublisherImpl
// object info map set.
property bool propertyUpdatesInitialized: false
+ /**
+ * Wrap a result value if it's a Qt QObject
+ *
+ * @return object info for wrapped Qt Object,
+ * or the same value if no wrapping needed
+ *
+ */
+ function wrapResult(result)
+ {
+ if (typeof(result) === "object"
+ && result["objectName"] !== undefined)
+ {
+ var ret = wrapObject(result);
+ initializePropertyUpdates(ret.id, ret.data, result, webChannel);
+ return ret;
+ }
+ return result;
+ }
+
function convertQMLArgsToJSArgs(qmlArgs)
{
// NOTE: QML arguments is a map not an array it seems...
@@ -106,12 +125,26 @@ MetaObjectPublisherImpl
}
if (payload.object) {
+ var isWrapped = false;
var object = registeredObjects[payload.object];
+ if (!object) {
+ object = unwrapObject(payload.object);
+ if (object)
+ isWrapped = true;
+ else
+ return false
+ }
if (payload.type === "Qt.invokeMethod") {
var method = object[payload.method];
if (method !== undefined) {
- webChannel.respond(message.id, method.apply(method, payload.args));
+ webChannel.respond(message.id,
+ wrapResult(method.apply(method, payload.args)));
+ return true;
+ }
+ if (isWrapped && payload.method === "deleteLater") {
+ // invoke `deleteLater` on wrapped QObject indirectly
+ deleteWrappedObject(object);
return true;
}
return false;
@@ -135,6 +168,11 @@ MetaObjectPublisherImpl
}
return true;
}
+ // connecting to `destroyed` signal of wrapped QObject
+ if (isWrapped && payload.signal === "destroyed") {
+ // is a no-op on this side
+ return true;
+ }
return false;
}
if (payload.type === "Qt.setProperty") {
@@ -248,6 +286,13 @@ MetaObjectPublisherImpl
var data = [];
for (var objectName in pendingPropertyUpdates) {
var object = registeredObjects[objectName];
+ if (!object) {
+ object = unwrapObject(objectName);
+ if (!object) {
+ console.error("Got property update for unknown object " + objectName);
+ continue;
+ }
+ }
var signals = pendingPropertyUpdates[objectName];
var propertyMap = {};
for (var signalName in signals) {
@@ -291,6 +336,18 @@ MetaObjectPublisherImpl
}
}
+ onWrappedObjectDestroyed: { // (const QString& id)
+ // act as if object had sent `destroyed` signal
+ webChannel.sendMessage("Qt.signal", {
+ object: id,
+ signal: "destroyed",
+ args: []
+ });
+ delete subscriberCountMap[id];
+ delete pendingPropertyUpdates[id];
+ delete signalToPropertyMap[id]
+ }
+
/**
* Aggregate property updates since we get multiple Qt.idle message when we have multiple
* clients. They all share the same QWebProcess though so we must take special care to