2020-05-17 21:31:43 +00:00
|
|
|
const {
|
2020-05-12 22:24:41 +00:00
|
|
|
FLASH_MIMETYPE,
|
|
|
|
FUTURESPLASH_MIMETYPE,
|
|
|
|
FLASH7_AND_8_MIMETYPE,
|
|
|
|
FLASH_MOVIE_MIMETYPE,
|
|
|
|
FLASH_ACTIVEX_CLASSID,
|
|
|
|
is_swf_filename,
|
|
|
|
RufflePlayer,
|
2020-05-17 21:31:43 +00:00
|
|
|
} = require("./ruffle-player.js");
|
|
|
|
const { register_element } = require("./register-element");
|
2019-08-22 01:02:43 +00:00
|
|
|
|
2020-05-17 21:31:43 +00:00
|
|
|
module.exports = class RuffleObject extends RufflePlayer {
|
2019-08-22 01:02:43 +00:00
|
|
|
constructor(...args) {
|
2020-05-12 22:04:27 +00:00
|
|
|
super(...args);
|
2019-08-22 01:02:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
connectedCallback() {
|
2019-08-25 19:46:38 +00:00
|
|
|
super.connectedCallback();
|
2020-05-12 22:24:41 +00:00
|
|
|
|
2019-08-22 01:02:43 +00:00
|
|
|
this.params = RuffleObject.params_of(this);
|
2020-03-21 01:27:59 +00:00
|
|
|
|
2020-09-02 21:34:04 +00:00
|
|
|
const allowScriptAccess = RuffleObject.find_case_insensitive(
|
|
|
|
this.params,
|
|
|
|
"allowScriptAccess",
|
|
|
|
"sameDomain"
|
|
|
|
);
|
|
|
|
let url = null;
|
|
|
|
console.log("AllowScriptAccess: " + allowScriptAccess);
|
|
|
|
|
2019-09-14 19:40:19 +00:00
|
|
|
if (this.attributes.data) {
|
2020-09-02 21:34:04 +00:00
|
|
|
url = this.attributes.data.value;
|
2019-09-14 19:40:19 +00:00
|
|
|
} else if (this.params.movie) {
|
2020-09-02 21:34:04 +00:00
|
|
|
url = this.params.movie;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (url) {
|
|
|
|
this.allow_script_access =
|
|
|
|
allowScriptAccess &&
|
|
|
|
(allowScriptAccess.toLowerCase() === "always" ||
|
|
|
|
(allowScriptAccess.toLowerCase() === "samedomain" &&
|
|
|
|
new URL(window.location.href).origin ===
|
|
|
|
new URL(url, window.location.href).origin));
|
|
|
|
|
|
|
|
//Kick off the SWF download.
|
|
|
|
this.stream_swf_url(url);
|
2019-08-22 01:02:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-14 19:40:19 +00:00
|
|
|
get data() {
|
|
|
|
return this.attributes.data.value;
|
|
|
|
}
|
|
|
|
|
|
|
|
set data(href) {
|
|
|
|
this.attributes.data = href;
|
|
|
|
}
|
|
|
|
|
2019-08-22 01:02:43 +00:00
|
|
|
static is_interdictable(elem) {
|
2020-05-12 06:33:46 +00:00
|
|
|
if (!elem.data) {
|
|
|
|
let has_movie = false;
|
|
|
|
let params = elem.getElementsByTagName("param");
|
2020-05-12 22:24:41 +00:00
|
|
|
for (let i = 0; i < params.length; i++) {
|
2020-05-12 06:33:46 +00:00
|
|
|
if (params[i].name == "movie" && params[i].value) {
|
|
|
|
has_movie = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!has_movie) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2020-05-12 22:24:41 +00:00
|
|
|
if (
|
2020-07-14 13:50:05 +00:00
|
|
|
elem.type.toLowerCase() === FLASH_MIMETYPE.toLowerCase() ||
|
|
|
|
elem.type.toLowerCase() === FUTURESPLASH_MIMETYPE.toLowerCase() ||
|
|
|
|
elem.type.toLowerCase() == FLASH7_AND_8_MIMETYPE.toLowerCase() ||
|
|
|
|
elem.type.toLowerCase() == FLASH_MOVIE_MIMETYPE.toLowerCase()
|
2020-05-12 22:24:41 +00:00
|
|
|
) {
|
2020-03-21 01:27:59 +00:00
|
|
|
return true;
|
2020-05-12 22:24:41 +00:00
|
|
|
} else if (
|
|
|
|
elem.attributes &&
|
|
|
|
elem.attributes.classid &&
|
2020-07-14 13:50:05 +00:00
|
|
|
elem.attributes.classid.value.toLowerCase() ===
|
|
|
|
FLASH_ACTIVEX_CLASSID.toLowerCase()
|
2020-05-12 22:24:41 +00:00
|
|
|
) {
|
2020-03-21 01:27:59 +00:00
|
|
|
return true;
|
2020-05-12 22:24:41 +00:00
|
|
|
} else if (
|
|
|
|
(elem.type === undefined || elem.type === "") &&
|
|
|
|
elem.attributes.classid === undefined
|
|
|
|
) {
|
2020-03-21 01:27:59 +00:00
|
|
|
let params = RuffleObject.params_of(elem);
|
2020-07-14 13:53:08 +00:00
|
|
|
if (elem.data && is_swf_filename(elem.data)) {
|
|
|
|
return true;
|
|
|
|
} else if (
|
|
|
|
params &&
|
|
|
|
params.movie &&
|
|
|
|
is_swf_filename(params.movie)
|
|
|
|
) {
|
|
|
|
return true;
|
2020-03-21 01:27:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2019-08-22 01:02:43 +00:00
|
|
|
}
|
|
|
|
|
2020-09-02 21:34:04 +00:00
|
|
|
/*
|
|
|
|
* Find and return the first value in obj with the given key.
|
|
|
|
* Many Flash params were case insensitive, so we use this when checking for them.
|
|
|
|
*/
|
|
|
|
static find_case_insensitive(obj, key, defaultValue) {
|
|
|
|
key = key.toLowerCase();
|
|
|
|
for (const k in obj) {
|
|
|
|
if (obj.hasOwnProperty(k) && key === k.toLowerCase()) {
|
|
|
|
return obj[k];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
|
2019-08-22 01:02:43 +00:00
|
|
|
static params_of(elem) {
|
|
|
|
let params = {};
|
|
|
|
|
|
|
|
for (let param of elem.children) {
|
|
|
|
if (param.constructor === HTMLParamElement) {
|
|
|
|
params[param.name] = param.value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return params;
|
|
|
|
}
|
|
|
|
|
|
|
|
static from_native_object_element(elem) {
|
2019-10-15 12:55:13 +00:00
|
|
|
let external_name = register_element("ruffle-object", RuffleObject);
|
|
|
|
let ruffle_obj = document.createElement(external_name);
|
2020-03-26 09:54:35 +00:00
|
|
|
ruffle_obj.copy_element(elem);
|
2019-08-22 01:02:43 +00:00
|
|
|
|
|
|
|
return ruffle_obj;
|
|
|
|
}
|
2020-05-17 21:31:43 +00:00
|
|
|
};
|