Use async URL loading for the JSON setting definitions

Chrome disallows synchronous URL loading, so all functions requiring
the JSON definitions for the settings over MSPv2 need to be async.
This required rewriting MSPHelper._getSetting() and all its callers
using promises.

Fixes #284
pull/286/head
Alberto García Hierro 7 years ago
parent 244b646bd2
commit 850632bfee

@ -2246,18 +2246,28 @@ var mspHelper = (function (gui) {
};
self._getSetting = function(name) {
if (!this._settings) {
var $this = this;
$.ajax({
url: chrome.extension.getURL('/resources/settings.json'),
dataType: 'json',
async: false,
success: function(data) {
$this._settings = data;
}
var promise;
if (this._settings) {
promise = Promise.resolve(this._settings);
} else {
promise = new Promise(function(resolve, reject) {
var $this = this;
$.ajax({
url: chrome.runtime.getURL('/resources/settings.json'),
dataType: 'json',
error: function(jqXHR, text, error) {
reject(error);
},
success: function(data) {
$this._settings = data;
resolve(data);
}
});
});
}
return this._settings[name];
return promise.then(function (data) {
return data[name];
});
};
self._encodeSettingName = function(name, data) {
@ -2268,89 +2278,94 @@ var mspHelper = (function (gui) {
};
self.getSetting = function(name, callback) {
var setting = this._getSetting(name);
var data = [];
this._encodeSettingName(name, data);
MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) {
var value;
var $this = this;
return this._getSetting(name).then(function (setting) {
var data = [];
$this._encodeSettingName(name, data);
MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) {
var value;
switch (setting.type) {
case "uint8_t":
value = resp.data.getUint8(0);
break;
case "int8_t":
value = resp.data.getInt8(0);
break;
case "uint16_t":
value = resp.data.getUint16(0, true);
break;
case "int16_t":
value = resp.data.getInt16(0, true);
break;
case "uint32_t":
value = resp.data.getUint32(0, true);
break;
case "float":
var fi32 = resp.data.getUint32(0, true);
var buf = new ArrayBuffer(4);
(new Uint32Array(buf))[0] = fi32;
value = (new Float32Array(buf))[0];
break;
default:
throw "Unknown setting type " + setting.type;
}
if (setting.table) {
value = setting.table.values[value];
}
if (callback) {
callback(value, setting);
}
});
});
};
self.encodeSetting = function(name, value) {
var $this = this;
return this._getSetting(name).then(function (setting) {
if (setting.table) {
var found = false;
for (var ii = 0; ii < setting.table.values.length; ii++) {
if (setting.table.values[ii] == value) {
value = ii;
found = true;
break;
}
}
if (!found) {
throw 'Invalid value "' + value + '" for setting ' + name;
}
}
var data = [];
$this._encodeSettingName(name, data);
switch (setting.type) {
case "uint8_t":
value = resp.data.getUint8(0);
break;
case "int8_t":
value = resp.data.getInt8(0);
data.push8(value);
break;
case "uint16_t":
value = resp.data.getUint16(0, true);
break;
case "int16_t":
value = resp.data.getInt16(0, true);
data.push16(value);
break;
case "uint32_t":
value = resp.data.getUint32(0, true);
data.push32(value);
break;
case "float":
var fi32 = resp.data.getUint32(0, true);
var buf = new ArrayBuffer(4);
(new Uint32Array(buf))[0] = fi32;
value = (new Float32Array(buf))[0];
(new Float32Array(buf))[0] = value;
var if32 = (new Uint32Array(buf))[0];
data.push32(if32);
break;
default:
throw "Unknown setting type " + setting.type;
}
if (setting.table) {
value = setting.table.values[value];
}
if (callback) {
callback(value, setting);
}
return data;
});
};
self.encodeSetting = function(name, value) {
var setting = this._getSetting(name);
if (setting.table) {
var found = false;
for (var ii = 0; ii < setting.table.values.length; ii++) {
if (setting.table.values[ii] == value) {
value = ii;
found = true;
break;
}
}
if (!found) {
throw 'Invalid value "' + value + '" for setting ' + name;
}
}
var data = [];
this._encodeSettingName(name, data);
switch (setting.type) {
case "uint8_t":
case "int8_t":
data.push8(value);
break;
case "uint16_t":
case "int16_t":
data.push16(value);
break;
case "uint32_t":
data.push32(value);
break;
case "float":
var buf = new ArrayBuffer(4);
(new Float32Array(buf))[0] = value;
var if32 = (new Uint32Array(buf))[0];
data.push32(if32);
break;
default:
throw "Unknown setting type " + setting.type;
}
return data;
};
self.setSetting = function(name, value, callback) {
var data = this.encodeSetting(name, value);
MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback);
this.encodeSetting(name, value).then(function (data) {
MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback);
});
};
return self;

@ -531,7 +531,9 @@ TABS.profiles.initialize = function (callback, scrollPosition) {
var settings = presets.settings.get(currentPreset.type);
Object.keys(settings).forEach(function(key, ii) {
var value = settings[key];
promises[key] = MSP.promise(MSPCodes.MSPV2_SET_SETTING, mspHelper.encodeSetting(key, value));
promises[key] = mspHelper.encodeSetting(key, value).then(function(data) {
return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data);
});
});
}
Promise.props(promises).then(function () {

Loading…
Cancel
Save