core: Refactor `LoadManager::load_root_movie`

Make it call `navigator.fetch()` directly rather than receiving an
existing `Future`.
This commit is contained in:
relrelb 2022-03-25 17:54:48 +03:00 committed by Mike Welsh
parent 3bbbf2f764
commit 7e4b3c1003
2 changed files with 34 additions and 31 deletions

View File

@ -3,7 +3,7 @@
use crate::avm1::activation::{Activation, ActivationIdentifier}; use crate::avm1::activation::{Activation, ActivationIdentifier};
use crate::avm1::{Avm1, Object, TObject, Value}; use crate::avm1::{Avm1, Object, TObject, Value};
use crate::avm2::{Activation as Avm2Activation, Domain as Avm2Domain}; use crate::avm2::{Activation as Avm2Activation, Domain as Avm2Domain};
use crate::backend::navigator::OwnedFuture; use crate::backend::navigator::{OwnedFuture, RequestOptions};
use crate::context::{ActionQueue, ActionType}; use crate::context::{ActionQueue, ActionType};
use crate::display_object::{DisplayObject, MorphShape, TDisplayObject}; use crate::display_object::{DisplayObject, MorphShape, TDisplayObject};
use crate::player::{Player, NEWEST_PLAYER_VERSION}; use crate::player::{Player, NEWEST_PLAYER_VERSION};
@ -106,16 +106,15 @@ impl<'gc> LoadManager<'gc> {
pub fn load_root_movie( pub fn load_root_movie(
&mut self, &mut self,
player: Weak<Mutex<Player>>, player: Weak<Mutex<Player>>,
fetch: OwnedFuture<Vec<u8>, Error>, url: &str,
url: String, options: RequestOptions,
parameters: Vec<(String, String)>, parameters: Vec<(String, String)>,
on_metadata: Box<dyn FnOnce(&swf::HeaderExt)>, on_metadata: Box<dyn FnOnce(&swf::HeaderExt)>,
) -> OwnedFuture<(), Error> { ) -> OwnedFuture<(), Error> {
let loader = Loader::RootMovie { self_handle: None }; let loader = Loader::RootMovie { self_handle: None };
let handle = self.add_loader(loader); let handle = self.add_loader(loader);
let loader = self.get_loader_mut(handle).unwrap(); let loader = self.get_loader_mut(handle).unwrap();
loader.root_movie_loader(player, url.to_owned(), options, parameters, on_metadata)
loader.root_movie_loader(player, fetch, url, parameters, on_metadata)
} }
/// Kick off a movie clip load. /// Kick off a movie clip load.
@ -274,11 +273,11 @@ pub enum Loader<'gc> {
impl<'gc> Loader<'gc> { impl<'gc> Loader<'gc> {
/// Construct a future for the root movie loader. /// Construct a future for the root movie loader.
pub fn root_movie_loader( fn root_movie_loader(
&mut self, &mut self,
player: Weak<Mutex<Player>>, player: Weak<Mutex<Player>>,
fetch: OwnedFuture<Vec<u8>, Error>, url: String,
mut url: String, options: RequestOptions,
parameters: Vec<(String, String)>, parameters: Vec<(String, String)>,
on_metadata: Box<dyn FnOnce(&swf::HeaderExt)>, on_metadata: Box<dyn FnOnce(&swf::HeaderExt)>,
) -> OwnedFuture<(), Error> { ) -> OwnedFuture<(), Error> {
@ -294,29 +293,31 @@ impl<'gc> Loader<'gc> {
.expect("Could not upgrade weak reference to player"); .expect("Could not upgrade weak reference to player");
Box::pin(async move { Box::pin(async move {
player // clippy reports a false positive for explicitly dropped guards:
.lock() // https://github.com/rust-lang/rust-clippy/issues/6446
.expect("Could not lock player!!") // A workaround for this is to wrap the `.lock()` call in a block instead of explicitly dropping the guard.
.update(|uc| -> Result<(), Error> { let fetch;
url = uc.navigator.resolve_relative_url(&url).into_owned(); let url = {
let player_lock = player.lock().unwrap();
let url = player_lock.navigator().resolve_relative_url(&url);
fetch = player_lock.navigator().fetch(&url, options);
url
};
Ok(()) let data = fetch.await.map_err(|error| {
})?;
if let Ok(data) = fetch.await {
let mut movie = SwfMovie::from_data(&data, Some(url), None)?;
on_metadata(movie.header());
movie.append_parameters(parameters);
player.lock().unwrap().set_root_movie(Arc::new(movie));
Ok(())
} else {
player player
.lock() .lock()
.unwrap() .unwrap()
.ui() .ui()
.display_root_movie_download_failed_message(); .display_root_movie_download_failed_message();
Err(Error::FetchError(url)) error
} })?;
let mut movie = SwfMovie::from_data(&data, Some(url.into_owned()), None)?;
on_metadata(movie.header());
movie.append_parameters(parameters);
player.lock().unwrap().set_root_movie(Arc::new(movie));
Ok(())
}) })
} }

View File

@ -353,16 +353,14 @@ impl Player {
on_metadata: Box<dyn FnOnce(&swf::HeaderExt)>, on_metadata: Box<dyn FnOnce(&swf::HeaderExt)>,
) { ) {
self.mutate_with_update_context(|context| { self.mutate_with_update_context(|context| {
let fetch = context.navigator.fetch(movie_url, RequestOptions::get()); let future = context.load_manager.load_root_movie(
let process = context.load_manager.load_root_movie(
context.player.clone().unwrap(), context.player.clone().unwrap(),
fetch, movie_url,
movie_url.to_string(), RequestOptions::get(),
parameters, parameters,
on_metadata, on_metadata,
); );
context.navigator.spawn_future(future);
context.navigator.spawn_future(process);
}); });
} }
@ -1413,6 +1411,10 @@ impl Player {
&mut self.audio &mut self.audio
} }
pub fn navigator(&self) -> &Navigator {
&self.navigator
}
// The frame rate of the current movie in FPS. // The frame rate of the current movie in FPS.
pub fn frame_rate(&self) -> f64 { pub fn frame_rate(&self) -> f64 {
self.frame_rate self.frame_rate