parent
74eb7c7ecd
commit
dcdb4be10b
|
@ -18,6 +18,13 @@
|
|||
var docRewriteObserver;
|
||||
var docRootObserver;
|
||||
|
||||
// FF59+ bug workaround
|
||||
// See https://github.com/openstyles/stylus/issues/461
|
||||
// Since it's easy to spoof the browser version in pre-Quantum FF we're checking
|
||||
// for getPreventDefault which got removed in FF59 https://bugzil.la/691151
|
||||
const FF_BUG461 = !CHROME && !isOwnPage && !Event.prototype.getPreventDefault;
|
||||
const pageContextQueue = [];
|
||||
|
||||
requestStyles();
|
||||
chrome.runtime.onMessage.addListener(applyOnMessage);
|
||||
window.applyOnMessage = applyOnMessage;
|
||||
|
@ -262,6 +269,10 @@
|
|||
docRootObserver.firstStart();
|
||||
}
|
||||
|
||||
if (FF_BUG461 && (gotNewStyles || styles.needTransitionPatch)) {
|
||||
setContentsInPageContext();
|
||||
}
|
||||
|
||||
if (!isOwnPage && !docRewriteObserver && styleElements.size) {
|
||||
initDocRewriteObserver();
|
||||
}
|
||||
|
@ -284,6 +295,8 @@
|
|||
// workaround for Chrome devtools bug fixed in v65
|
||||
el.remove();
|
||||
el = null;
|
||||
} else if (FF_BUG461) {
|
||||
pageContextQueue.push({id: el.id, el, code});
|
||||
} else {
|
||||
el.textContent = code;
|
||||
}
|
||||
|
@ -303,12 +316,8 @@
|
|||
el.type = 'text/css';
|
||||
// SVG className is not a string, but an instance of SVGAnimatedString
|
||||
el.classList.add('stylus');
|
||||
if (!CHROME && (
|
||||
// FF bug workaround, see https://github.com/openstyles/stylus/issues/461
|
||||
location.hostname === 'www.barclaycardus.com' ||
|
||||
location.hostname === 'www.icloud.com'
|
||||
)) {
|
||||
setContentsInPageContext(el, code);
|
||||
if (FF_BUG461) {
|
||||
pageContextQueue.push({id: el.id, el, code});
|
||||
} else {
|
||||
el.textContent = code;
|
||||
}
|
||||
|
@ -319,16 +328,31 @@
|
|||
return el;
|
||||
}
|
||||
|
||||
function setContentsInPageContext(el, code) {
|
||||
const originalId = el.id;
|
||||
el.id += performance.now();
|
||||
// when adding to ROOT we don't want our observer to pop up so we use a DIV wrapper
|
||||
(document.head || ROOT.appendChild(document.createElement('div'))).appendChild(el);
|
||||
(document.head || ROOT).appendChild(document.createElement('script')).text = `
|
||||
document.currentScript.remove();
|
||||
document.getElementById('${el.id}').textContent = ${JSON.stringify(code)};`;
|
||||
if (!document.head) el.parentNode.remove();
|
||||
el.id = originalId;
|
||||
function setContentsInPageContext() {
|
||||
try {
|
||||
(document.head || ROOT).appendChild(document.createElement('script')).text = `
|
||||
document.currentScript.remove();
|
||||
for (const {id, code} of ${JSON.stringify(pageContextQueue)}) {
|
||||
(
|
||||
document.getElementById(id) ||
|
||||
document.querySelector('style.stylus[id="' + id + '"]') ||
|
||||
{}
|
||||
).textContent = code;
|
||||
}
|
||||
`;
|
||||
} 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) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user