Cache enabled state
This commit is contained in:
parent
1f18b13a92
commit
e594b8ccb1
|
@ -49,7 +49,7 @@ const styleManager = (() => {
|
||||||
if ([...style.appliesTo].every(isExtensionUrl)) {
|
if ([...style.appliesTo].every(isExtensionUrl)) {
|
||||||
return msg.broadcastExtension(message);
|
return msg.broadcastExtension(message);
|
||||||
}
|
}
|
||||||
return msg.broadcast(message);
|
return msg.broadcast(message, tab => style.appliesTo.has(tab.url));
|
||||||
})
|
})
|
||||||
.then(() => id);
|
.then(() => id);
|
||||||
}
|
}
|
||||||
|
@ -120,13 +120,15 @@ const styleManager = (() => {
|
||||||
.then(() => {
|
.then(() => {
|
||||||
for (const url of style.appliesTo) {
|
for (const url of style.appliesTo) {
|
||||||
const cache = cachedStyleForUrl.get(url);
|
const cache = cachedStyleForUrl.get(url);
|
||||||
|
if (cache) {
|
||||||
delete cache[id];
|
delete cache[id];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
styles.delete(id);
|
styles.delete(id);
|
||||||
return msg.broadcast({
|
return msg.broadcast({
|
||||||
method: 'styleDeleted',
|
method: 'styleDeleted',
|
||||||
style: {id}
|
style: {id}
|
||||||
});
|
}, tab => style.appliesTo.has(tab.url));
|
||||||
})
|
})
|
||||||
.then(() => id);
|
.then(() => id);
|
||||||
}
|
}
|
||||||
|
@ -187,7 +189,13 @@ const styleManager = (() => {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
updated.set(url, code);
|
updated.set(url, code);
|
||||||
cache[newData.id] = code;
|
if (cache) {
|
||||||
|
cache[newData.id] = {
|
||||||
|
id: newData.id,
|
||||||
|
enabled: newData.enabled,
|
||||||
|
code
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
style.appliesTo = new Set(updated.keys());
|
style.appliesTo = new Set(updated.keys());
|
||||||
|
@ -218,7 +226,11 @@ const styleManager = (() => {
|
||||||
}
|
}
|
||||||
const cache = cachedStyleForUrl.get(tab.url);
|
const cache = cachedStyleForUrl.get(tab.url);
|
||||||
if (cache) {
|
if (cache) {
|
||||||
cache[data.id] = code;
|
cache[data.id] = {
|
||||||
|
id: data.id,
|
||||||
|
enabled: data.enabled,
|
||||||
|
code
|
||||||
|
};
|
||||||
}
|
}
|
||||||
appliesTo.add(tab.url);
|
appliesTo.add(tab.url);
|
||||||
return {
|
return {
|
||||||
|
@ -260,22 +272,26 @@ const styleManager = (() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSectionsByUrl(url, filterId) {
|
function getSectionsByUrl(url, filterId) {
|
||||||
let result = cachedStyleForUrl.get(url);
|
let cache = cachedStyleForUrl.get(url);
|
||||||
if (!result) {
|
if (!cache) {
|
||||||
result = {};
|
cache = {};
|
||||||
for (const {appliesTo, data} of styles.values()) {
|
for (const {appliesTo, data} of styles.values()) {
|
||||||
const code = getAppliedCode(url, data);
|
const code = getAppliedCode(url, data);
|
||||||
if (code) {
|
if (code) {
|
||||||
result[data.id] = code;
|
cache[data.id] = {
|
||||||
|
id: data.id,
|
||||||
|
enabled: data.enabled,
|
||||||
|
sections: code
|
||||||
|
};
|
||||||
appliesTo.add(url);
|
appliesTo.add(url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cachedStyleForUrl.set(url, result);
|
cachedStyleForUrl.set(url, cache);
|
||||||
}
|
}
|
||||||
if (filterId) {
|
if (filterId) {
|
||||||
return {[filterId]: result[filterId]};
|
return {[filterId]: cache[filterId]};
|
||||||
}
|
}
|
||||||
return result;
|
return cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAppliedCode(url, data) {
|
function getAppliedCode(url, data) {
|
||||||
|
@ -336,7 +352,9 @@ const styleManager = (() => {
|
||||||
(!section.urlPrefixes || !section.urlPrefixes.length) &&
|
(!section.urlPrefixes || !section.urlPrefixes.length) &&
|
||||||
(!section.urls || !section.urls.length) &&
|
(!section.urls || !section.urls.length) &&
|
||||||
(!section.domains || !section.domains.length)
|
(!section.domains || !section.domains.length)
|
||||||
)
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,89 +396,12 @@ const styleManager = (() => {
|
||||||
|
|
||||||
function getDomain(url) {
|
function getDomain(url) {
|
||||||
// FIXME: use a naive regexp
|
// FIXME: use a naive regexp
|
||||||
return url.match(/\w+:\/\//);
|
return url.match(/^[\w-]+:\/\/(?:[\w:-]+@)?([^:/#]+)/)[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUrlNoHash(url) {
|
function getUrlNoHash(url) {
|
||||||
return url.split('#')[0];
|
return url.split('#')[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
// function cleanData(method, data) {
|
|
||||||
// if (
|
|
||||||
// (method === 'styleUpdated' || method === 'styleAdded') &&
|
|
||||||
// (data.sections || data.sourceCode)
|
|
||||||
// ) {
|
|
||||||
// apply/popup/manage use only meta for these two methods,
|
|
||||||
// editor may need the full code but can fetch it directly,
|
|
||||||
// so we send just the meta to avoid spamming lots of tabs with huge styles
|
|
||||||
// return getStyleWithNoCode(data);
|
|
||||||
// }
|
|
||||||
// return data;
|
|
||||||
// }
|
|
||||||
|
|
||||||
function isExtensionStyle(id) {
|
|
||||||
// TODO
|
|
||||||
// const style = styles.get(id);
|
|
||||||
// if (!style)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// function emitChanges(method, data) {
|
|
||||||
// const pendingPrivilage = runtimeSendMessage({method, cleanData(method, data)});
|
|
||||||
// const affectsAll = !msg.affects || msg.affects.all;
|
|
||||||
// const affectsOwnOriginOnly =
|
|
||||||
// !affectsAll && (msg.affects.editor || msg.affects.manager);
|
|
||||||
// const affectsTabs = affectsAll || affectsOwnOriginOnly;
|
|
||||||
// const affectsIcon = affectsAll || msg.affects.icon;
|
|
||||||
// const affectsPopup = affectsAll || msg.affects.popup;
|
|
||||||
// const affectsSelf = affectsPopup || msg.prefs;
|
|
||||||
// notify all open extension pages and popups
|
|
||||||
// if (affectsSelf) {
|
|
||||||
// msg.tabId = undefined;
|
|
||||||
// sendMessage(msg, ignoreChromeError);
|
|
||||||
// }
|
|
||||||
// notify tabs
|
|
||||||
// if (affectsTabs || affectsIcon) {
|
|
||||||
// const notifyTab = tab => {
|
|
||||||
// if (!styleUpdated
|
|
||||||
// && (affectsTabs || URLS.optionsUI.includes(tab.url))
|
|
||||||
// own pages are already notified via sendMessage
|
|
||||||
// && !(affectsSelf && tab.url.startsWith(URLS.ownOrigin))
|
|
||||||
// skip lazy-loaded aka unloaded tabs that seem to start loading on message in FF
|
|
||||||
// && (!FIREFOX || tab.width)) {
|
|
||||||
// msg.tabId = tab.id;
|
|
||||||
// sendMessage(msg, ignoreChromeError);
|
|
||||||
// }
|
|
||||||
// if (affectsIcon) {
|
|
||||||
// eslint-disable-next-line no-use-before-define
|
|
||||||
// debounce(API.updateIcon, 0, {tab});
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
// list all tabs including chrome-extension:// which can be ours
|
|
||||||
// Promise.all([
|
|
||||||
// queryTabs(isExtensionStyle(data.id) ? {url: URLS.ownOrigin + '*'} : {}),
|
|
||||||
// getActiveTab(),
|
|
||||||
// ]).then(([tabs, activeTab]) => {
|
|
||||||
// const activeTabId = activeTab && activeTab.id;
|
|
||||||
// for (const tab of tabs) {
|
|
||||||
// invokeOrPostpone(tab.id === activeTabId, notifyTab, tab);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// notify self: the message no longer is sent to the origin in new Chrome
|
|
||||||
// if (typeof onRuntimeMessage !== 'undefined') {
|
|
||||||
// onRuntimeMessage(originalMessage);
|
|
||||||
// }
|
|
||||||
// notify apply.js on own pages
|
|
||||||
// if (typeof applyOnMessage !== 'undefined') {
|
|
||||||
// applyOnMessage(originalMessage);
|
|
||||||
// }
|
|
||||||
// propagate saved style state/code efficiently
|
|
||||||
// if (styleUpdated) {
|
|
||||||
// msg.refreshOwnTabs = false;
|
|
||||||
// API.refreshAllTabs(msg);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function notifyAllTabs() {}
|
function notifyAllTabs() {}
|
||||||
|
|
11
js/msg.js
11
js/msg.js
|
@ -8,7 +8,8 @@ const msg = (() => {
|
||||||
isBg = true;
|
isBg = true;
|
||||||
window._msg = {
|
window._msg = {
|
||||||
id: 1,
|
id: 1,
|
||||||
storage: new Map()
|
storage: new Map(),
|
||||||
|
handler: null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const runtimeSend = promisify(chrome.runtime.sendMessage.bind(chrome.runtime));
|
const runtimeSend = promisify(chrome.runtime.sendMessage.bind(chrome.runtime));
|
||||||
|
@ -59,8 +60,11 @@ const msg = (() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendBg(data) {
|
function sendBg(data) {
|
||||||
|
if (bg === undefined) {
|
||||||
// always wrap doSend in promise
|
// always wrap doSend in promise
|
||||||
return preparing.then(doSend);
|
return preparing.then(doSend);
|
||||||
|
}
|
||||||
|
return withPromiseError(doSend);
|
||||||
|
|
||||||
function doSend() {
|
function doSend() {
|
||||||
if (bg) {
|
if (bg) {
|
||||||
|
@ -147,11 +151,14 @@ const msg = (() => {
|
||||||
if (handler) {
|
if (handler) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bg._msg.handler = handler = {
|
handler = {
|
||||||
both: [],
|
both: [],
|
||||||
tab: [],
|
tab: [],
|
||||||
extension: []
|
extension: []
|
||||||
};
|
};
|
||||||
|
if (isBg) {
|
||||||
|
bg._msg.handler = handler;
|
||||||
|
}
|
||||||
chrome.runtime.onMessage.addListener(handleMessage);
|
chrome.runtime.onMessage.addListener(handleMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user