summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/jskitmanager.cpp20
-rw-r--r--daemon/jskitobjects.cpp23
-rw-r--r--daemon/jskitobjects.h3
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;