diff --git a/core/src/loader.rs b/core/src/loader.rs index 011f5c200..417e19912 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -7,7 +7,6 @@ use crate::backend::navigator::OwnedFuture; use crate::context::{ActionQueue, ActionType}; use crate::display_object::{DisplayObject, MorphShape, TDisplayObject}; use crate::player::{Player, NEWEST_PLAYER_VERSION}; -use crate::property_map::PropertyMap; use crate::tag_utils::SwfMovie; use crate::vminterface::Instantiator; use crate::xml::XmlNode; @@ -127,7 +126,7 @@ impl<'gc> LoadManager<'gc> { player: Weak>, fetch: OwnedFuture, Error>, url: String, - parameters: PropertyMap, + parameters: Vec<(String, String)>, on_metadata: Box, ) -> OwnedFuture<(), Error> { let loader = Loader::RootMovie { self_handle: None }; @@ -366,7 +365,7 @@ impl<'gc> Loader<'gc> { player: Weak>, fetch: OwnedFuture, Error>, mut url: String, - parameters: PropertyMap, + parameters: Vec<(String, String)>, on_metadata: Box, ) -> OwnedFuture<(), Error> { let _handle = match self { @@ -399,12 +398,8 @@ impl<'gc> Loader<'gc> { if let Ok((_length, mut movie)) = data { on_metadata(movie.header()); - - for (key, value) in parameters.iter() { - movie.parameters_mut().insert(key, value.to_owned(), false); - } + movie.append_parameters(parameters); player.lock().unwrap().set_root_movie(Arc::new(movie)); - Ok(()) } else { Err(Error::FetchError(url)) diff --git a/core/src/player.rs b/core/src/player.rs index 9e244f864..c17f0c4ce 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -26,7 +26,6 @@ use crate::focus_tracker::FocusTracker; use crate::library::Library; use crate::loader::LoadManager; use crate::prelude::*; -use crate::property_map::PropertyMap; use crate::tag_utils::SwfMovie; use crate::transform::TransformStack; use crate::vminterface::{AvmType, Instantiator}; @@ -346,7 +345,7 @@ impl Player { pub fn fetch_root_movie( &mut self, movie_url: &str, - parameters: PropertyMap, + parameters: Vec<(String, String)>, on_metadata: Box, ) { self.mutate_with_update_context(|context| { diff --git a/core/src/tag_utils.rs b/core/src/tag_utils.rs index 933d6819a..573cb2b30 100644 --- a/core/src/tag_utils.rs +++ b/core/src/tag_utils.rs @@ -1,5 +1,4 @@ use crate::backend::navigator::url_from_relative_path; -use crate::property_map::PropertyMap; use gc_arena::Collect; use std::path::Path; use std::sync::Arc; @@ -26,8 +25,9 @@ pub struct SwfMovie { /// The URL that triggered the SWF load. loader_url: Option, - /// Any parameters provided when loading this movie (also known as 'flashvars') - parameters: PropertyMap, + /// Any parameters provided when loading this movie (also known as 'flashvars'), + /// as a list of key-value pairs. + parameters: Vec<(String, String)>, /// The suggest encoding for this SWF. encoding: &'static swf::Encoding, @@ -51,7 +51,7 @@ impl SwfMovie { data: vec![], url: None, loader_url: None, - parameters: PropertyMap::new(), + parameters: Vec::new(), encoding: swf::UTF_8, compressed_length: 0, } @@ -100,7 +100,7 @@ impl SwfMovie { data: swf_buf.data, url, loader_url, - parameters: PropertyMap::new(), + parameters: Vec::new(), encoding, compressed_length, }) @@ -145,12 +145,12 @@ impl SwfMovie { self.loader_url.as_deref() } - pub fn parameters(&self) -> &PropertyMap { + pub fn parameters(&self) -> &[(String, String)] { &self.parameters } - pub fn parameters_mut(&mut self) -> &mut PropertyMap { - &mut self.parameters + pub fn append_parameters(&mut self, params: impl IntoIterator) { + self.parameters.extend(params); } pub fn compressed_length(&self) -> usize { diff --git a/desktop/src/main.rs b/desktop/src/main.rs index ebd75a3fc..58e1ac1f3 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -158,16 +158,15 @@ fn load_movie_from_path( } fn set_movie_parameters(movie: &mut SwfMovie, parameters: &[String]) { - for parameter in parameters { + let parameters = parameters.iter().map(|parameter| { let mut split = parameter.splitn(2, '='); if let (Some(key), Some(value)) = (split.next(), split.next()) { - movie.parameters_mut().insert(key, value.to_string(), true); + (key.to_owned(), value.to_owned()) } else { - movie - .parameters_mut() - .insert(¶meter, "".to_string(), true); + (parameter.clone(), "".to_string()) } - } + }); + movie.append_parameters(parameters) } fn run_player(opt: Opt) -> Result<(), Box> { diff --git a/web/src/lib.rs b/web/src/lib.rs index 8a3ee9cc1..b7fa266c1 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -27,7 +27,6 @@ use ruffle_core::events::{KeyCode, MouseWheelDelta}; use ruffle_core::external::{ ExternalInterfaceMethod, ExternalInterfaceProvider, Value as ExternalValue, Value, }; -use ruffle_core::property_map::PropertyMap; use ruffle_core::tag_utils::SwfMovie; use ruffle_core::{Color, Player, PlayerEvent}; use ruffle_web_common::JsResult; @@ -205,8 +204,7 @@ impl Ruffle { /// This method should only be called once per player. pub fn stream_from(&mut self, movie_url: &str, parameters: &JsValue) -> Result<(), JsValue> { let _ = self.with_core_mut(|core| { - let mut parameters_to_load = PropertyMap::new(); - populate_movie_parameters(¶meters, &mut parameters_to_load); + let parameters_to_load = parse_movie_parameters(¶meters); let ruffle = *self; let on_metadata = move |swf_header: &ruffle_core::swf::Header| { @@ -227,7 +225,7 @@ impl Ruffle { swf_data.copy_to(&mut data[..]); let mut movie = SwfMovie::from_data(&data, None, None) .map_err(|e| format!("Error loading movie: {}", e))?; - populate_movie_parameters(¶meters, movie.parameters_mut()); + movie.append_parameters(parse_movie_parameters(¶meters)); movie }); @@ -1260,16 +1258,18 @@ pub fn set_panic_handler() { }); } -fn populate_movie_parameters(input: &JsValue, output: &mut PropertyMap) { +fn parse_movie_parameters(input: &JsValue) -> Vec<(String, String)> { + let mut params = Vec::new(); if let Ok(keys) = js_sys::Reflect::own_keys(input) { for key in keys.values().into_iter().flatten() { if let Ok(value) = js_sys::Reflect::get(input, &key) { if let (Some(key), Some(value)) = (key.as_string(), value.as_string()) { - output.insert(&key, value, false); + params.push((key, value)) } } } } + params } fn parse_html_color(color: impl AsRef) -> Option {