Improve performance by reducing some iterations (#601)

Improve performance by reducing some iterations
This commit is contained in:
Nguyễn Kim Kha 2020-05-03 05:23:25 +10:00 committed by GitHub
parent 3712d1a39c
commit 7e2c47ff68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -185,9 +185,7 @@ let enabledSites = [];
extensionApi.storage.sync.get({ extensionApi.storage.sync.get({
sites: {} sites: {}
}, function (items) { }, function (items) {
enabledSites = Object.keys(items.sites).map(function (key) { enabledSites = Object.values(items.sites);
return items.sites[key];
});
if (extensionApi === chrome) { if (extensionApi === chrome) {
initGA(); initGA();
} }
@ -195,15 +193,9 @@ extensionApi.storage.sync.get({
// Listen for changes to options // Listen for changes to options
extensionApi.storage.onChanged.addListener(function (changes, namespace) { extensionApi.storage.onChanged.addListener(function (changes, namespace) {
let key; if (changes.sites) {
for (key in changes) { const sites = changes.sites.newValue;
const storageChange = changes[key]; enabledSites = Object.values(sites);
if (key === 'sites') {
const sites = storageChange.newValue;
enabledSites = Object.keys(sites).map(function (key) {
return sites[key];
});
}
} }
}); });
@ -216,20 +208,21 @@ extensionApi.runtime.onInstalled.addListener(function (details) {
} }
}); });
extensionApi.tabs.onUpdated.addListener(updateBadge); extensionApi.tabs.onUpdated.addListener(function (tabId, info, tab) {
extensionApi.tabs.onActivated.addListener(updateBadge); updateBadge(tab);
});
extensionApi.tabs.onActivated.addListener(function (activeInfo) {
extensionApi.tabs.get(activeInfo.tabId, updateBadge);
});
function updateBadge () { let cachedBadgeText = '';
extensionApi.tabs.query({ function updateBadge (activeTab) {
active: true,
currentWindow: true
}, function (arrayOfTabs) {
const activeTab = arrayOfTabs[0];
if (!activeTab) { return; } if (!activeTab) { return; }
const badgeText = getBadgeText(activeTab.url); const badgeText = getBadgeText(activeTab.url);
extensionApi.browserAction.setBadgeBackgroundColor({ color: 'blue' }); if (cachedBadgeText === badgeText) { return; }
extensionApi.browserAction.setBadgeText({ text: badgeText }); cachedBadgeText = badgeText;
}); extensionApi.browserAction.setBadgeBackgroundColor({color: 'blue'});
extensionApi.browserAction.setBadgeText({text: badgeText});
} }
function getBadgeText (currentUrl) { function getBadgeText (currentUrl) {
@ -238,9 +231,7 @@ function getBadgeText (currentUrl) {
// Disable javascript for these sites // Disable javascript for these sites
extensionApi.webRequest.onBeforeRequest.addListener(function (details) { extensionApi.webRequest.onBeforeRequest.addListener(function (details) {
if (!isSiteEnabled(details) && !enabledSites.some(function (enabledSite) { if (!isSiteEnabled(details) && !enabledSites.includes('generalpaywallbypass')) {
return enabledSite.indexOf('generalpaywallbypass') !== -1;
})) {
return; return;
} }
return { cancel: true }; return { cancel: true };
@ -272,7 +263,7 @@ extensionApi.webRequest.onBeforeSendHeaders.addListener(function (details) {
// check for blocked regular expression: domain enabled, match regex, block on an internal or external regex // check for blocked regular expression: domain enabled, match regex, block on an internal or external regex
for (const domain in blockedRegexes) { for (const domain in blockedRegexes) {
if (isSiteEnabled({ url: '.' + domain }) && details.url.match(blockedRegexes[domain])) { if (isSiteEnabled({ url: '.' + domain }) && details.url.match(blockedRegexes[domain])) {
if (details.url.indexOf(domain) !== -1) { if (details.url.includes(domain)) {
return { cancel: true }; return { cancel: true };
} }
} }
@ -285,11 +276,11 @@ extensionApi.webRequest.onBeforeSendHeaders.addListener(function (details) {
// if referer exists, set it to google // if referer exists, set it to google
requestHeaders = requestHeaders.map(function (requestHeader) { requestHeaders = requestHeaders.map(function (requestHeader) {
if (requestHeader.name === 'Referer') { if (requestHeader.name === 'Referer') {
if (details.url.indexOf('cooking.nytimes.com/api/v1/users/bootstrap') !== -1) { if (details.url.includes('cooking.nytimes.com/api/v1/users/bootstrap')) {
// this fixes images not being loaded on cooking.nytimes.com main page // this fixes images not being loaded on cooking.nytimes.com main page
// referrer has to be *nytimes.com otherwise returns 403 // referrer has to be *nytimes.com otherwise returns 403
requestHeader.value = 'https://cooking.nytimes.com'; requestHeader.value = 'https://cooking.nytimes.com';
} else if (details.url.indexOf('wsj.com') !== -1 || details.url.indexOf('ft.com') !== -1 || details.url.indexOf('fd.nl') !== -1) { } else if (details.url.includes('wsj.com') || details.url.includes('ft.com') || details.url.includes('fd.nl')) {
requestHeader.value = 'https://www.facebook.com/'; requestHeader.value = 'https://www.facebook.com/';
} else { } else {
requestHeader.value = 'https://www.google.com/'; requestHeader.value = 'https://www.google.com/';
@ -305,7 +296,7 @@ extensionApi.webRequest.onBeforeSendHeaders.addListener(function (details) {
// otherwise add it // otherwise add it
if (!setReferer) { if (!setReferer) {
if (details.url.indexOf('wsj.com') !== -1 || details.url.indexOf('ft.com') !== -1 || details.url.indexOf('fd.nl') !== -1) { if (details.url.includes('wsj.com') || details.url.includes('ft.com') || details.url.includes('fd.nl')) {
requestHeaders.push({ requestHeaders.push({
name: 'Referer', name: 'Referer',
value: 'https://www.facebook.com/' value: 'https://www.facebook.com/'
@ -319,9 +310,9 @@ extensionApi.webRequest.onBeforeSendHeaders.addListener(function (details) {
} }
// override User-Agent to use Googlebot // override User-Agent to use Googlebot
const useGoogleBot = useGoogleBotSites.filter(function (item) { const useGoogleBot = useGoogleBotSites.some(function (item) {
return typeof item === 'string' && details.url.indexOf(item) > -1; return typeof item === 'string' && details.url.includes(item);
}).length > 0; });
if (useGoogleBot) { if (useGoogleBot) {
requestHeaders.push({ requestHeaders.push({
@ -335,17 +326,17 @@ extensionApi.webRequest.onBeforeSendHeaders.addListener(function (details) {
} }
// remove cookies before page load // remove cookies before page load
const enabledCookies = allowCookies.some(function (site) {
return details.url.includes(site);
});
if (!enabledCookies) {
requestHeaders = requestHeaders.map(function (requestHeader) { requestHeaders = requestHeaders.map(function (requestHeader) {
for (const siteIndex in allowCookies) {
if (details.url.indexOf(allowCookies[siteIndex]) !== -1) {
return requestHeader;
}
}
if (requestHeader.name === 'Cookie') { if (requestHeader.name === 'Cookie') {
requestHeader.value = ''; requestHeader.value = '';
} }
return requestHeader; return requestHeader;
}); });
}
if (tabId !== -1) { if (tabId !== -1) {
// run contentScript inside tab // run contentScript inside tab
@ -366,30 +357,34 @@ extensionApi.webRequest.onBeforeSendHeaders.addListener(function (details) {
// remove cookies after page load // remove cookies after page load
extensionApi.webRequest.onCompleted.addListener(function (details) { extensionApi.webRequest.onCompleted.addListener(function (details) {
for (const domainIndex in removeCookies) { let domainToRemove;
const domainVar = removeCookies[domainIndex]; for (let domain of removeCookies) {
if (!enabledSites.includes(domainVar) || details.url.indexOf(domainVar) === -1) { if (enabledSites.includes(domain) && details.url.includes(domain)) {
continue; // don't remove cookies domainToRemove = domain;
break;
} }
extensionApi.cookies.getAll({ domain: domainVar }, function (cookies) { }
if (domainToRemove) {
extensionApi.cookies.getAll({ domain: domainToRemove }, function (cookies) {
for (let i = 0; i < cookies.length; i++) { for (let i = 0; i < cookies.length; i++) {
const ck = cookies[i];
const cookie = { const cookie = {
url: (cookies[i].secure ? 'https://' : 'http://') + cookies[i].domain + cookies[i].path, url: (ck.secure ? 'https://' : 'http://') + ck.domain + ck.path,
name: cookies[i].name, name: ck.name,
storeId: cookies[i].storeId storeId: ck.storeId
}; };
// .firstPartyDomain = undefined on Chrome (doesn't support it) // .firstPartyDomain = undefined on Chrome (doesn't support it)
if (cookies[i].firstPartyDomain !== undefined) { if (ck.firstPartyDomain !== undefined) {
cookie.firstPartyDomain = cookies[i].firstPartyDomain; cookie.firstPartyDomain = ck.firstPartyDomain;
} }
const cookieDomain = cookies[i].domain; const cookieDomain = ck.domain;
const rcDomain = cookieDomain.replace(/^(\.?www\.|\.)/, ''); const rcDomain = cookieDomain.replace(/^(\.?www\.|\.)/, '');
// hold specific cookie(s) from removeCookies domains // hold specific cookie(s) from removeCookies domains
if ((rcDomain in removeCookiesSelectHold) && removeCookiesSelectHold[rcDomain].includes(cookies[i].name)) { if ((rcDomain in removeCookiesSelectHold) && removeCookiesSelectHold[rcDomain].includes(ck.name)) {
continue; // don't remove specific cookie continue; // don't remove specific cookie
} }
// drop only specific cookie(s) from removeCookies domains // drop only specific cookie(s) from removeCookies domains
if ((rcDomain in removeCookiesSelectDrop) && !(removeCookiesSelectDrop[rcDomain].includes(cookies[i].name))) { if ((rcDomain in removeCookiesSelectDrop) && !(removeCookiesSelectDrop[rcDomain].includes(ck.name))) {
continue; // only remove specific cookie continue; // only remove specific cookie
} }
extensionApi.cookies.remove(cookie); extensionApi.cookies.remove(cookie);
@ -420,7 +415,7 @@ function initGA () {
function isSiteEnabled (details) { function isSiteEnabled (details) {
const isEnabled = enabledSites.some(function (enabledSite) { const isEnabled = enabledSites.some(function (enabledSite) {
const useSite = (details.url.indexOf('.' + enabledSite) !== -1 || details.url.indexOf('/' + enabledSite) !== -1); const useSite = (details.url.includes('.' + enabledSite) || details.url.includes('/' + enabledSite));
if (enabledSite in restrictions) { if (enabledSite in restrictions) {
return useSite && details.url.match(restrictions[enabledSite]); return useSite && details.url.match(restrictions[enabledSite]);
} }