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
 | 
					// register all listeners
 | 
				
			||||||
chrome.runtime.onMessage.addListener(onRuntimeMessage);
 | 
					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 =
 | 
					  const listener =
 | 
				
			||||||
    URLS.chromeProtectsNTP
 | 
					    URLS.chromeProtectsNTP
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,11 +50,35 @@
 | 
				
			||||||
    // On own pages we request the styles directly to minimize delay and flicker
 | 
					    // On own pages we request the styles directly to minimize delay and flicker
 | 
				
			||||||
    if (typeof API === 'function') {
 | 
					    if (typeof API === 'function') {
 | 
				
			||||||
      API.getStyles(request).then(callback);
 | 
					      API.getStyles(request).then(callback);
 | 
				
			||||||
 | 
					    } else if (!CHROME && getStylesFallback(request)) {
 | 
				
			||||||
 | 
					      // NOP
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      chrome.runtime.sendMessage(request, callback);
 | 
					      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) {
 | 
					  function applyOnMessage(request, sender, sendResponse) {
 | 
				
			||||||
    if (request.styles === 'DIY') {
 | 
					    if (request.styles === 'DIY') {
 | 
				
			||||||
      // Do-It-Yourself tells our built-in pages to fetch the styles directly
 | 
					      // Do-It-Yourself tells our built-in pages to fetch the styles directly
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user