Index: include.preload.js |
=================================================================== |
--- a/include.preload.js |
+++ b/include.preload.js |
@@ -30,21 +30,24 @@ |
["audio", "MEDIA"], |
["video", "MEDIA"], |
["frame", "SUBDOCUMENT"], |
["iframe", "SUBDOCUMENT"], |
["object", "OBJECT"], |
["embed", "OBJECT"] |
]); |
-function getURLsFromObjectElement(element) |
+function* getURLsFromObjectElement(element) |
{ |
let url = element.getAttribute("data"); |
if (url) |
- return [url]; |
+ { |
+ yield url; |
+ return; |
+ } |
for (let child of element.children) |
{ |
if (child.localName != "param") |
continue; |
let name = child.getAttribute("name"); |
if (name != "movie" && // Adobe Flash |
@@ -52,85 +55,58 @@ |
name != "src" && // Real Media + Quicktime |
name != "FileName") // Windows Media |
continue; |
let value = child.getAttribute("value"); |
if (!value) |
continue; |
- return [value]; |
+ yield value; |
+ return; |
} |
- |
- return []; |
} |
-function getURLsFromAttributes(element) |
+function* getURLsFromAttributes({src = "", srcset = ""}) |
{ |
- let urls = []; |
- |
- if (element.src) |
- urls.push(element.src); |
+ yield src; |
- if (element.srcset) |
- { |
- for (let candidate of element.srcset.split(",")) |
- { |
- let url = candidate.trim().replace(/\s+\S+$/, ""); |
- if (url) |
- urls.push(url); |
- } |
- } |
- |
- return urls; |
+ for (let candidate of srcset.split(",")) |
+ yield candidate.trim().replace(/\s+\S+$/, ""); |
} |
-function getURLsFromMediaElement(element) |
+function* getURLsFromMediaElement(element) |
{ |
- let urls = getURLsFromAttributes(element); |
+ yield* getURLsFromAttributes(element); |
for (let child of element.children) |
{ |
if (child.localName == "source" || child.localName == "track") |
- urls.push(...getURLsFromAttributes(child)); |
+ yield* getURLsFromAttributes(child); |
} |
- if (element.poster) |
- urls.push(element.poster); |
- |
- return urls; |
+ yield element.poster; |
} |
function getURLsFromElement(element) |
{ |
- let urls; |
- switch (element.localName) |
- { |
- case "object": |
- urls = getURLsFromObjectElement(element); |
- break; |
+ let urls = null; |
- case "video": |
- case "audio": |
- case "picture": |
- urls = getURLsFromMediaElement(element); |
- break; |
+ let {localName} = element; |
- default: |
- urls = getURLsFromAttributes(element); |
- break; |
- } |
+ if (localName == "object") |
+ urls = getURLsFromObjectElement(element); |
+ else if (["video", "audio", "picture"].includes(localName)) |
+ urls = getURLsFromMediaElement(element); |
+ else |
+ urls = getURLsFromAttributes(element); |
- for (let i = 0; i < urls.length; i++) |
- { |
- if (/^(?!https?:)[\w-]+:/i.test(urls[i])) |
- urls.splice(i--, 1); |
- } |
- |
- return urls; |
+ return Array.from(urls).filter( |
+ url => url && !/^(?!https?:)[\w-]+:/i.test(url) |
+ ); |
} |
function hideElement(element) |
{ |
function doHide() |
{ |
let propertyName = "display"; |
let propertyValue = "none"; |