420733b93a
* add Patch CSP option * show style version, size, and update age in manager * add scope selector to style search in manager * keep scroll position and selections in tab's session * directly install usercss from raw github links * ditch localStorage, use on-demand SessionStore proxy * simplify localization * allow <code> tag in i18n-html * keep nodes in HTML templates * API.getAllStyles is actually faster with code untouched * fix fitToContent when applies-to is taller than window * dedupe linter.enableForEditor calls * prioritize visible CMs in refreshOnViewListener * don't scroll to last style on editing a new one * delay colorview for invisible CMs * eslint comma-dangle error + autofix files * styleViaXhr: also toggle for disableAll pref * styleViaXhr: allow cookies for sandbox CSP * simplify notes in options * simplify getStylesViaXhr * oldUI fixups: * remove separator before 1st applies-to * center name bubbles * fix updateToc focus on a newly added section * fix fitToContent when cloning section * remove CSS `contain` as it makes no difference * replace overrides with declarative CSS + code cosmetics * simplify adjustWidth and make it work in FF
75 lines
2.0 KiB
JavaScript
75 lines
2.0 KiB
JavaScript
/* global messageBox editor $ prefs */
|
|
/* exported createLivePreview */
|
|
'use strict';
|
|
|
|
function createLivePreview(preprocess, shouldShow) {
|
|
let data;
|
|
let previewer;
|
|
let enabled = prefs.get('editor.livePreview');
|
|
const label = $('#preview-label');
|
|
const errorContainer = $('#preview-errors');
|
|
|
|
prefs.subscribe(['editor.livePreview'], (key, value) => {
|
|
if (value && data && data.id && (data.enabled || editor.dirty.has('enabled'))) {
|
|
previewer = createPreviewer();
|
|
previewer.update(data);
|
|
}
|
|
if (!value && previewer) {
|
|
previewer.disconnect();
|
|
previewer = null;
|
|
}
|
|
enabled = value;
|
|
});
|
|
if (shouldShow != null) show(shouldShow);
|
|
return {update, show};
|
|
|
|
function show(state) {
|
|
label.classList.toggle('hidden', !state);
|
|
}
|
|
|
|
function update(_data) {
|
|
data = _data;
|
|
if (!previewer) {
|
|
if (!data.id || !data.enabled || !enabled) {
|
|
return;
|
|
}
|
|
previewer = createPreviewer();
|
|
}
|
|
previewer.update(data);
|
|
}
|
|
|
|
function createPreviewer() {
|
|
const port = chrome.runtime.connect({
|
|
name: 'livePreview',
|
|
});
|
|
port.onDisconnect.addListener(err => {
|
|
throw err;
|
|
});
|
|
return {update, disconnect};
|
|
|
|
function update(data) {
|
|
Promise.resolve()
|
|
.then(() => preprocess ? preprocess(data) : data)
|
|
.then(data => port.postMessage(data))
|
|
.then(
|
|
() => errorContainer.classList.add('hidden'),
|
|
err => {
|
|
if (Array.isArray(err)) {
|
|
err = err.join('\n');
|
|
} else if (err && err.index !== undefined) {
|
|
// FIXME: this would fail if editors[0].getValue() !== data.sourceCode
|
|
const pos = editor.getEditors()[0].posFromIndex(err.index);
|
|
err.message = `${pos.line}:${pos.ch} ${err.message || String(err)}`;
|
|
}
|
|
errorContainer.classList.remove('hidden');
|
|
errorContainer.onclick = () => messageBox.alert(err.message || String(err), 'pre');
|
|
}
|
|
);
|
|
}
|
|
|
|
function disconnect() {
|
|
port.disconnect();
|
|
}
|
|
}
|
|
}
|