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:
parent
297e4b5cae
commit
272841729e
|
@ -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))
|
||||
|
|
|
@ -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| {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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<dyn std::error::Error>> {
|
||||
|
|
|
@ -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<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> {
|
||||
|
|
Loading…
Reference in New Issue