Merge branch 'master' into installer

This commit is contained in:
tophf 2021-08-24 15:07:36 +03:00
commit 2ca2834569
2 changed files with 31 additions and 18 deletions

View File

@ -164,14 +164,10 @@ const updateMan = (() => {
} }
async function updateToUSOArchive(url, req) { async function updateToUSOArchive(url, req) {
// UserCSS metadata may be embedded in the original USO style so let's use its updateURL const m2 = getUsoEmbeddedMeta(req.response);
const [meta2] = req.response.replace(RX_META, '').match(RX_META) || []; if (m2) {
if (meta2 && meta2.includes('@updateURL')) { url = (await m2).updateUrl;
const {updateUrl} = await API.usercss.buildMeta({sourceCode: meta2}).catch(() => ({})); req = await tryDownload(url, RH_ETAG);
if (updateUrl) {
url = updateUrl;
req = await tryDownload(url, RH_ETAG);
}
} }
const json = await API.usercss.buildMeta({ const json = await API.usercss.buildMeta({
id, id,
@ -209,13 +205,21 @@ const updateMan = (() => {
} }
async function updateUsercss() { async function updateUsercss() {
if (style.etag && style.etag === await downloadEtag()) { let oldVer = ucd.version;
let {etag: oldEtag, updateUrl} = style;
let m2 = URLS.extractUsoArchiveId(updateUrl) && getUsoEmbeddedMeta();
if (m2 && (m2 = await m2).updateUrl) {
updateUrl = m2.updateUrl;
oldVer = m2.usercssData.version || '0';
oldEtag = '';
}
if (oldEtag && oldEtag === await downloadEtag()) {
return Promise.reject(STATES.SAME_CODE); return Promise.reject(STATES.SAME_CODE);
} }
// TODO: when sourceCode is > 100kB use http range request(s) for version check // TODO: when sourceCode is > 100kB use http range request(s) for version check
const {headers: {etag}, response} = await tryDownload(style.updateUrl, RH_ETAG); const {headers: {etag}, response} = await tryDownload(updateUrl, RH_ETAG);
const json = await API.usercss.buildMeta({sourceCode: response, etag}); const json = await API.usercss.buildMeta({sourceCode: response, etag, updateUrl});
const delta = compareVersion(json.usercssData.version, ucd.version); const delta = compareVersion(json.usercssData.version, oldVer);
let err; let err;
if (!delta && !ignoreDigest) { if (!delta && !ignoreDigest) {
// re-install is invalid in a soft upgrade // re-install is invalid in a soft upgrade
@ -285,6 +289,12 @@ const updateMan = (() => {
} }
} }
/** UserCSS metadata may be embedded in the original USO style so let's use its updateURL */
function getUsoEmbeddedMeta(code = style.sourceCode) {
const m = code.includes('@updateURL') && code.replace(RX_META, '').match(RX_META);
return m && API.usercss.buildMeta({sourceCode: m[0]}).catch(() => null);
}
function getVarOptByName(varDef, name) { function getVarOptByName(varDef, name) {
return varDef.options.find(o => o.name === name); return varDef.options.find(o => o.name === name);
} }

View File

@ -1341,6 +1341,7 @@ self.parserlib = (() => {
identString: [ identString: [
Tokens.IDENT, Tokens.IDENT,
Tokens.STRING, Tokens.STRING,
Tokens.USO_VAR,
], ],
LParenBracket: [ LParenBracket: [
Tokens.LPAREN, Tokens.LPAREN,
@ -1395,6 +1396,7 @@ self.parserlib = (() => {
stringUri: [ stringUri: [
Tokens.STRING, Tokens.STRING,
Tokens.URI, Tokens.URI,
Tokens.USO_VAR,
], ],
term: [ term: [
Tokens.NUMBER, Tokens.NUMBER,
@ -2636,7 +2638,7 @@ self.parserlib = (() => {
/** /**
* @param {Number|Number[]} tokenTypes * @param {Number|Number[]} tokenTypes
* @param {Boolean} [skipCruftBefore=true] - skip comments/uso-vars/whitespace before matching * @param {Boolean} [skipCruftBefore=true] - skip comments/whitespace before matching
* @returns {Object} token * @returns {Object} token
*/ */
mustMatch(tokenTypes, skipCruftBefore = true) { mustMatch(tokenTypes, skipCruftBefore = true) {
@ -2648,16 +2650,17 @@ self.parserlib = (() => {
/** /**
* @param {Boolean} [skipWS] - skip whitespace too * @param {Boolean} [skipWS] - skip whitespace too
* @param {Boolean} [skipUsoVar] - skip USO_VAR too
*/ */
skipComment(skipWS) { skipComment(skipWS, skipUsoVar) {
const tt = this.LT(1, true).type; const tt = this.LT(1, true).type;
if (skipWS && tt === Tokens.S || if (skipWS && tt === Tokens.S ||
tt === Tokens.USO_VAR || skipUsoVar && tt === Tokens.USO_VAR ||
tt === Tokens.COMMENT || tt === Tokens.COMMENT ||
tt == null && this._ltIndex === this._ltAhead && ( tt == null && this._ltIndex === this._ltAhead && (
skipWS && this._reader.readMatch(/\s+/y), skipWS && this._reader.readMatch(/\s+/y),
this._reader.peekTest(/\/\*/y))) { this._reader.peekTest(/\/\*/y))) {
while (this.match(TT.usoS)) { /*NOP*/ } while (this.match(skipUsoVar ? TT.usoS : Tokens.S)) { /*NOP*/ }
} }
} }
@ -3811,7 +3814,7 @@ self.parserlib = (() => {
const stream = this._tokenStream; const stream = this._tokenStream;
let braceOpened; let braceOpened;
try { try {
stream.skipComment(); stream.skipComment(undefined, true);
if (parserCache.findBlock()) { if (parserCache.findBlock()) {
return true; return true;
} }
@ -4275,7 +4278,7 @@ self.parserlib = (() => {
_keyframes(start) { _keyframes(start) {
const stream = this._tokenStream; const stream = this._tokenStream;
const prefix = /^@-([^-]+)-/.test(start.value) ? RegExp.$1 : ''; const prefix = rxVendorPrefix.test(start.value) ? RegExp.$1 : '';
this._ws(); this._ws();
const name = this._keyframeName(); const name = this._keyframeName();
stream.mustMatch(Tokens.LBRACE); stream.mustMatch(Tokens.LBRACE);