Merge branch 'master' of https://github.com/openstyles/stylus into dev-color-scheme

This commit is contained in:
eight04 2021-12-02 05:55:43 +08:00
commit d164d5d044
10 changed files with 95 additions and 29 deletions

View File

@ -177,6 +177,8 @@ msg.on((msg, sender) => {
//#endregion //#endregion
Promise.all([ Promise.all([
browser.extension.isAllowedFileSchemeAccess()
.then(res => API.data.set('hasFileAccess', res)),
bgReady.styles, bgReady.styles,
/* These are loaded conditionally. /* These are loaded conditionally.
Each item uses `require` individually so IDE can jump to the source and track usage. */ Each item uses `require` individually so IDE can jump to the source and track usage. */

View File

@ -1,5 +1,5 @@
/* global API msg */// msg.js /* global API msg */// msg.js
/* global CHROME URLS stringAsRegExp tryRegExp tryURL */// toolbox.js /* global CHROME URLS isEmptyObj stringAsRegExp tryRegExp tryURL */// toolbox.js
/* global bgReady compareRevision */// common.js /* global bgReady compareRevision */// common.js
/* global calcStyleDigest styleCodeEmpty styleSectionGlobal */// sections-util.js /* global calcStyleDigest styleCodeEmpty styleSectionGlobal */// sections-util.js
/* global db */ /* global db */
@ -480,7 +480,7 @@ const styleMan = (() => {
async function init() { async function init() {
const styles = await db.exec('getAll') || []; const styles = await db.exec('getAll') || [];
const updated = styles.filter(fixKnownProblems); const updated = await Promise.all(styles.map(fixKnownProblems).filter(Boolean));
if (updated.length) { if (updated.length) {
await db.exec('putMany', updated); await db.exec('putMany', updated);
} }
@ -492,7 +492,7 @@ const styleMan = (() => {
bgReady._resolveStyles(); bgReady._resolveStyles();
} }
function fixKnownProblems(style) { function fixKnownProblems(style, initIndex, initArray) {
let res = 0; let res = 0;
for (const key in MISSING_PROPS) { for (const key in MISSING_PROPS) {
if (!style[key]) { if (!style[key]) {
@ -536,7 +536,17 @@ const styleMan = (() => {
if (!style.url) res = style.url = url; if (!style.url) res = style.url = url;
if (!style.installationUrl) res = style.installationUrl = url; if (!style.installationUrl) res = style.installationUrl = url;
} }
return Boolean(res); /* @import must precede `vars` that we add at beginning */
if (
initArray &&
!isEmptyObj((style.usercssData || {}).vars) &&
style.sections.some(({code}) =>
code.startsWith(':root {\n --') &&
/@import\s/i.test(code))
) {
return usercssMan.buildCode(style);
}
return res && style;
} }
function urlMatchStyle(query, style) { function urlMatchStyle(query, style) {

View File

@ -223,7 +223,9 @@ const updateMan = (() => {
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
err = response === style.sourceCode ? STATES.SAME_CODE : STATES.SAME_VERSION; err = response === style.sourceCode
? STATES.SAME_CODE
: !URLS.isLocalhost(updateUrl) && STATES.SAME_VERSION;
} }
if (delta < 0) { if (delta < 0) {
// downgrade is always invalid // downgrade is always invalid

View File

@ -435,6 +435,9 @@ input:invalid {
content: counter(codebox) ": " attr(data-text); content: counter(codebox) ": " attr(data-text);
margin-left: 0.25rem; margin-left: 0.25rem;
} }
.single-editor .applies-to {
border-width: 1px 0;
}
.single-editor .applies-to > label::before { .single-editor .applies-to > label::before {
content: attr(data-index) ":"; content: attr(data-index) ":";
margin-right: 0.25rem; margin-right: 0.25rem;
@ -589,9 +592,6 @@ body:not(.find-open) [data-match-highlight-count="1"] .CodeMirror-selection-high
align-items: flex-start; align-items: flex-start;
min-height: 30px; min-height: 30px;
flex-wrap: wrap; flex-wrap: wrap;
background-color: #f7f7f7; /* .CodeMirror-gutters */
border: solid #bbb;
border-width: 1px 0;
} }
.applies-to.error { .applies-to.error {
background-color: #f002; background-color: #f002;
@ -988,9 +988,18 @@ body.linter-disabled .hidden-unless-compact {
margin-top: .75rem; margin-top: .75rem;
} }
.single-editor {
position: relative;
height: 100%;
}
.single-editor .CodeMirror { .single-editor .CodeMirror {
width: 100%; /* WARNING! If you change this or .single-editor make sure editor opens huge styles like GitHub Dark instantly */
height: 100vh; /* WARNING! Don't use 100% as it's dead slow */ position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: auto;
border: none; border: none;
outline: none; outline: none;
} }
@ -1038,10 +1047,11 @@ body.linter-disabled .hidden-unless-compact {
padding: .5rem 1rem .5rem .5rem; padding: .5rem 1rem .5rem .5rem;
} }
.fixed-header { .fixed-header {
--fixed-height: 40px;
padding-top: var(--fixed-padding); padding-top: var(--fixed-padding);
} }
.fixed-header #header { .fixed-header #header {
min-height: 40px; min-height: var(--fixed-height);
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
@ -1053,6 +1063,9 @@ body.linter-disabled .hidden-unless-compact {
.fixed-header #options { .fixed-header #options {
display: none !important; display: none !important;
} }
.fixed-header #details-wrapper {
padding-top: calc((var(--fixed-height) - 1.2rem) / 2); /* 1.2 is the normal line height */
}
#header summary + *, #header summary + *,
#lint > .lint-scroll-container { #lint > .lint-scroll-container {
margin-left: 1rem; margin-left: 1rem;

View File

@ -1,6 +1,6 @@
/* global $ $create $createLink $$remove showSpinner */// dom.js /* global $ $create $createLink $$remove showSpinner */// dom.js
/* global API */// msg.js /* global API */// msg.js
/* global closeCurrentTab deepEqual */// toolbox.js /* global URLS closeCurrentTab deepEqual */// toolbox.js
/* global messageBox */ /* global messageBox */
/* global prefs */ /* global prefs */
/* global preinit */ /* global preinit */
@ -61,12 +61,18 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
'/js/color/color-view', '/js/color/color-view',
])); ]));
({tabId, initialUrl} = await preinit); ({tabId, initialUrl} = preinit);
liveReload = initLiveReload(); liveReload = initLiveReload();
const {dup, style, error, sourceCode} = await preinit.ready; const [
{dup, style, error, sourceCode},
hasFileAccess,
] = await Promise.all([
preinit.ready,
API.data.get('hasFileAccess'),
]);
if (!style && sourceCode == null) { if (!style && sourceCode == null) {
messageBox.alert(isNaN(error) ? error : 'HTTP Error ' + error, 'pre'); messageBox.alert(isNaN(error) ? `${error}` : 'HTTP Error ' + error, 'pre');
return; return;
} }
await scriptsReady; await scriptsReady;
@ -118,7 +124,7 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
checker.checked = true; checker.checked = true;
// there is no way to "unset" updateUrl, you can only overwrite it. // there is no way to "unset" updateUrl, you can only overwrite it.
checker.disabled = true; checker.disabled = true;
} else if (updateUrl.protocol !== 'file:') { } else if (updateUrl.protocol !== 'file:' || hasFileAccess) {
checker.checked = true; checker.checked = true;
style.updateUrl = updateUrl.href; style.updateUrl = updateUrl.href;
} }
@ -136,7 +142,7 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
}; };
preferScheme.onchange(); preferScheme.onchange();
if (initialUrl.startsWith('file:')) { if (URLS.isLocalhost(initialUrl)) {
$('.live-reload input').onchange = liveReload.onToggled; $('.live-reload input').onchange = liveReload.onToggled;
} else { } else {
$('.live-reload').remove(); $('.live-reload').remove();

View File

@ -25,7 +25,10 @@ const preinit = (() => {
function DirectDownloader() { function DirectDownloader() {
let oldCode = null; let oldCode = null;
return async () => { return async () => {
const code = await download(initialUrl); const code = await download(initialUrl, {
// Disabling cache on http://localhost otherwise the recheck delay gets too big
headers: {'Cache-Control': 'no-cache, no-store'},
});
if (oldCode !== code) { if (oldCode !== code) {
oldCode = code; oldCode = code;
return code; return code;

View File

@ -458,7 +458,7 @@ self.parserlib = (() => {
'pause': 1, 'pause': 1,
'pause-after': 1, 'pause-after': 1,
'pause-before': 1, 'pause-before': 1,
'perspective': 'none | <length>', 'perspective': 'none | <len0+>',
'perspective-origin': '<position>', 'perspective-origin': '<position>',
'phonemes': 1, 'phonemes': 1,
'pitch': 1, 'pitch': 1,
@ -492,7 +492,7 @@ self.parserlib = (() => {
'ruby-position': 1, 'ruby-position': 1,
'ruby-span': 1, 'ruby-span': 1,
'scale': 'none | <number>{1,3}', 'scale': 'none | <num-pct>{1,3}',
'scroll-behavior': 'auto | smooth', 'scroll-behavior': 'auto | smooth',
'scroll-margin': '<length>{1,4}', 'scroll-margin': '<length>{1,4}',
@ -579,7 +579,7 @@ self.parserlib = (() => {
'transform': 'none | <transform-function>+', 'transform': 'none | <transform-function>+',
'transform-box': 'border-box | fill-box | view-box', 'transform-box': 'border-box | fill-box | view-box',
'transform-origin': '<transform-origin>', 'transform-origin': '<transform-origin>',
'transform-style': 'auto | flat | preserve-3d', 'transform-style': 'flat | preserve-3d',
'transition': '<transition>#', 'transition': '<transition>#',
'transition-delay': '<time>#', 'transition-delay': '<time>#',
'transition-duration': '<time>#', 'transition-duration': '<time>#',
@ -982,17 +982,21 @@ self.parserlib = (() => {
'<transform-function>': '<transform-function>':
'matrix( <number>#{6} ) | ' + 'matrix( <number>#{6} ) | ' +
'matrix3d( <number>#{16} ) | ' + 'matrix3d( <number>#{16} ) | ' +
'perspective( <len0+> | none ) | ' +
'rotate( <angle-or-0> ) | ' + 'rotate( <angle-or-0> ) | ' +
'rotate3d( <number>#{3} , <angle-or-0> ) | ' + 'rotate3d( <number>#{3} , <angle-or-0> ) | ' +
'scale( <number> [ , <number> ]? ) | ' + 'rotateX( <angle-or-0> ) | ' +
'scale3d( <number>#{3} ) | ' + 'rotateY( <angle-or-0> ) | ' +
'scaleX( <number> ) | ' + 'rotateZ( <angle-or-0> ) | ' +
'scaleY( <number> ) | ' + 'scale( [ <num-pct> ]#{1,2} ) | ' +
'scaleZ( <number> ) | ' + 'scale3d( <num-pct>#{3} ) | ' +
'scaleX( <num-pct> ) | ' +
'scaleY( <num-pct> ) | ' +
'scaleZ( <num-pct> ) | ' +
'skew( <angle-or-0> [ , <angle-or-0> ]? ) | ' + 'skew( <angle-or-0> [ , <angle-or-0> ]? ) | ' +
'skewX( <angle-or-0> ) | ' + 'skewX( <angle-or-0> ) | ' +
'skewY( <angle-or-0> ) | ' + 'skewY( <angle-or-0> ) | ' +
'translate( <len-pct> [ , <len-pct> ]? ) | ' + 'translate( <len-pct>#{1,2} ) | ' +
'translate3d( <len-pct>#{2} , <length> ) | ' + 'translate3d( <len-pct>#{2} , <length> ) | ' +
'translateX( <len-pct> ) | ' + 'translateX( <len-pct> ) | ' +
'translateY( <len-pct> ) | ' + 'translateY( <len-pct> ) | ' +
@ -4674,6 +4678,7 @@ self.parserlib = (() => {
//#endregion //#endregion
//#region PUBLIC API //#region PUBLIC API
/** @namespace parserlib */
return { return {
css: { css: {
Colors, Colors,

View File

@ -71,12 +71,15 @@ function styleCodeEmpty(code) {
if (!code) { if (!code) {
return true; return true;
} }
let lastIndex = 0;
const rx = /\s+|\/\*([^*]|\*(?!\/))*(\*\/|$)|@namespace[^;]+;|@charset[^;]+;/giyu; const rx = /\s+|\/\*([^*]|\*(?!\/))*(\*\/|$)|@namespace[^;]+;|@charset[^;]+;/giyu;
while (rx.exec(code)) { while (rx.exec(code)) {
if (rx.lastIndex === code.length) { lastIndex = rx.lastIndex;
if (lastIndex === code.length) {
return true; return true;
} }
} }
styleCodeEmpty.lastIndex = lastIndex;
return false; return false;
} }

View File

@ -115,6 +115,8 @@ const URLS = {
url.startsWith(URLS.ownOrigin) || url.startsWith(URLS.ownOrigin) ||
!URLS.chromeProtectsNTP && url.startsWith('chrome://newtab/') !URLS.chromeProtectsNTP && url.startsWith('chrome://newtab/')
), ),
isLocalhost: url => /^file:|^https?:\/\/(localhost|127\.0\.0\.1)\//.test(url),
}; };
const RX_META = /\/\*!?\s*==userstyle==[\s\S]*?==\/userstyle==\s*\*\//i; const RX_META = /\/\*!?\s*==userstyle==[\s\S]*?==\/userstyle==\s*\*\//i;

View File

@ -12,7 +12,7 @@ const BUILDERS = Object.assign(Object.create(null), {
varDef = ':root {\n' + varDef + '}\n'; varDef = ':root {\n' + varDef + '}\n';
for (const section of sections) { for (const section of sections) {
if (!styleCodeEmpty(section.code)) { if (!styleCodeEmpty(section.code)) {
section.code = varDef + section.code; spliceCssAfterGlobals(section, varDef, styleCodeEmpty.lastIndex);
} }
} }
}, },
@ -165,3 +165,23 @@ function simplifyUsercssVars(vars) {
va.value = value; va.value = value;
} }
} }
function spliceCssAfterGlobals(section, newText, after) {
const {code} = section;
const RX_IMPORT = /@import\s/gi;
RX_IMPORT.lastIndex = after;
if (RX_IMPORT.test(code)) {
require(['/js/csslint/parserlib']); /* global parserlib */
const parser = new parserlib.css.Parser();
parser._tokenStream = new parserlib.css.TokenStream(code);
parser._sheetGlobals();
const {col, line, offset} = parser._tokenStream._token;
// normalizing newlines in non-usercss to match line:col from parserlib
if ((code.indexOf('\r') + 1 || 1e99) - 1 < offset) {
after = col + code.split('\n', line).reduce((len, s) => len + s.length + 1, 0);
} else {
after = offset + 1;
}
}
section.code = (after ? code.slice(0, after) + '\n' : '') + newText + code.slice(after);
}