| Index: include.preload.js |
| =================================================================== |
| --- a/include.preload.js |
| +++ b/include.preload.js |
| @@ -70,6 +70,8 @@ |
| } |
| ); |
| } |
| + |
| + window.collapsing = true; |
| } |
| function checkSitekey() |
| @@ -79,29 +81,16 @@ |
| ext.backgroundPage.sendMessage({type: "add-sitekey", token: attr}); |
| } |
| -function isFrameWithoutContentScript(element) |
| +function getContentDocument(element) |
| { |
| - var contentDocument; |
| try |
| { |
| - contentDocument = element.contentDocument; |
| + return element.contentDocument; |
| } |
| catch (e) |
| { |
| - // This is a third-party frame. Hence we can't access it. |
| - // But that's fine, our content script should already run there. |
| - return false; |
| + return null; |
| } |
| - |
| - // The element isn't a <frame>, <iframe> or <object> with "data" attribute. |
| - if (!contentDocument) |
| - return false; |
| - |
| - // Return true, if the element is a first-party frame which doesn't |
| - // have this function, hence our content script isn't running there. |
| - // Those are dynamically created frames as well as frames |
| - // with "about:blank", "about:srcdoc" and "javascript:" URL. |
| - return !("isFrameWithoutContentScript" in contentDocument.defaultView); |
| } |
| function reinjectRulesWhenRemoved(document, style) |
| @@ -271,16 +260,29 @@ |
| if (/^i?frame$/.test(element.localName)) |
| checkCollapse(element); |
| - // prior to Chrome 37, content scripts cannot run on about:blank, |
| - // about:srcdoc and javascript: URLs. Moreover, as of Chrome 40 |
| - // "load" and "error" events aren't dispatched there. So we have |
| - // to apply element hiding and collapsing from the parent frame. |
| - if (/\bChrome\//.test(navigator.userAgent) && isFrameWithoutContentScript(element)) |
| + if (/\bChrome\//.test(navigator.userAgent)) |
| { |
| - init(element.contentDocument); |
| + var contentDocument = getContentDocument(element); |
| + if (contentDocument) |
| + { |
| + var contentWindow = contentDocument.defaultView; |
| + if (contentDocument instanceof contentWindow.HTMLDocument) |
|
kzar
2015/03/26 12:07:57
Perhaps we should check that contentWindow isn't n
Sebastian Noack
2015/03/26 13:41:19
I think we can assume frames having a document, al
|
| + { |
| + // Prior to Chrome 37, content scripts cannot run in |
| + // dynamically created frames. Also on Chrome 37-40 |
| + // document_start content scripts (like this one) don't |
| + // run either in those frames due to https://crbug.com/416907. |
| + // So we have to apply element hiding from the parent frame. |
| + if (!("init" in contentWindow)) |
| + init(contentDocument); |
| - for (var tagName in typeMap) |
| - Array.prototype.forEach.call(element.contentDocument.getElementsByTagName(tagName), checkCollapse); |
| + // Moreover, "load" and "error" events aren't dispatched for elements |
| + // in dynamically created frames due to https://crbug.com/442107. |
| + // So we also have to apply element collpasing from the parent frame. |
| + if (!contentWindow.collapsing) |
| + [].forEach.call(contentDocument.querySelectorAll(Object.keys(typeMap).join(",")), checkCollapse); |
|
kzar
2015/03/26 12:07:57
Couldn't we put this forEach loop under the above
Sebastian Noack
2015/03/26 13:41:19
We are dealing two different issues here:
1. The
kzar
2015/03/26 14:14:58
OK, thanks for explaining.
|
| + } |
| + } |
| } |
| }, true); |