diff --git a/core/src/loader.rs b/core/src/loader.rs index dc8088b82..d748c3d56 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -3,7 +3,7 @@ use crate::avm1::activation::{Activation, ActivationIdentifier}; use crate::avm1::{Avm1, Object, TObject, Value}; 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::display_object::{DisplayObject, MorphShape, TDisplayObject}; use crate::player::{Player, NEWEST_PLAYER_VERSION}; @@ -106,16 +106,15 @@ impl<'gc> LoadManager<'gc> { pub fn load_root_movie( &mut self, player: Weak>, - fetch: OwnedFuture, Error>, - url: String, + url: &str, + options: RequestOptions, parameters: Vec<(String, String)>, on_metadata: Box, ) -> OwnedFuture<(), Error> { let loader = Loader::RootMovie { self_handle: None }; let handle = self.add_loader(loader); let loader = self.get_loader_mut(handle).unwrap(); - - loader.root_movie_loader(player, fetch, url, parameters, on_metadata) + loader.root_movie_loader(player, url.to_owned(), options, parameters, on_metadata) } /// Kick off a movie clip load. @@ -274,11 +273,11 @@ pub enum Loader<'gc> { impl<'gc> Loader<'gc> { /// Construct a future for the root movie loader. - pub fn root_movie_loader( + fn root_movie_loader( &mut self, player: Weak>, - fetch: OwnedFuture, Error>, - mut url: String, + url: String, + options: RequestOptions, parameters: Vec<(String, String)>, on_metadata: Box, ) -> OwnedFuture<(), Error> { @@ -294,29 +293,31 @@ impl<'gc> Loader<'gc> { .expect("Could not upgrade weak reference to player"); Box::pin(async move { - player - .lock() - .expect("Could not lock player!!") - .update(|uc| -> Result<(), Error> { - url = uc.navigator.resolve_relative_url(&url).into_owned(); + // clippy reports a false positive for explicitly dropped guards: + // https://github.com/rust-lang/rust-clippy/issues/6446 + // A workaround for this is to wrap the `.lock()` call in a block instead of explicitly dropping the guard. + let fetch; + 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(()) - })?; - - 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 { + let data = fetch.await.map_err(|error| { player .lock() .unwrap() .ui() .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(()) }) } diff --git a/core/src/player.rs b/core/src/player.rs index 50b471db6..7992b2379 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -353,16 +353,14 @@ impl Player { on_metadata: Box, ) { self.mutate_with_update_context(|context| { - let fetch = context.navigator.fetch(movie_url, RequestOptions::get()); - let process = context.load_manager.load_root_movie( + let future = context.load_manager.load_root_movie( context.player.clone().unwrap(), - fetch, - movie_url.to_string(), + movie_url, + RequestOptions::get(), parameters, on_metadata, ); - - context.navigator.spawn_future(process); + context.navigator.spawn_future(future); }); } @@ -1413,6 +1411,10 @@ impl Player { &mut self.audio } + pub fn navigator(&self) -> &Navigator { + &self.navigator + } + // The frame rate of the current movie in FPS. pub fn frame_rate(&self) -> f64 { self.frame_rate