3 #include "cachedhttp.h"
8 CachedHttp *cachedHttp = new CachedHttp(Http::instance(), "js");
9 cachedHttp->setMaxSeconds(3600);
10 // Avoid expiring the cached js
11 cachedHttp->setMaxSize(0);
13 cachedHttp->getValidators().insert("application/javascript", [](const auto &reply) -> bool {
14 return !reply.body().isEmpty();
24 static thread_local JS i;
28 JS::JS(QObject *parent) : QObject(parent), engine(nullptr) {}
30 void JS::initialize(const QUrl &url) {
35 bool JS::checkError(const QJSValue &value) {
36 if (value.isError()) {
37 qWarning() << "Error" << value.toString();
38 qDebug() << value.property("stack").toString().splitRef('\n');
44 bool JS::isInitialized() {
45 if (ready) return true;
50 JSResult &JS::callFunction(JSResult *result, const QString &name, const QJSValueList &args) {
51 if (!isInitialized()) {
52 qDebug() << "Not initialized";
53 QTimer::singleShot(1000, this,
54 [this, result, name, args] { callFunction(result, name, args); });
58 auto function = engine->evaluate(name);
59 if (!function.isCallable()) {
60 qWarning() << function.toString() << " is not callable";
61 QTimer::singleShot(0, result, [result, function] { result->setError(function); });
66 args2.prepend(engine->newQObject(result));
67 qDebug() << "Calling" << function.toString();
68 auto v = function.call(args2);
69 if (checkError(v)) QTimer::singleShot(0, result, [result, v] { result->setError(v); });
74 void JS::initialize() {
76 qDebug() << "No js url set";
80 if (initializing) return;
82 qDebug() << "Initializing";
84 if (engine) engine->deleteLater();
85 engine = new QQmlEngine(this);
86 engine->setNetworkAccessManagerFactory(&namFactory);
87 engine->globalObject().setProperty("global", engine->globalObject());
89 QJSValue timer = engine->newQObject(new JSTimer(engine));
90 engine->globalObject().setProperty("setTimeoutQt", timer.property("setTimeout"));
91 QJSValue setTimeoutWrapperFunction =
92 engine->evaluate("function setTimeout(cb, delay) {"
93 "const args = Array.prototype.slice.call(arguments, 2);"
94 "return setTimeoutQt(cb, delay, args);"
96 checkError(setTimeoutWrapperFunction);
97 engine->globalObject().setProperty("clearTimeout", timer.property("clearTimeout"));
99 connect(cachedHttp().get(url), &HttpReply::finished, this, [this](auto &reply) {
100 if (!reply.isSuccessful()) {
101 emit initFailed("Cannot load JS");
102 qDebug() << "Cannot load JS";
103 initializing = false;
106 auto value = engine->evaluate(reply.body());
107 if (!checkError(value)) {
108 qDebug() << "Initialized";
112 initializing = false;