I am writing a chrome extension that needs to iterate over ALL stylesheets in the page it is injected into and modify certain styles.
I iterate/modify styles for example like this:
const iterate = (doc, f) => {
for (const styleSheet of doc.styleSheets) {
const rules = styleSheet.rules || styleSheet.cssRules;
if (!rules) continue;
for (const cssRule of rules) {
if (!cssRule.style) continue;
const selector = cssRule.selectorText, style = cssRule.style;
if (!selector || !style.cssText) continue;
f(style);
}
}
}
document.addEventListener("DOMContentLoaded", e => {
setTimeout(() => {
iterate(document, style => {
if (style.getPropertyValue('background-color')) style.setProperty('background-color', 'yellow');
});
}, 1000);
});
div {
background-color: red;
}
<div>hello</div>
The problem I am having is that it seems that external css do not get included.
For example if I inject my extension into stackoverflow.com, which has:
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/stackoverflow/all.css?v=cfd0b49a38a7">
Then the styles from all.css are not iterated over.
How can I iterate/modifies external styles ?
Note 1 - I tried to manually fetch those links rel and put them into internal style tags but that breaks any relative urls in those files (i.e, background-image: url('path/image.jpg')
)
Note 2 - my manifest has "permissions": [ "http://*/*", "https://*/*" ]
Note 3 - as this is for a Chrome extension I am happy with a Chrome only solution