Bug 1370752: Part 2 - Allow fallback serializer when JSON.serialize fails. r=aswan

Currently, we need to be able to handle serializing non-JSON-compatible
objects without catastrophically failing to save the storage file. Ideally, we
would ensure this in the ordinary toJSON method. However, that would require
a unnecessary extra calls to JSON.stringify for each object that needs to be
sanitized before returning a JSON-safe value, which is more expensive than we
can afford.

The fallback toJSONSafe method allows us to do this only when necessary, due
to an initial failed JSON serialization.

MozReview-Commit-ID: JXQ001dOGtW

--HG--
extra : rebase_source : ae52bdab81b03bb4c31edbe4b78584fd15c982a3
extra : source : 9c4bf59ab966a8ec17181d85cc1fc4be7450cca3
This commit is contained in:
Kris Maglione 2017-06-09 18:19:11 -07:00
Родитель e893cc5e8d
Коммит e86d905625
1 изменённых файлов: 13 добавлений и 1 удалений

Просмотреть файл

@ -286,8 +286,20 @@ JSONFile.prototype = {
* @rejects JavaScript exception.
*/
async _save() {
let json;
try {
json = JSON.stringify(this._data);
} catch (e) {
// If serialization fails, try fallback safe JSON converter.
if (typeof this._data.toJSONSafe == "function") {
json = JSON.stringify(this._data.toJSONSafe());
} else {
throw e;
}
}
// Create or overwrite the file.
let bytes = gTextEncoder.encode(JSON.stringify(this._data));
let bytes = gTextEncoder.encode(json);
if (this._beforeSave) {
await Promise.resolve(this._beforeSave());
}