97 lines
3.5 KiB
JavaScript
97 lines
3.5 KiB
JavaScript
import RuffleObject from "./ruffle-object";
|
|
import RuffleEmbed from "./ruffle-embed";
|
|
import { install_plugin, FLASH_PLUGIN } from "./plugin-polyfill";
|
|
import register_element from "./register-element";
|
|
|
|
/**
|
|
* Interdict native elements with Ruffle equivalents.
|
|
*
|
|
* This interdiction isn't fool-proof: If there's a chance site JavaScript has
|
|
* access to a pre-interdiction element, then this will break horribly. We can
|
|
* keep native objects out of the DOM, and thus out of JavaScript's grubby
|
|
* little hands, but only if we load first.
|
|
*/
|
|
function wrap_tree(elem) {
|
|
try {
|
|
if (elem.nodeName.toLowerCase() === "object" && RuffleObject.is_interdictable(elem)) {
|
|
let ruffle_obj = RuffleObject.from_native_object_element(elem);
|
|
elem.parentElement.replaceChild(ruffle_obj, elem);
|
|
} else if (elem.nodeName.toLowerCase() === "embed" && RuffleEmbed.is_interdictable(elem)) {
|
|
let ruffle_obj = RuffleEmbed.from_native_object_element(elem);
|
|
elem.parentElement.replaceChild(ruffle_obj, elem);
|
|
} else {
|
|
for (let node of Array.from(elem.getElementsByTagName("object"))) {
|
|
if (RuffleObject.is_interdictable(node)) {
|
|
let ruffle_obj = RuffleObject.from_native_object_element(node);
|
|
node.parentElement.replaceChild(ruffle_obj, node);
|
|
}
|
|
}
|
|
|
|
for (let node of Array.from(elem.getElementsByTagName("embed"))) {
|
|
if (RuffleEmbed.is_interdictable(node)) {
|
|
let ruffle_obj = RuffleEmbed.from_native_embed_element(node);
|
|
node.parentElement.replaceChild(ruffle_obj, node);
|
|
}
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.error("Serious error encountered when interdicting native Flash elements: " + err);
|
|
}
|
|
}
|
|
|
|
function interdict_static_content() {
|
|
wrap_tree(document.getElementsByTagName("html")[0]);
|
|
}
|
|
|
|
interdict_static_content.dependencies = ["legacy-elements"];
|
|
|
|
function interdict_dynamic_content() {
|
|
const observer = new MutationObserver(function (mutationsList, observer) {
|
|
for (let mutation of mutationsList) {
|
|
for (let node of mutation.addedNodes) {
|
|
if (node instanceof Element) {
|
|
wrap_tree(node);
|
|
} else {
|
|
console.error("Cannot process added node of type " + node.constructor.name);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
observer.observe(document, { childList: true, subtree: true});
|
|
}
|
|
|
|
interdict_dynamic_content.dependencies = ["legacy-elements"];
|
|
|
|
function falsify_plugin_detection() {
|
|
install_plugin(FLASH_PLUGIN);
|
|
}
|
|
|
|
var running_interdictions = [];
|
|
var interdictions = {
|
|
"static-content": interdict_static_content,
|
|
"dynamic-content": interdict_dynamic_content,
|
|
"plugin-detect": falsify_plugin_detection
|
|
};
|
|
|
|
export function interdict(interdiction_list) {
|
|
for (var i = 0; i < interdiction_list.length; i += 1) {
|
|
if (running_interdictions.indexOf(interdiction_list[i]) !== -1) {
|
|
continue;
|
|
}
|
|
|
|
if (!interdictions.hasOwnProperty(interdiction_list[i])) {
|
|
throw new Error("Requested nonexistent interdiction: " + interdiction_list[i]);
|
|
}
|
|
|
|
running_interdictions.push(interdiction_list[i]);
|
|
|
|
var interdiction = interdictions[interdiction_list[i]];
|
|
|
|
if (interdiction.dependencies !== undefined) {
|
|
interdict(interdiction.dependencies);
|
|
}
|
|
|
|
interdiction();
|
|
}
|
|
} |