1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-21 17:52:10 +02:00

GreaseMonkey: Rewrite values bridge to pass values as QString

Passing QVariant/QJsonValue is broken in QWebChannel (QtWebEngine?)
This commit is contained in:
David Rosca 2018-01-03 19:15:50 +01:00
parent b8f9c7e15d
commit 30bad61eea
5 changed files with 43 additions and 56 deletions

View File

@ -36,6 +36,35 @@ var asyncCall = (func) => {
}
};
var decode = (val) => {
val = String(val);
if (!val.length) {
return val;
}
var v = val.substr(1);
if (val[0] == "b") {
return Boolean(v == "true" ? true : false);
} else if (val[0] == "i") {
return Number(v);
} else if (val[0] == "s") {
return v;
} else {
return undefined;
}
};
var encode = (val) => {
if (typeof val == "boolean") {
return "b" + (val ? "true" : "false");
} else if (typeof val == "number") {
return "i" + String(val);
} else if (typeof val == "string") {
return "s" + val;
} else {
return "";
}
};
GM.deleteValue = function(name) {
return new Promise((resolve, reject) => {
asyncCall(() => {
@ -53,7 +82,9 @@ GM.deleteValue = function(name) {
GM.getValue = function(name, value) {
return new Promise((resolve) => {
asyncCall(() => {
external.extra.greasemonkey.getValue("%1", name, value, resolve);
external.extra.greasemonkey.getValue("%1", name, encode(value), (res) => {
resolve(decode(res));
});
});
});
};
@ -61,7 +92,7 @@ GM.getValue = function(name, value) {
GM.setValue = function(name, value) {
return new Promise((resolve, reject) => {
asyncCall(() => {
external.extra.greasemonkey.setValue("%1", name, value, (res) => {
external.extra.greasemonkey.setValue("%1", name, encode(value), (res) => {
if (res) {
resolve();
} else {

View File

@ -1,3 +1,4 @@
function GM_deleteValue(a){localStorage.removeItem("%1"+a)}function GM_getValue(a,b){var c=localStorage.getItem("%1"+a);return null===c&&"undefined"!=typeof b?b:c}function GM_listValues(){for(var a=[],b=0;b<localStorage.length;b++){var c=localStorage.key(b);0===c.indexOf("%1")&&a.push(c.replace("%1",""))}return a}function GM_setValue(a,b){localStorage.setItem("%1"+a,b)}var asyncCall=function(a){window._falkon_external?a():document.addEventListener("_falkon_external_created",a)};
GM.deleteValue=function(a){return new Promise(function(b,c){asyncCall(function(){external.extra.greasemonkey.deleteValue("%1",a,function(a){a?b():c()})})})};GM.getValue=function(a,b){return new Promise(function(c){asyncCall(function(){external.extra.greasemonkey.getValue("%1",a,b,c)})})};GM.setValue=function(a,b){return new Promise(function(c,d){asyncCall(function(){external.extra.greasemonkey.setValue("%1",a,b,function(a){a?c():d()})})})};
function GM_deleteValue(a){localStorage.removeItem("%1"+a)}function GM_getValue(a,b){var c=localStorage.getItem("%1"+a);return null===c&&"undefined"!=typeof b?b:c}function GM_listValues(){for(var a=[],b=0;b<localStorage.length;b++){var c=localStorage.key(b);0===c.indexOf("%1")&&a.push(c.replace("%1",""))}return a}function GM_setValue(a,b){localStorage.setItem("%1"+a,b)}
var asyncCall=function(a){window._falkon_external?a():document.addEventListener("_falkon_external_created",a)},decode=function(a){a=String(a);if(!a.length)return a;var b=a.substr(1);if("b"==a[0])return"true"==b?!0:!1;if("i"==a[0])return Number(b);if("s"==a[0])return b},encode=function(a){return"boolean"==typeof a?"b"+(a?"true":"false"):"number"==typeof a?"i"+String(a):"string"==typeof a?"s"+a:""};
GM.deleteValue=function(a){return new Promise(function(b,c){asyncCall(function(){external.extra.greasemonkey.deleteValue("%1",a,function(a){a?b():c()})})})};GM.getValue=function(a,b){return new Promise(function(c){asyncCall(function(){external.extra.greasemonkey.getValue("%1",a,encode(b),function(a){c(decode(a))})})})};GM.setValue=function(a,b){return new Promise(function(c,d){asyncCall(function(){external.extra.greasemonkey.setValue("%1",a,encode(b),function(a){a?c():d()})})})};
GM.listValues=function(){return new Promise(function(a){asyncCall(function(){external.extra.greasemonkey.listValues("%1",a)})})};

View File

@ -36,7 +36,7 @@ void GM_JSObject::setSettingsFile(const QString &name)
m_settings = new QSettings(name, QSettings::IniFormat);
}
QVariant GM_JSObject::getValue(const QString &nspace, const QString &name, const QVariant &dValue)
QString GM_JSObject::getValue(const QString &nspace, const QString &name, const QString &dValue)
{
QString valueName = QString("GreaseMonkey-%1/%2").arg(nspace, name);
QString savedValue = m_settings->value(valueName, dValue).toString();
@ -45,58 +45,13 @@ QVariant GM_JSObject::getValue(const QString &nspace, const QString &name, const
return dValue;
}
QString actualValue = savedValue.mid(1).trimmed();
if (actualValue.isEmpty()) {
return dValue;
}
switch (savedValue.at(0).toLatin1()) {
case 'b':
return QVariant(actualValue == QLatin1String("true"));
case 'i': {
bool ok;
int val = actualValue.toInt(&ok);
return ok ? QVariant(val) : dValue;
}
case 's':
return actualValue;
default:
break;
}
return dValue;
return savedValue;
}
bool GM_JSObject::setValue(const QString &nspace, const QString &name, const QVariant &value)
bool GM_JSObject::setValue(const QString &nspace, const QString &name, const QString &value)
{
QString savedValue;
switch (value.type()) {
case QVariant::Bool:
savedValue = value.toBool() ? "btrue" : "bfalse";
break;
case QVariant::Int:
case QVariant::UInt:
case QVariant::LongLong:
case QVariant::ULongLong:
case QVariant::Double:
savedValue = "i" + QString::number(value.toInt());
break;
case QVariant::String:
savedValue = "s" + value.toString();
break;
default:
return false;
}
QString valueName = QString("GreaseMonkey-%1/%2").arg(nspace, name);
m_settings->setValue(valueName, savedValue);
m_settings->setValue(valueName, value);
return true;
}

View File

@ -33,8 +33,8 @@ public:
void setSettingsFile(const QString &name);
public slots:
QVariant getValue(const QString &nspace, const QString &name, const QVariant &dValue);
bool setValue(const QString &nspace, const QString &name, const QVariant &value);
QString getValue(const QString &nspace, const QString &name, const QString &dValue);
bool setValue(const QString &nspace, const QString &name, const QString &value);
bool deleteValue(const QString &nspace, const QString &name);
QStringList listValues(const QString &nspace);

View File

@ -40,7 +40,7 @@ PluginSpec GM_Plugin::pluginSpec()
spec.name = "GreaseMonkey";
spec.info = "Userscripts for Falkon";
spec.description = "Provides support for userscripts";
spec.version = "0.9.1";
spec.version = "0.9.2";
spec.author = "David Rosca <nowrep@gmail.com>";
spec.icon = QIcon(":gm/data/icon.svg").pixmap(32);
spec.hasSettings = true;