FF bug workaround: apply styles to more iframes
This commit is contained in:
parent
92d6530c8f
commit
406a7cd4c0
|
@ -56,6 +56,32 @@ var browserCommands, contextMenus;
|
|||
// register all listeners
|
||||
chrome.runtime.onMessage.addListener(onRuntimeMessage);
|
||||
|
||||
if (FIREFOX) {
|
||||
// see notes in apply.js for getStylesFallback
|
||||
const MSG_GET_STYLES = 'getStyles:';
|
||||
const MSG_GET_STYLES_LEN = MSG_GET_STYLES.length;
|
||||
chrome.runtime.onConnect.addListener(port => {
|
||||
if (!port.name.startsWith(MSG_GET_STYLES)) return;
|
||||
const tabId = port.sender.tab.id;
|
||||
const frameId = port.sender.frameId;
|
||||
const options = tryJSONparse(port.name.slice(MSG_GET_STYLES_LEN));
|
||||
port.disconnect();
|
||||
getStyles(options).then(styles => {
|
||||
if (!styles.length) return;
|
||||
chrome.tabs.executeScript(tabId, {
|
||||
code: `
|
||||
applyOnMessage({
|
||||
method: 'styleApply',
|
||||
styles: ${JSON.stringify(styles)},
|
||||
})
|
||||
`,
|
||||
runAt: 'document_start',
|
||||
frameId,
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
const listener =
|
||||
URLS.chromeProtectsNTP
|
||||
|
|
|
@ -50,11 +50,35 @@
|
|||
// On own pages we request the styles directly to minimize delay and flicker
|
||||
if (typeof API === 'function') {
|
||||
API.getStyles(request).then(callback);
|
||||
} else if (!CHROME && getStylesFallback(request)) {
|
||||
// NOP
|
||||
} else {
|
||||
chrome.runtime.sendMessage(request, callback);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: remove when FF fixes the bug.
|
||||
* Firefox borks sendMessage in same-origin iframes that have 'src' with a real path on the site.
|
||||
* We implement a workaround for the initial styleApply case only.
|
||||
* Everything else (like toggling of styles) is still buggy.
|
||||
* @param {Object} msg
|
||||
* @param {Function} callback
|
||||
* @returns {Boolean|undefined}
|
||||
*/
|
||||
function getStylesFallback(msg) {
|
||||
if (window !== parent &&
|
||||
location.href !== 'about:blank') {
|
||||
try {
|
||||
if (parent.location.origin === location.origin &&
|
||||
parent.location.href !== location.href) {
|
||||
chrome.runtime.connect({name: 'getStyles:' + JSON.stringify(msg)});
|
||||
return true;
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function applyOnMessage(request, sender, sendResponse) {
|
||||
if (request.styles === 'DIY') {
|
||||
// Do-It-Yourself tells our built-in pages to fetch the styles directly
|
||||
|
|
Loading…
Reference in New Issue
Block a user