Fix: looseJSONParse doesn't work on chrome 49
This commit is contained in:
parent
a0495f466f
commit
aed3698c74
105
js/usercss.js
105
js/usercss.js
|
@ -158,8 +158,8 @@ var usercss = (function () {
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseWord(state, error) {
|
function parseWord(state, error = 'invalid word') {
|
||||||
const match = state.text.slice(state.re.lastIndex).match(/^([\w-]+)\s+/);
|
const match = state.text.slice(state.re.lastIndex).match(/^([\w-]+)\s*/);
|
||||||
if (!match) {
|
if (!match) {
|
||||||
throw new Error(error);
|
throw new Error(error);
|
||||||
}
|
}
|
||||||
|
@ -255,15 +255,95 @@ var usercss = (function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseString(state) {
|
function parseString(state) {
|
||||||
const match = state.text.slice(state.re.lastIndex).match(/^((['"])(?:\\\2|[^\n])*?\2|\w+)\s+/);
|
const match = state.text.slice(state.re.lastIndex).match(
|
||||||
|
/^((['"])(?:\\\2|[^\n])*?\2|\w+)\s*/);
|
||||||
state.re.lastIndex += match[0].length;
|
state.re.lastIndex += match[0].length;
|
||||||
state.value = unquote(match[1]);
|
state.value = unquote(match[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseJSON(state) {
|
function parseJSON(state) {
|
||||||
const result = looseJSONParse(state.text.slice(state.re.lastIndex));
|
const result = looseJSONParse(state.text.slice(state.re.lastIndex));
|
||||||
state.re.lastIndex += result.length;
|
if (result) {
|
||||||
state.value = result.json;
|
state.re.lastIndex += result.length;
|
||||||
|
state.value = result.json;
|
||||||
|
} else {
|
||||||
|
// fallback to our parser
|
||||||
|
parseJSONValue(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseJSONValue(state) {
|
||||||
|
const JSON_PRIME = {
|
||||||
|
__proto__: null,
|
||||||
|
'null': null,
|
||||||
|
'true': true,
|
||||||
|
'false': false
|
||||||
|
};
|
||||||
|
if (state.text[state.re.lastIndex] === '{') {
|
||||||
|
// object
|
||||||
|
const obj = {};
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
while (state.text[state.re.lastIndex] !== '}') {
|
||||||
|
parseString(state);
|
||||||
|
const key = state.value;
|
||||||
|
if (state.text[state.re.lastIndex] !== ':') {
|
||||||
|
throw new Error('missing \':\'');
|
||||||
|
}
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
parseJSONValue(state);
|
||||||
|
obj[key] = state.value;
|
||||||
|
if (state.text[state.re.lastIndex] === ',') {
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
} else if (state.text[state.re.lastIndex] !== '}') {
|
||||||
|
throw new Error('missing \',\' or \'}\'');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
state.value = obj;
|
||||||
|
} else if (state.text[state.re.lastIndex] === '[') {
|
||||||
|
// array
|
||||||
|
const arr = [];
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
while (state.text[state.re.lastIndex] !== ']') {
|
||||||
|
parseJSONValue(state);
|
||||||
|
arr.push(state.value);
|
||||||
|
if (state.text[state.re.lastIndex] === ',') {
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
} else if (state.text[state.re.lastIndex] !== ']') {
|
||||||
|
throw new Error('missing \',\' or \']\'');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.re.lastIndex++;
|
||||||
|
eatWhitespace(state);
|
||||||
|
state.value = arr;
|
||||||
|
} else if (state.text[state.re.lastIndex] === '"') {
|
||||||
|
// string
|
||||||
|
parseString(state);
|
||||||
|
} else if (/\d/.test(state.text[state.re.lastIndex])) {
|
||||||
|
// number
|
||||||
|
parseNumber(state);
|
||||||
|
} else {
|
||||||
|
parseWord(state);
|
||||||
|
if (!(state.value in JSON_PRIME)) {
|
||||||
|
throw new Error(`unknown literal '${state.value}'`);
|
||||||
|
}
|
||||||
|
state.value = JSON_PRIME[state.value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseNumber(state) {
|
||||||
|
const match = state.slice(state.re.lastIndex).match(/^-?\d+(\.\d+)?\s*/);
|
||||||
|
if (!match) {
|
||||||
|
throw new Error('invalid number');
|
||||||
|
}
|
||||||
|
state.value = Number(match[0].trim());
|
||||||
|
state.re.lastIndex += match[0].length;
|
||||||
}
|
}
|
||||||
|
|
||||||
function looseJSONParse(text) {
|
function looseJSONParse(text) {
|
||||||
|
@ -287,14 +367,15 @@ var usercss = (function () {
|
||||||
pos = Number(match[1]);
|
pos = Number(match[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pos) {
|
if (!pos) {
|
||||||
try {
|
return null;
|
||||||
return {
|
|
||||||
json: JSON.parse(text.slice(0, pos)),
|
|
||||||
length: pos
|
|
||||||
};
|
|
||||||
} catch (e2) {}
|
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
json: JSON.parse(text.slice(0, pos)),
|
||||||
|
length: pos
|
||||||
|
};
|
||||||
|
} catch (e2) {}
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user