fdbfb23547
* parserlib: fast section extraction, tweaks and speedups
* csslint: "simple-not" rule
* csslint: enable and fix "selector-newline" rule
* simplify db: resolve with result
* simplify download()
* remove noCode param as it wastes more time/memory on copying
* styleManager: switch style<->data names to reflect their actual contents
* inline method bodies to avoid indirection and enable better autocomplete/hint/jump support in IDE
* upgrade getEventKeyName to handle mouse clicks
* don't trust location.href as it hides text fragment
* getAllKeys is implemented since Chrome48, FF44
* allow recoverable css errors + async'ify usercss.js
* openManage: unminimize windows
* remove the obsolete Chrome pre-65 workaround
* fix temporal dead zone in apply.js
* ff bug workaround for simple editor window
* consistent window scrolling in scrollToEditor and jumpToPos
* rework waitForSelector and collapsible <details>
* blank paint frame workaround for new Chrome
* extract stuff from edit.js and load on demand
* simplify regexpTester::isShown
* move MozDocMapper to sections-util.js
* extract fitSelectBox()
* initialize router earlier
* use helpPopup.close()
* fix autofocus in popups, follow-up to 5bb1b5ef
* clone objects in prefs.get() + cosmetics
* reuse getAll result for INC
83 lines
2.6 KiB
JavaScript
83 lines
2.6 KiB
JavaScript
/* global CHROME FIREFOX URLS ignoreChromeError */// toolbox.js
|
|
/* global bgReady */// common.js
|
|
/* global msg */
|
|
'use strict';
|
|
|
|
/* exported navMan */
|
|
const navMan = (() => {
|
|
const listeners = new Set();
|
|
|
|
chrome.webNavigation.onCommitted.addListener(onNavigation.bind('committed'));
|
|
chrome.webNavigation.onHistoryStateUpdated.addListener(onFakeNavigation.bind('history'));
|
|
chrome.webNavigation.onReferenceFragmentUpdated.addListener(onFakeNavigation.bind('hash'));
|
|
|
|
return {
|
|
/** @param {function(data: Object, type: ('committed'|'history'|'hash'))} fn */
|
|
onUrlChange(fn) {
|
|
listeners.add(fn);
|
|
},
|
|
};
|
|
|
|
/** @this {string} type */
|
|
async function onNavigation(data) {
|
|
if (CHROME &&
|
|
URLS.chromeProtectsNTP &&
|
|
data.url.startsWith('https://www.google.') &&
|
|
data.url.includes('/_/chrome/newtab?')) {
|
|
// Modern Chrome switched to WebUI NTP so this is obsolete, but there may be exceptions
|
|
// TODO: investigate, and maybe use a separate listener for CHROME <= ver
|
|
const tab = await browser.tabs.get(data.tabId);
|
|
const url = tab.pendingUrl || tab.url;
|
|
if (url === 'chrome://newtab/') {
|
|
data.url = url;
|
|
}
|
|
}
|
|
listeners.forEach(fn => fn(data, this));
|
|
}
|
|
|
|
/** @this {string} type */
|
|
function onFakeNavigation(data) {
|
|
onNavigation.call(this, data);
|
|
msg.sendTab(data.tabId, {method: 'urlChanged'}, {frameId: data.frameId})
|
|
.catch(msg.ignoreError);
|
|
}
|
|
})();
|
|
|
|
bgReady.all.then(() => {
|
|
/*
|
|
* Expose style version on greasyfork/sleazyfork 1) info page and 2) code page
|
|
* Not using manifest.json as adding a content script disables the extension on update.
|
|
*/
|
|
const urlMatches = '/scripts/\\d+[^/]*(/code)?([?#].*)?$';
|
|
chrome.webNavigation.onCommitted.addListener(({tabId}) => {
|
|
chrome.tabs.executeScript(tabId, {
|
|
file: '/content/install-hook-greasyfork.js',
|
|
runAt: 'document_start',
|
|
});
|
|
}, {
|
|
url: [
|
|
{hostEquals: 'greasyfork.org', urlMatches},
|
|
{hostEquals: 'sleazyfork.org', urlMatches},
|
|
],
|
|
});
|
|
/*
|
|
* FF misses some about:blank iframes so we inject our content script explicitly
|
|
*/
|
|
if (FIREFOX) {
|
|
chrome.webNavigation.onDOMContentLoaded.addListener(async ({tabId, frameId}) => {
|
|
if (frameId &&
|
|
!await msg.sendTab(tabId, {method: 'ping'}, {frameId}).catch(ignoreChromeError)) {
|
|
for (const file of chrome.runtime.getManifest().content_scripts[0].js) {
|
|
chrome.tabs.executeScript(tabId, {
|
|
frameId,
|
|
file,
|
|
matchAboutBlank: true,
|
|
}, ignoreChromeError);
|
|
}
|
|
}
|
|
}, {
|
|
url: [{urlEquals: 'about:blank'}],
|
|
});
|
|
}
|
|
});
|