core: Replace SwfMovie's PropertyMap by a list of key-value pairs

PropertyMap is an AVM1-only concept, and shouldn't be used on cross-VM
types.
This commit is contained in:
Moulins 2021-05-03 20:11:38 +02:00 committed by Mike Welsh
parent 297e4b5cae
commit 272841729e
5 changed files with 23 additions and 30 deletions

View File

@ -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<Mutex<Player>>,
fetch: OwnedFuture<Vec<u8>, Error>,
url: String,
parameters: PropertyMap<String>,
parameters: Vec<(String, String)>,
on_metadata: Box<dyn FnOnce(&swf::Header)>,
) -> OwnedFuture<(), Error> {
let loader = Loader::RootMovie { self_handle: None };
@ -366,7 +365,7 @@ impl<'gc> Loader<'gc> {
player: Weak<Mutex<Player>>,
fetch: OwnedFuture<Vec<u8>, Error>,
mut url: String,
parameters: PropertyMap<String>,
parameters: Vec<(String, String)>,
on_metadata: Box<dyn FnOnce(&swf::Header)>,
) -> 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))

View File

@ -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<String>,
parameters: Vec<(String, String)>,
on_metadata: Box<dyn FnOnce(&swf::Header)>,
) {
self.mutate_with_update_context(|context| {

View File

@ -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<String>,
/// Any parameters provided when loading this movie (also known as 'flashvars')
parameters: PropertyMap<String>,
/// 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<String> {
pub fn parameters(&self) -> &[(String, String)] {
&self.parameters
}
pub fn parameters_mut(&mut self) -> &mut PropertyMap<String> {
&mut self.parameters
pub fn append_parameters(&mut self, params: impl IntoIterator<Item = (String, String)>) {
self.parameters.extend(params);
}
pub fn compressed_length(&self) -> usize {

View File

@ -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(&parameter, "".to_string(), true);
(parameter.clone(), "".to_string())
}
}
});
movie.append_parameters(parameters)
}
fn run_player(opt: Opt) -> Result<(), Box<dyn std::error::Error>> {

View File

@ -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(&parameters, &mut parameters_to_load);
let parameters_to_load = parse_movie_parameters(&parameters);
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(&parameters, movie.parameters_mut());
movie.append_parameters(parse_movie_parameters(&parameters));
movie
});
@ -1260,16 +1258,18 @@ pub fn set_panic_handler() {
});
}
fn populate_movie_parameters(input: &JsValue, output: &mut PropertyMap<String>) {
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<str>) -> Option<Color> {