diff options
| -rw-r--r-- | daemon/jskitmanager.cpp | 20 | ||||
| -rw-r--r-- | daemon/jskitobjects.cpp | 23 | ||||
| -rw-r--r-- | daemon/jskitobjects.h | 3 |
3 files changed, 34 insertions, 12 deletions
diff --git a/daemon/jskitmanager.cpp b/daemon/jskitmanager.cpp index 9c739fc..d632f7b 100644 --- a/daemon/jskitmanager.cpp +++ b/daemon/jskitmanager.cpp @@ -40,6 +40,7 @@ QString JSKitManager::describeError(QJSValue error) void JSKitManager::showConfiguration() { if (_engine) { + logger()->debug() << "requesting configuration"; _jspebble->invokeCallbacks("showConfiguration"); } else { logger()->warn() << "requested to show configuration, but JS engine is not running"; @@ -129,7 +130,11 @@ void JSKitManager::startJsApp() navigatorObj.setProperty("geolocation", _engine->newQObject(_jsgeo)); globalObj.setProperty("navigator", navigatorObj); - _engine->evaluate("function XMLHttpRequest() { return Pebble.createXMLHttpRequest(); }"); + // Shims for compatibility... + QJSValue result = _engine->evaluate( + "function XMLHttpRequest() { return Pebble.createXMLHttpRequest(); }\n" + ); + Q_ASSERT(!result.isError()); QFile scriptFile(_curApp.path() + "/pebble-js-app.js"); if (!scriptFile.open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -140,7 +145,7 @@ void JSKitManager::startJsApp() QString script = QString::fromUtf8(scriptFile.readAll()); - QJSValue result = _engine->evaluate(script, scriptFile.fileName()); + result = _engine->evaluate(script, scriptFile.fileName()); if (result.isError()) { logger()->warn() << "error while evaluating JSKit script:" << describeError(result); } @@ -158,12 +163,13 @@ void JSKitManager::stopJsApp() _engine->collectGarbage(); - delete _engine; + _engine->deleteLater(); _engine = 0; - delete _jsstorage; + _jsstorage->deleteLater(); _jsstorage = 0; - delete _jspebble; - _jspebble = 0; - delete _jsgeo; + _jsgeo->deleteLater(); _jsgeo = 0; + _jspebble->deleteLater(); + _jspebble = 0; + } diff --git a/daemon/jskitobjects.cpp b/daemon/jskitobjects.cpp index b3820b5..1fc0062 100644 --- a/daemon/jskitobjects.cpp +++ b/daemon/jskitobjects.cpp @@ -43,7 +43,7 @@ void JSKitPebble::sendAppMessage(QJSValue message, QJSValue callbackForAck, QJSV _mgr->_appmsg->send(_appInfo.uuid(), data, [this, callbackForAck]() mutable { if (callbackForAck.isCallable()) { logger()->debug() << "Invoking ack callback"; - QJSValue result = callbackForAck.call(); + QJSValue result = callbackForAck.call(QJSValueList({buildAckEventObject()})); if (result.isError()) { logger()->warn() << "error while invoking ACK callback" << callbackForAck.toString() << ":" << JSKitManager::describeError(result); @@ -54,7 +54,7 @@ void JSKitPebble::sendAppMessage(QJSValue message, QJSValue callbackForAck, QJSV }, [this, callbackForNack]() mutable { if (callbackForNack.isCallable()) { logger()->debug() << "Invoking nack callback"; - QJSValue result = callbackForNack.call(); + QJSValue result = callbackForNack.call(QJSValueList({buildAckEventObject()})); if (result.isError()) { logger()->warn() << "error while invoking NACK callback" << callbackForNack.toString() << ":" << JSKitManager::describeError(result); @@ -84,6 +84,20 @@ QJSValue JSKitPebble::createXMLHttpRequest() return _mgr->engine()->newQObject(xhr); } +QJSValue JSKitPebble::buildAckEventObject() const +{ + QJSEngine *engine = _mgr->engine(); + QJSValue eventObj = engine->newObject(); + QJSValue dataObj = engine->newObject(); + + // Why do scripts need the real transactionId? + // No idea. Just fake it. + dataObj.setProperty("transactionId", engine->toScriptValue(0)); + eventObj.setProperty("data", dataObj); + + return eventObj; +} + void JSKitPebble::invokeCallbacks(const QString &type, const QJSValueList &args) { if (!_callbacks.contains(type)) return; @@ -346,11 +360,12 @@ void JSKitGeolocation::handleError(QGeoPositionInfoSource::Error error) void JSKitGeolocation::handlePosition(const QGeoPositionInfo &pos) { - logger()->debug() << Q_FUNC_INFO; if (_watches.empty()) { logger()->warn() << "got position update but no one is watching"; } + logger()->debug() << "got position at" << pos.timestamp() << "type" << pos.coordinate().type(); + QJSValue obj = buildPositionObject(pos); for (auto it = _watches.begin(); it != _watches.end(); /*no adv*/) { @@ -507,8 +522,6 @@ QJSValue JSKitGeolocation::buildPositionObject(const QGeoPositionInfo &pos) obj.setProperty("coords", coords); obj.setProperty("timestamp", timestamp); - logger()->debug() << obj.toString(); - return obj; } diff --git a/daemon/jskitobjects.h b/daemon/jskitobjects.h index 0dccc05..5f039c1 100644 --- a/daemon/jskitobjects.h +++ b/daemon/jskitobjects.h @@ -29,6 +29,9 @@ public: void invokeCallbacks(const QString &type, const QJSValueList &args = QJSValueList()); private: + QJSValue buildAckEventObject() const; + +private: AppInfo _appInfo; JSKitManager *_mgr; QHash<QString, QList<QJSValue>> _callbacks; |
