| Index: include.preload.js |
| =================================================================== |
| --- a/include.preload.js |
| +++ b/include.preload.js |
| @@ -29,21 +29,118 @@ |
| "embed": "OBJECT" |
| }; |
| +function getURLsFromObjectElement(element) |
| +{ |
| + var url = element.getAttribute("data"); |
| + if (url) |
| + return [url]; |
| + |
| + for (var i = 0; i < element.children.length; i++) |
| + { |
| + var child = element.children[i]; |
| + if (child.localName != "param") |
| + continue; |
| + |
| + var name = child.getAttribute("name"); |
| + if (name != "movie" && // Adobe Flash |
| + name != "source" && // Silverlight |
| + name != "src" && // Real Media + Quicktime |
| + name != "FileName") // Windows Media |
| + continue; |
| + |
| + var value = child.getAttribute("value"); |
| + if (!value) |
| + continue; |
| + |
| + return [value]; |
| + } |
| + |
| + return []; |
| +} |
| + |
| +function getURLsFromAttributes(element) |
| +{ |
| + var urls = []; |
| + |
| + if (element.src) |
| + urls.push(element.src); |
| + |
| + if (element.srcset) |
| + { |
| + var candidates = element.srcset.split(","); |
| + for (var i = 0; i < candidates.length; i++) |
| + { |
| + var url = candidates[i].trim().replace(/\s+\S+$/, ""); |
| + if (url) |
| + urls.push(url); |
| + } |
| + } |
| + |
| + return urls; |
| +} |
| + |
| +function getURLsFromMediaElement(element) |
| +{ |
| + var urls = getURLsFromAttributes(element); |
| + |
| + for (var i = 0; i < element.children.length; i++) |
| + { |
| + var child = element.children[i]; |
| + if (child.localName == "source" || child.localName == "track") |
| + urls.push.apply(urls, getURLsFromAttributes(child)); |
| + } |
| + |
| + if (element.poster) |
| + urls.push(element.poster); |
| + |
| + return urls; |
| +} |
| + |
| +function getURLsFromElement(element) |
| +{ |
| + var urls; |
| + switch (element.localName) |
| + { |
| + case "object": |
| + urls = getURLsFromObjectElement(element); |
| + break; |
| + |
| + case "video": |
| + case "audio": |
| + case "picture": |
| + urls = getURLsFromMediaElement(element); |
| + break; |
| + |
| + default: |
| + urls = getURLsFromAttributes(element); |
| + break; |
| + } |
| + |
| + for (var i = 0; i < urls.length; i++) |
| + { |
| + if (/^(?!https?:)[\w-]+:/i.test(urls[i])) |
| + urls.splice(i--, 1); |
| + } |
| + |
| + return urls; |
| +} |
| + |
| function checkCollapse(element) |
| { |
| var tag = element.localName; |
| if (tag in typeMap) |
| { |
| // This element failed loading, did we block it? |
| - var url = element.src; |
| - if (!url || !/^https?:/i.test(url)) |
| + var urls = getURLsFromElement(element); |
| + if (urls.length == 0) |
| return; |
| ext.backgroundPage.sendMessage( |
| { |
| type: "should-collapse", |
| - url: url, |
| - mediatype: typeMap[tag] |
| + urls: urls, |
| + mediatype: typeMap[tag], |
| + baseURL: document.location.href |
| }, |
| function(response) |