WIP: kill cachedStyles
This commit is contained in:
parent
7eba890a21
commit
ba64b95575
|
@ -475,3 +475,15 @@ function updateAllTabsIcon() {
|
|||
tabs.map(t => updateIcon({tab: t}))
|
||||
);
|
||||
}
|
||||
|
||||
function openEditor({id}) {
|
||||
let url = '/edit.html';
|
||||
if (id) {
|
||||
url += `?id=${id}`;
|
||||
}
|
||||
if (chrome.windows && prefs.get('openEditInWindow')) {
|
||||
chrome.windows.create(Object.assign({url}, prefs.get('windowPosition')));
|
||||
} else {
|
||||
openURL({url});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* eslint no-eq-null: 0, eqeqeq: [2, "smart"] */
|
||||
/* global createCache db calcStyleDigest normalizeStyleSections db promisify
|
||||
/* global createCache db calcStyleDigest db tryRegExp
|
||||
getStyleWithNoCode msg */
|
||||
/* exported styleManager */
|
||||
'use strict';
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global getStyles API_METHODS styleManager */
|
||||
/* global API_METHODS styleManager CHROME prefs */
|
||||
'use strict';
|
||||
|
||||
API_METHODS.styleViaAPI = !CHROME && (() => {
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
/*
|
||||
global styleSectionsEqual
|
||||
global calcStyleDigest cachedStyles getStyleWithNoCode
|
||||
global usercss semverCompare
|
||||
global API_METHODS styleManager
|
||||
*/
|
||||
/* global styleSectionsEqual prefs download tryJSONparse ignoreChromeError
|
||||
calcStyleDigest getStyleWithNoCode debounce chromeLocal
|
||||
usercss semverCompare
|
||||
API_METHODS styleManager */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
@ -70,7 +68,7 @@ global API_METHODS styleManager
|
|||
|
||||
function checkStyle({
|
||||
id,
|
||||
style = cachedStyles.byId.get(id),
|
||||
style,
|
||||
port,
|
||||
save = true,
|
||||
ignoreDigest,
|
||||
|
@ -89,7 +87,7 @@ global API_METHODS styleManager
|
|||
|
||||
'ignoreDigest' option is set on the second manual individual update check on the manage page.
|
||||
*/
|
||||
return Promise.resolve(style)
|
||||
return fetchStyle()
|
||||
.then([calcStyleDigest][!ignoreDigest ? 0 : 'skip'])
|
||||
.then([checkIfEdited][!ignoreDigest ? 0 : 'skip'])
|
||||
.then([maybeUpdateUSO, maybeUpdateUsercss][style.usercssData ? 1 : 0])
|
||||
|
@ -97,6 +95,16 @@ global API_METHODS styleManager
|
|||
.then(reportSuccess)
|
||||
.catch(reportFailure);
|
||||
|
||||
function fetchStyle() {
|
||||
if (style) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return styleManager.get(id)
|
||||
.then(_style => {
|
||||
style = _style;
|
||||
});
|
||||
}
|
||||
|
||||
function reportSuccess(saved) {
|
||||
log(STATES.UPDATED + ` #${style.id} ${style.name}`);
|
||||
const info = {updated: true, style: saved};
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global API_METHODS usercss chromeLocal styleManager */
|
||||
/* global API_METHODS usercss chromeLocal styleManager FIREFOX deepCopy openURL
|
||||
download */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* eslint no-var: 0 */
|
||||
/* global msg */
|
||||
/* global msg API prefs */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
@ -79,18 +79,18 @@
|
|||
* @param {Function} callback
|
||||
* @returns {Boolean|undefined}
|
||||
*/
|
||||
function getStylesFallback(msg) {
|
||||
if (window !== parent &&
|
||||
location.href !== 'about:blank') {
|
||||
try {
|
||||
if (parent.location.origin === location.origin &&
|
||||
parent.location.href !== location.href) {
|
||||
chrome.runtime.connect({name: 'getStyles:' + JSON.stringify(msg)});
|
||||
return true;
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
// function getStylesFallback(msg) {
|
||||
// if (window !== parent &&
|
||||
// location.href !== 'about:blank') {
|
||||
// try {
|
||||
// if (parent.location.origin === location.origin &&
|
||||
// parent.location.href !== location.href) {
|
||||
// chrome.runtime.connect({name: 'getStyles:' + JSON.stringify(msg)});
|
||||
// return true;
|
||||
// }
|
||||
// } catch (e) {}
|
||||
// }
|
||||
// }
|
||||
|
||||
function applyOnMessage(request) {
|
||||
if (!chrome.app && document instanceof XMLDocument && request.method !== 'ping') {
|
||||
|
@ -320,34 +320,6 @@
|
|||
return el;
|
||||
}
|
||||
|
||||
function setContentsInPageContext() {
|
||||
try {
|
||||
(document.head || ROOT).appendChild(document.createElement('script')).text = `(${queue => {
|
||||
document.currentScript.remove();
|
||||
for (const {id, code} of queue) {
|
||||
const el = document.getElementById(id) ||
|
||||
document.querySelector('style.stylus[id="' + id + '"]');
|
||||
if (!el) continue;
|
||||
const {disabled} = el.sheet;
|
||||
el.textContent = code;
|
||||
el.sheet.disabled = disabled;
|
||||
}
|
||||
}})(${JSON.stringify(pageContextQueue)})`;
|
||||
} catch (e) {}
|
||||
let failedSome;
|
||||
for (const {el, code} of pageContextQueue) {
|
||||
if (el.textContent !== code) {
|
||||
el.textContent = code;
|
||||
failedSome = true;
|
||||
}
|
||||
}
|
||||
if (failedSome) {
|
||||
console.debug('Could not set code of some styles in page context, ' +
|
||||
'see https://github.com/openstyles/stylus/issues/461');
|
||||
}
|
||||
pageContextQueue.length = 0;
|
||||
}
|
||||
|
||||
function addStyleElement(newElement) {
|
||||
if (!ROOT) {
|
||||
return;
|
||||
|
@ -412,14 +384,6 @@
|
|||
return parseInt(el.id.substr(ID_PREFIX.length));
|
||||
}
|
||||
|
||||
function countStylesInHash(styleHash) {
|
||||
let num = 0;
|
||||
for (const k in styleHash) {
|
||||
num += !isNaN(parseInt(k)) ? 1 : 0;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
function orphanCheck() {
|
||||
if (chrome.i18n && chrome.i18n.getUILanguage()) {
|
||||
return true;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* global API */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* global API */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global cloneInto msg */
|
||||
/* global cloneInto msg API */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
/* global regExpTester debounce messageBox CodeMirror template colorMimicry msg */
|
||||
/* global regExpTester debounce messageBox CodeMirror template colorMimicry msg
|
||||
$ $create t prefs tryCatch */
|
||||
/* exported createAppliesToLineWidget */
|
||||
'use strict';
|
||||
|
||||
function createAppliesToLineWidget(cm) {
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
/*
|
||||
global CodeMirror loadScript css_beautify
|
||||
global getSectionForChild showHelp
|
||||
*/
|
||||
/* global loadScript css_beautify showHelp prefs t $ $create */
|
||||
/* exported beautify */
|
||||
'use strict';
|
||||
|
||||
function beautify(scope) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global CodeMirror prefs loadScript editor */
|
||||
/* global CodeMirror prefs loadScript editor $ template */
|
||||
|
||||
'use strict';
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global CodeMirror loadScript rerouteHotkeys */
|
||||
/* global CodeMirror loadScript rerouteHotkeys prefs $ debounce $create */
|
||||
/* exported cmFactory */
|
||||
'use strict';
|
||||
/*
|
||||
All cm instances created by this module are collected so we can broadcast prefs
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global CodeMirror loadScript showHelp cmFactory */
|
||||
/* global CodeMirror showHelp cmFactory onDOMready $ $create prefs t */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
80
edit/edit.js
80
edit/edit.js
|
@ -1,16 +1,13 @@
|
|||
/*
|
||||
global CodeMirror loadScript
|
||||
global createSourceEditor
|
||||
global closeCurrentTab regExpTester messageBox
|
||||
global setupCodeMirror
|
||||
global beautify
|
||||
global sectionsToMozFormat
|
||||
global moveFocus editorWorker msg createSectionsEditor rerouteHotkeys
|
||||
/* global CodeMirror onDOMready prefs setupLivePrefs $ $$ $create t tHTML
|
||||
createSourceEditor queryTabs sessionStorageHash getOwnTab FIREFOX API tryCatch
|
||||
closeCurrentTab messageBox debounce
|
||||
beautify
|
||||
moveFocus msg createSectionsEditor rerouteHotkeys
|
||||
*/
|
||||
/* exported showCodeMirrorPopup */
|
||||
'use strict';
|
||||
|
||||
let saveSizeOnClose;
|
||||
let ownTabId;
|
||||
|
||||
// direct & reverse mapping of @-moz-document keywords and internal property names
|
||||
const propertyToCss = {urls: 'url', urlPrefixes: 'url-prefix', domains: 'domain', regexps: 'regexp'};
|
||||
|
@ -242,29 +239,6 @@ prefs.subscribe(['editor.smartIndent'], (key, value) =>
|
|||
CodeMirror.setOption('smartIndent', value));
|
||||
|
||||
function preinit() {
|
||||
// make querySelectorAll enumeration code readable
|
||||
// FIXME: don't extend native
|
||||
['forEach', 'some', 'indexOf', 'map'].forEach(method => {
|
||||
NodeList.prototype[method] = Array.prototype[method];
|
||||
});
|
||||
|
||||
// eslint-disable-next-line no-extend-native
|
||||
Object.defineProperties(Array.prototype, {
|
||||
last: {
|
||||
get() {
|
||||
return this[this.length - 1];
|
||||
},
|
||||
},
|
||||
rotate: {
|
||||
value: function (amount) {
|
||||
// negative amount == rotate left
|
||||
const r = this.slice(-amount, this.length);
|
||||
Array.prototype.push.apply(r, this.slice(0, this.length - r.length));
|
||||
return r;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// preload the theme so that CodeMirror can calculate its metrics in DOMContentLoaded->setupLivePrefs()
|
||||
new MutationObserver((mutations, observer) => {
|
||||
const themeElement = $('#cm-theme');
|
||||
|
@ -302,7 +276,7 @@ function preinit() {
|
|||
}
|
||||
|
||||
getOwnTab().then(tab => {
|
||||
ownTabId = tab.id;
|
||||
const ownTabId = tab.id;
|
||||
|
||||
// use browser history back when 'back to manage' is clicked
|
||||
if (sessionStorageHash('manageStylesHistory').value[ownTabId] === location.href) {
|
||||
|
@ -446,21 +420,6 @@ function initStyleData() {
|
|||
}
|
||||
}
|
||||
|
||||
function showSectionHelp(event) {
|
||||
event.preventDefault();
|
||||
showHelp(t('styleSectionsTitle'), t('sectionHelp'));
|
||||
}
|
||||
|
||||
function showAppliesToHelp(event) {
|
||||
event.preventDefault();
|
||||
showHelp(t('appliesLabel'), t('appliesHelp'));
|
||||
}
|
||||
|
||||
function showToMozillaHelp(event) {
|
||||
event.preventDefault();
|
||||
showHelp(t('styleMozillaFormatHeading'), t('styleToMozillaFormatHelp'));
|
||||
}
|
||||
|
||||
function showHelp(title = '', body) {
|
||||
const div = $('#help-popup');
|
||||
div.className = '';
|
||||
|
@ -559,20 +518,6 @@ function showCodeMirrorPopup(title, html, options) {
|
|||
return popup;
|
||||
}
|
||||
|
||||
function setGlobalProgress(done, total) {
|
||||
const progressElement = $('#global-progress') ||
|
||||
total && document.body.appendChild($create('#global-progress'));
|
||||
if (total) {
|
||||
const progress = (done / Math.max(done, total) * 100).toFixed(1);
|
||||
progressElement.style.borderLeftWidth = progress + 'vw';
|
||||
setTimeout(() => {
|
||||
progressElement.title = progress + '%';
|
||||
});
|
||||
} else {
|
||||
$.remove(progressElement);
|
||||
}
|
||||
}
|
||||
|
||||
function hideLintHeaderOnScroll() {
|
||||
// workaround part2 for the <details> not showing its toggle icon: hide <summary> on scroll
|
||||
const newOpacity = this.scrollTop === 0 ? '' : '0';
|
||||
|
@ -610,14 +555,3 @@ function isWindowMaximized() {
|
|||
window.outerHeight < screen.availHeight + 10
|
||||
);
|
||||
}
|
||||
|
||||
function toggleContextMenuDelete(event) {
|
||||
if (chrome.contextMenus && event.button === 2 && prefs.get('editor.contextDelete')) {
|
||||
chrome.contextMenus.update('editor.contextDelete', {
|
||||
enabled: Boolean(
|
||||
this.selectionStart !== this.selectionEnd ||
|
||||
this.somethingSelected && this.somethingSelected()
|
||||
),
|
||||
}, ignoreChromeError);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* exported editorWorker */
|
||||
'use strict';
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
/*
|
||||
global messageBox resolveWith
|
||||
gloabl editor showHelp getSectionsHashes
|
||||
global popupExclusions
|
||||
*/
|
||||
/* global showHelp $ $$ debounce API template t */
|
||||
'use strict';
|
||||
|
||||
const exclusions = (() => {
|
||||
|
@ -142,9 +138,9 @@ const exclusions = (() => {
|
|||
if (msg.method === 'exclusionsUpdated' && msg.style && msg.style.exclusions) {
|
||||
update({list: Object.keys(msg.style.exclusions), isUpdating: true});
|
||||
// update popup, if loaded
|
||||
if (typeof popupExclusions !== 'undefined') {
|
||||
popupExclusions.selectExclusions(msg.style.exclusions);
|
||||
}
|
||||
// if (typeof popupExclusions !== 'undefined') {
|
||||
// popupExclusions.selectExclusions(msg.style.exclusions);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -162,7 +158,6 @@ const exclusions = (() => {
|
|||
style.exclusions = exclusionList;
|
||||
style.reason = 'exclusionsUpdated';
|
||||
API.saveStyle(style);
|
||||
notifyAllTabs({method: 'exclusionsUpdated', style, id, excluded: exclusionList});
|
||||
});
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
/* global CodeMirror */
|
||||
/* global focusAccessibility */
|
||||
/* global colorMimicry editor */
|
||||
/* global CodeMirror focusAccessibility colorMimicry editor
|
||||
onDOMready $ $$ $create t debounce tryRegExp stringAsRegExp template */
|
||||
'use strict';
|
||||
|
||||
onDOMready().then(() => {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* global memoize editorWorker showCodeMirrorPopup loadScript messageBox
|
||||
LINTER_DEFAULTS rerouteHotkeys */
|
||||
LINTER_DEFAULTS rerouteHotkeys $ $create $createLink tryJSONparse t
|
||||
chromeSync */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* exported LINTER_DEFAULTS */
|
||||
'use strict';
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
var LINTER_DEFAULTS = (() => {
|
||||
const LINTER_DEFAULTS = (() => {
|
||||
const SEVERITY = {severity: 'warning'};
|
||||
const STYLELINT = {
|
||||
// 'sugarss' is a indent-based syntax like Sass or Stylus
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global LINTER_DEFAULTS linter editorWorker */
|
||||
/* global LINTER_DEFAULTS linter editorWorker prefs chromeSync */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global showHelp editorWorker memoize */
|
||||
/* global showHelp editorWorker memoize $ $create $createLink t */
|
||||
/* exported createLinterHelpDialog */
|
||||
'use strict';
|
||||
|
||||
function createLinterHelpDialog(getIssues) {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global linter */
|
||||
/* global linter API */
|
||||
/* exported createMetaCompiler */
|
||||
'use strict';
|
||||
|
||||
function createMetaCompiler(cm) {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
/* global linter editor clipString createLinterHelpDialog makeSectionVisible */
|
||||
/* global linter editor clipString createLinterHelpDialog $ $create */
|
||||
'use strict';
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
Object.assign(linter, (() => {
|
||||
const tables = new Map();
|
||||
const helpDialog = createLinterHelpDialog(getIssues);
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* global prefs */
|
||||
'use strict';
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
var linter = (() => {
|
||||
/* exported linter */
|
||||
const linter = (() => {
|
||||
const lintingUpdatedListeners = [];
|
||||
const unhookListeners = [];
|
||||
const linters = [];
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global messageBox editor */
|
||||
/* global messageBox editor $ prefs */
|
||||
/* exported createLivePreview */
|
||||
'use strict';
|
||||
|
||||
function createLivePreview(preprocess) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global CodeMirror */
|
||||
/* global CodeMirror prefs */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/* global showHelp */
|
||||
/* global showHelp $ $create tryRegExp queryTabs URLS t template openURL */
|
||||
/* exported regExpTester */
|
||||
'use strict';
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
var regExpTester = (() => {
|
||||
const regExpTester = (() => {
|
||||
const GET_FAVICON_URL = 'https://www.google.com/s2/favicons?domain=';
|
||||
const OWN_ICON = chrome.runtime.getManifest().icons['16'];
|
||||
const cachedRegexps = new Map();
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global CodeMirror editor */
|
||||
/* global CodeMirror editor debounce */
|
||||
/* exported rerouteHotkeys */
|
||||
'use strict';
|
||||
|
||||
const rerouteHotkeys = (() => {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/* global dirtyReporter showToMozillaHelp
|
||||
showSectionHelp toggleContextMenuDelete setGlobalProgress maximizeCodeHeight
|
||||
CodeMirror nextPrevEditorOnKeydown showAppliesToHelp propertyToCss
|
||||
/* global dirtyReporter showHelp prefs ignoreChromeError
|
||||
CodeMirror propertyToCss
|
||||
regExpTester linter createLivePreview showCodeMirrorPopup
|
||||
sectionsToMozFormat editorWorker messageBox clipString beautify
|
||||
rerouteHotkeys cmFactory CssToProperty
|
||||
rerouteHotkeys cmFactory CssToProperty template $ $$ $create t FIREFOX API
|
||||
debounce tryRegExp
|
||||
*/
|
||||
/* exported createSectionsEditor */
|
||||
'use strict';
|
||||
|
||||
function createResizeGrip(cm) {
|
||||
|
@ -98,6 +99,7 @@ function createSectionsEditor(style) {
|
|||
$('#to-mozilla-help').addEventListener('click', showToMozillaHelp);
|
||||
$('#from-mozilla').addEventListener('click', () => fromMozillaFormat());
|
||||
$('#save-button').addEventListener('click', saveStyle);
|
||||
// FIXME: this element doesn't exist?
|
||||
$('#sections-help').addEventListener('click', showSectionHelp);
|
||||
|
||||
document.addEventListener('wheel', scrollEntirePageOnCtrlShift);
|
||||
|
@ -148,6 +150,46 @@ function createSectionsEditor(style) {
|
|||
getSearchableInputs,
|
||||
};
|
||||
|
||||
function toggleContextMenuDelete(event) {
|
||||
if (chrome.contextMenus && event.button === 2 && prefs.get('editor.contextDelete')) {
|
||||
chrome.contextMenus.update('editor.contextDelete', {
|
||||
enabled: Boolean(
|
||||
this.selectionStart !== this.selectionEnd ||
|
||||
this.somethingSelected && this.somethingSelected()
|
||||
),
|
||||
}, ignoreChromeError);
|
||||
}
|
||||
}
|
||||
|
||||
function setGlobalProgress(done, total) {
|
||||
const progressElement = $('#global-progress') ||
|
||||
total && document.body.appendChild($create('#global-progress'));
|
||||
if (total) {
|
||||
const progress = (done / Math.max(done, total) * 100).toFixed(1);
|
||||
progressElement.style.borderLeftWidth = progress + 'vw';
|
||||
setTimeout(() => {
|
||||
progressElement.title = progress + '%';
|
||||
});
|
||||
} else {
|
||||
$.remove(progressElement);
|
||||
}
|
||||
}
|
||||
|
||||
function showToMozillaHelp(event) {
|
||||
event.preventDefault();
|
||||
showHelp(t('styleMozillaFormatHeading'), t('styleToMozillaFormatHelp'));
|
||||
}
|
||||
|
||||
function showAppliesToHelp(event) {
|
||||
event.preventDefault();
|
||||
showHelp(t('appliesLabel'), t('appliesHelp'));
|
||||
}
|
||||
|
||||
function showSectionHelp(event) {
|
||||
event.preventDefault();
|
||||
showHelp(t('styleSectionsTitle'), t('sectionHelp'));
|
||||
}
|
||||
|
||||
function getSearchableInputs(cm) {
|
||||
return sections.find(s => s.cm === cm).appliesTo.map(a => a.valueEl).filter(Boolean);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global CodeMirror showHelp */
|
||||
/* global CodeMirror showHelp onDOMready $ $$ $create template t
|
||||
prefs stringAsRegExp */
|
||||
'use strict';
|
||||
|
||||
onDOMready().then(() => {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
/*
|
||||
global CodeMirror dirtyReporter
|
||||
global createAppliesToLineWidget messageBox
|
||||
global sectionsToMozFormat
|
||||
global createMetaCompiler linter createLivePreview cmFactory
|
||||
*/
|
||||
/* global dirtyReporter
|
||||
createAppliesToLineWidget messageBox
|
||||
sectionsToMozFormat
|
||||
createMetaCompiler linter createLivePreview cmFactory $ $create API prefs t
|
||||
chromeSync */
|
||||
/* exported createSourceEditor */
|
||||
'use strict';
|
||||
|
||||
function createSourceEditor(style) {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* exported dirtyReporter memoize clipString sectionsToMozFormat */
|
||||
'use strict';
|
||||
|
||||
function dirtyReporter() {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* global CodeMirror semverCompare closeCurrentTab */
|
||||
/* global messageBox download chromeLocal */
|
||||
/* global CodeMirror semverCompare closeCurrentTab messageBox download
|
||||
$ $$ $create $createLink t prefs API getTab */
|
||||
'use strict';
|
||||
|
||||
(() => {
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
/* exported createCache */
|
||||
'use strict';
|
||||
|
||||
// create a FIFO limit-size map.
|
||||
function createCache(size = 1000) {
|
||||
const map = new Map();
|
||||
const buffer = Array(size);
|
||||
|
|
26
js/dom.js
26
js/dom.js
|
@ -1,9 +1,35 @@
|
|||
/* global prefs */
|
||||
/* exported scrollElementIntoView animateElement enforceInputRange $createLink
|
||||
setupLivePrefs moveFocus */
|
||||
'use strict';
|
||||
|
||||
if (!/^Win\d+/.test(navigator.platform)) {
|
||||
document.documentElement.classList.add('non-windows');
|
||||
}
|
||||
|
||||
// make querySelectorAll enumeration code readable
|
||||
// FIXME: avoid extending native?
|
||||
['forEach', 'some', 'indexOf', 'map'].forEach(method => {
|
||||
NodeList.prototype[method] = Array.prototype[method];
|
||||
});
|
||||
|
||||
// eslint-disable-next-line no-extend-native
|
||||
Object.defineProperties(Array.prototype, {
|
||||
last: {
|
||||
get() {
|
||||
return this[this.length - 1];
|
||||
},
|
||||
},
|
||||
rotate: {
|
||||
value: function (amount) {
|
||||
// negative amount == rotate left
|
||||
const r = this.slice(-amount, this.length);
|
||||
Array.prototype.push.apply(r, this.slice(0, this.length - r.length));
|
||||
return r;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// polyfill for old browsers to enable [...results] and for-of
|
||||
for (const type of [NodeList, NamedNodeMap, HTMLCollection, HTMLAllCollection]) {
|
||||
if (!type.prototype[Symbol.iterator]) {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
/* global tryCatch */
|
||||
/* exported tHTML formatDate */
|
||||
'use strict';
|
||||
|
||||
const template = {};
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
/*
|
||||
global BG: true
|
||||
global FIREFOX: true
|
||||
global onRuntimeMessage applyOnMessage
|
||||
*/
|
||||
/* exported getActiveTab onTabReady stringAsRegExp getTabRealURL openURL
|
||||
getStyleWithNoCode tryRegExp sessionStorageHash download
|
||||
closeCurrentTab */
|
||||
'use strict';
|
||||
|
||||
const CHROME = Boolean(chrome.app) && parseInt(navigator.userAgent.match(/Chrom\w+\/(?:\d+\.){2}(\d+)|$/)[1]);
|
||||
const OPERA = Boolean(chrome.app) && parseFloat(navigator.userAgent.match(/\bOPR\/(\d+\.\d+)|$/)[1]);
|
||||
const VIVALDI = Boolean(chrome.app) && navigator.userAgent.includes('Vivaldi');
|
||||
const ANDROID = !chrome.windows;
|
||||
// FIXME: who use this?
|
||||
// const ANDROID = !chrome.windows;
|
||||
let FIREFOX = !chrome.app && parseFloat(navigator.userAgent.match(/\bFirefox\/(\d+\.\d+)|$/)[1]);
|
||||
|
||||
if (!CHROME && !chrome.browserAction.openPopup) {
|
||||
|
@ -120,13 +119,6 @@ function getActiveTab() {
|
|||
.then(tabs => tabs[0]);
|
||||
}
|
||||
|
||||
|
||||
function getActiveTabRealURL() {
|
||||
return getActiveTab()
|
||||
.then(getTabRealURL);
|
||||
}
|
||||
|
||||
|
||||
function getTabRealURL(tab) {
|
||||
return new Promise(resolve => {
|
||||
if (tab.url !== 'chrome://newtab/' || URLS.chromeProtectsNTP) {
|
||||
|
@ -487,27 +479,6 @@ function download(url, {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
function invokeOrPostpone(isInvoke, fn, ...args) {
|
||||
return isInvoke
|
||||
? fn(...args)
|
||||
: setTimeout(invokeOrPostpone, 0, true, fn, ...args);
|
||||
}
|
||||
|
||||
|
||||
function openEditor({id}) {
|
||||
let url = '/edit.html';
|
||||
if (id) {
|
||||
url += `?id=${id}`;
|
||||
}
|
||||
if (chrome.windows && prefs.get('openEditInWindow')) {
|
||||
chrome.windows.create(Object.assign({url}, prefs.get('windowPosition')));
|
||||
} else {
|
||||
openURL({url});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function closeCurrentTab() {
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1409375
|
||||
getOwnTab().then(tab => {
|
||||
|
@ -516,6 +487,3 @@ function closeCurrentTab() {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
// FIXME: remove this when #510 is merged
|
||||
function notifyAllTabs() {}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global parserlib */
|
||||
/* exported parseMozFormat */
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* global promisify deepCopy */
|
||||
/* exported msg API */
|
||||
// deepCopy is only used if the script is executed in extension pages.
|
||||
'use strict';
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
/* global deepCopy debounce API tryJSONparse chromeSync FIREFOX CHROME */
|
||||
/* exported prefs */
|
||||
'use strict';
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global loadScript tryJSONparse API */
|
||||
/* global loadScript tryJSONparse */
|
||||
/* exported chromeLocal chromeSync */
|
||||
'use strict';
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user