diff --git a/web/packages/core/src/load-options.ts b/web/packages/core/src/load-options.ts index 271c251e0..578850c20 100644 --- a/web/packages/core/src/load-options.ts +++ b/web/packages/core/src/load-options.ts @@ -316,4 +316,11 @@ export interface DataLoadOptions extends BaseLoadOptions { * The data to load a movie from. */ data: Iterable; + + /** + * The filename of the SWF movie to provide to ActionScript. + * + * @default "movie.swf" + */ + swfFileName?: string; } diff --git a/web/packages/core/src/ruffle-player.ts b/web/packages/core/src/ruffle-player.ts index a5707ca0e..4cbaaacfc 100644 --- a/web/packages/core/src/ruffle-player.ts +++ b/web/packages/core/src/ruffle-player.ts @@ -640,7 +640,8 @@ export class RufflePlayer extends HTMLElement { console.log("Loading SWF data"); this.instance!.load_data( new Uint8Array(options.data), - sanitizeParameters(options.parameters) + sanitizeParameters(options.parameters), + options.swfFileName || "movie.swf" ); } } catch (err) { diff --git a/web/packages/demo/www/index.js b/web/packages/demo/www/index.js index 2be091fc7..e83678cda 100644 --- a/web/packages/demo/www/index.js +++ b/web/packages/demo/www/index.js @@ -144,7 +144,7 @@ async function loadFile(file) { } hideSample(); const data = await new Response(file).arrayBuffer(); - load({ data, ...defaultConfig }); + load({ data: data, swfFileName: file.name, ...defaultConfig }); } function loadSample() { diff --git a/web/src/lib.rs b/web/src/lib.rs index 5fc117cfc..2bfc70b2c 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -29,6 +29,7 @@ use std::{cell::RefCell, error::Error, num::NonZeroI32}; use tracing_subscriber::layer::{Layered, SubscriberExt}; use tracing_subscriber::registry::Registry; use tracing_wasm::{WASMLayer, WASMLayerConfigBuilder}; +use url::Url; use wasm_bindgen::{prelude::*, JsCast, JsValue}; use web_sys::{ AddEventListenerOptions, Element, Event, EventTarget, HtmlCanvasElement, HtmlElement, @@ -240,8 +241,23 @@ impl Ruffle { /// Play an arbitrary movie on this instance. /// /// This method should only be called once per player. - pub fn load_data(&mut self, swf_data: Uint8Array, parameters: JsValue) -> Result<(), JsValue> { - let mut movie = SwfMovie::from_data(&swf_data.to_vec(), None, None) + pub fn load_data( + &mut self, + swf_data: Uint8Array, + parameters: JsValue, + swf_name: String, + ) -> Result<(), JsValue> { + let window = web_sys::window().ok_or("Expected window")?; + let mut url = Url::from_str(&window.location().href()?) + .map_err(|e| format!("Error creating url: {e}"))?; + url.set_query(None); + url.set_fragment(None); + if let Ok(mut segments) = url.path_segments_mut() { + segments.pop(); + segments.push(&swf_name); + } + + let mut movie = SwfMovie::from_data(&swf_data.to_vec(), Some(url.to_string()), None) .map_err(|e| format!("Error loading movie: {e}"))?; movie.append_parameters(parse_movie_parameters(¶meters));