diff --git a/core/src/avm1/test_utils.rs b/core/src/avm1/test_utils.rs index 40af1b4aa0f3..17ba776702e8 100644 --- a/core/src/avm1/test_utils.rs +++ b/core/src/avm1/test_utils.rs @@ -9,7 +9,7 @@ pub fn with_avm(swf_version: u8, test: F) where F: for<'a, 'gc> FnOnce(&mut Activation<'_, 'gc>, Object<'gc>) -> Result<(), Error<'gc>>, { - let movie = crate::tag_utils::SwfMovie::empty(swf_version); + let movie = crate::tag_utils::SwfMovie::empty(swf_version, None); let player = crate::player::PlayerBuilder::new() .with_movie(movie) .build(); diff --git a/core/src/avm2/globals/flash/display/loader.rs b/core/src/avm2/globals/flash/display/loader.rs index 70d9f27f9398..e99864d68204 100644 --- a/core/src/avm2/globals/flash/display/loader.rs +++ b/core/src/avm2/globals/flash/display/loader.rs @@ -40,9 +40,10 @@ pub fn loader_allocator<'gc>( // Some LoaderInfo properties (such as 'bytesLoaded' and 'bytesTotal') are always // accessible, even before the 'init' event has fired. Using an empty movie gives // us the correct value (0) for them. + let movie = &activation.context.swf; let loader_info = LoaderInfoObject::not_yet_loaded( activation, - Arc::new(SwfMovie::empty(activation.context.swf.version())), + Arc::new(SwfMovie::empty(movie.version(), Some(movie.url().into()))), Some(loader), None, false, @@ -87,15 +88,16 @@ pub fn load<'gc>( loader_info.unload(activation); // This is a dummy MovieClip, which will get overwritten in `Loader` + let movie = &activation.context.swf; let content = MovieClip::new( - Arc::new(SwfMovie::empty(activation.context.swf.version())), + Arc::new(SwfMovie::empty(movie.version(), Some(movie.url().into()))), activation.gc(), ); // Update the LoaderStream - we still have a fake SwfMovie, but we now have the real target clip. loader_info.set_loader_stream( LoaderStream::NotYetLoaded( - Arc::new(SwfMovie::empty(activation.context.swf.version())), + Arc::new(SwfMovie::empty(movie.version(), Some(movie.url().into()))), Some(content.into()), false, ), @@ -257,8 +259,9 @@ pub fn load_bytes<'gc>( loader_info.unload(activation); // This is a dummy MovieClip, which will get overwritten in `Loader` + let movie = &activation.context.swf; let content = MovieClip::new( - Arc::new(SwfMovie::empty(activation.context.swf.version())), + Arc::new(SwfMovie::empty(movie.version(), Some(movie.url().into()))), activation.gc(), ); diff --git a/core/src/avm2/object/loaderinfo_object.rs b/core/src/avm2/object/loaderinfo_object.rs index da592c0337a4..b140ff139eab 100644 --- a/core/src/avm2/object/loaderinfo_object.rs +++ b/core/src/avm2/object/loaderinfo_object.rs @@ -350,7 +350,8 @@ impl<'gc> LoaderInfoObject<'gc> { pub fn unload(&self, activation: &mut Activation<'_, 'gc>) { // Reset properties - let empty_swf = Arc::new(SwfMovie::empty(activation.context.swf.version())); + let movie = &activation.context.swf; + let empty_swf = Arc::new(SwfMovie::empty(movie.version(), Some(movie.url().into()))); let loader_stream = LoaderStream::NotYetLoaded(empty_swf, None, false); self.set_loader_stream(loader_stream, activation.gc()); self.set_errored(false); diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 39a17bcb8fe0..b28fae9d5e9c 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -338,7 +338,7 @@ impl<'gc> MovieClip<'gc> { loader_info: Option>, ) { let mut mc = self.0.write(context.gc()); - let movie = movie.unwrap_or_else(|| Arc::new(SwfMovie::empty(mc.movie().version()))); + let movie = movie.unwrap_or_else(|| Arc::new(SwfMovie::empty(mc.movie().version(), None))); let total_frames = movie.num_frames(); assert_eq!( mc.shared.loader_info, None, @@ -2142,7 +2142,7 @@ impl<'gc> MovieClip<'gc> { let parent_movie = parent_mc.movie(); let parent_version = parent_movie.version(); let parent_url = parent_movie.url(); - let mut unloaded_movie = SwfMovie::empty(parent_version); + let mut unloaded_movie = SwfMovie::empty(parent_version, None); unloaded_movie.set_url(parent_url.to_string()); Some(Arc::new(unloaded_movie)) diff --git a/core/src/loader.rs b/core/src/loader.rs index cc971a8ffa1e..f3050afc7960 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -2078,6 +2078,7 @@ impl<'gc> Loader<'gc> { loader_info.set_content_type(sniffed_type); let fake_movie = Arc::new(SwfMovie::fake_with_compressed_len( activation.context.swf.version(), + loader_url.clone(), data.len(), )); @@ -2215,6 +2216,7 @@ impl<'gc> Loader<'gc> { if let MovieLoaderVMData::Avm2 { loader_info, .. } = vm_data { let fake_movie = Arc::new(SwfMovie::fake_with_compressed_len( activation.context.swf.version(), + loader_url.clone(), data.len(), )); @@ -2229,6 +2231,7 @@ impl<'gc> Loader<'gc> { if let MovieLoaderVMData::Avm2 { loader_info, .. } = vm_data { let fake_movie = Arc::new(SwfMovie::fake_with_compressed_data( activation.context.swf.version(), + loader_url, data.to_vec(), )); @@ -2290,6 +2293,7 @@ impl<'gc> Loader<'gc> { MovieLoaderVMData::Avm2 { loader_info, .. } => { let fake_movie = Arc::new(SwfMovie::fake_with_compressed_len( activation.context.swf.version(), + loader_url, data.len(), )); @@ -2628,7 +2632,7 @@ impl<'gc> Loader<'gc> { let current_movie = mc.movie(); let current_version = current_movie.version(); let current_url = current_movie.url(); - let mut initial_loading_movie = SwfMovie::empty(current_version); + let mut initial_loading_movie = SwfMovie::empty(current_version, None); initial_loading_movie.set_url(current_url.to_string()); mc.replace_with_movie(uc, Some(Arc::new(initial_loading_movie)), true, None); diff --git a/core/src/player.rs b/core/src/player.rs index f07cbe5712da..d4f36616f365 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -2860,7 +2860,7 @@ impl PlayerBuilder { let language = ui.language(); // Instantiate the player. - let fake_movie = Arc::new(SwfMovie::empty(player_version)); + let fake_movie = Arc::new(SwfMovie::empty(player_version, None)); let frame_rate = self.frame_rate.unwrap_or(12.0); let forced_frame_rate = self.frame_rate.is_some(); let player = Arc::new_cyclic(|self_ref| { diff --git a/core/src/tag_utils.rs b/core/src/tag_utils.rs index ddd43a660a66..36a86542825d 100644 --- a/core/src/tag_utils.rs +++ b/core/src/tag_utils.rs @@ -83,7 +83,7 @@ pub struct SwfMovie { impl SwfMovie { /// Construct an empty movie. - pub fn empty(swf_version: u8) -> Self { + pub fn empty(swf_version: u8, loader_url: Option) -> Self { let url = "file:///".to_string(); let header = HeaderExt::default_with_swf_version(swf_version); @@ -93,7 +93,7 @@ impl SwfMovie { header, data: vec![], url, - loader_url: None, + loader_url, parameters: Vec::new(), encoding: swf::UTF_8, compressed_len: 0, @@ -106,7 +106,11 @@ impl SwfMovie { /// This is used by `Loader` when firing an initial `progress` event: /// `LoaderInfo.bytesTotal` is set to the actual value, but no data is available, /// and `LoaderInfo.parameters` is empty. - pub fn fake_with_compressed_len(swf_version: u8, compressed_len: usize) -> Self { + pub fn fake_with_compressed_len( + swf_version: u8, + loader_url: Option, + compressed_len: usize, + ) -> Self { let url = "file:///".to_string(); let header = HeaderExt::default_with_swf_version(swf_version); @@ -117,7 +121,7 @@ impl SwfMovie { compressed_len, data: Vec::new(), url, - loader_url: None, + loader_url, parameters: Vec::new(), encoding: swf::UTF_8, is_movie: false, @@ -127,7 +131,11 @@ impl SwfMovie { /// Like `fake_with_compressed_len`, but uses actual data. /// This is used when loading a Bitmap to expose the underlying content - pub fn fake_with_compressed_data(swf_version: u8, compressed_data: Vec) -> Self { + pub fn fake_with_compressed_data( + swf_version: u8, + loader_url: Option, + compressed_data: Vec, + ) -> Self { let url = "file:///".to_string(); let header = HeaderExt::default_with_swf_version(swf_version); @@ -138,7 +146,7 @@ impl SwfMovie { compressed_len: compressed_data.len(), data: compressed_data, url, - loader_url: None, + loader_url, parameters: Vec::new(), encoding: swf::UTF_8, is_movie: false, diff --git a/tests/tests/swfs/avm2/loaderinfo_loadurl/Test.as b/tests/tests/swfs/avm2/loaderinfo_loadurl/Test.as new file mode 100644 index 000000000000..87a8bbf8a013 --- /dev/null +++ b/tests/tests/swfs/avm2/loaderinfo_loadurl/Test.as @@ -0,0 +1,40 @@ +package { + import flash.display.Sprite; + import flash.display.Loader; + import flash.net.URLRequest; + import flash.utils.ByteArray; + import flash.events.UncaughtErrorEvent; + + public class Test extends Sprite { + function Test() { + trace("new Loader()"); + var loader = new Loader(); + var loaderInfo = loader.contentLoaderInfo; + trace("loaderInfo.url = " + loaderInfo.url); + trace("loaderInfo.loaderURL = " + loaderInfo.loaderURL); + + trace("Loader.load()"); + var loader = new Loader(); + loader.load(new URLRequest("/foo.swf")); + var loaderInfo = loader.contentLoaderInfo; + trace("loaderInfo.url = " + loaderInfo.url); + trace("loaderInfo.loaderURL = " + loaderInfo.loaderURL); + + trace("Loader.unload()"); + loader.unload(); + loaderInfo = loader.contentLoaderInfo + trace("loaderInfo.url = " + loaderInfo.url); + trace("loaderInfo.loaderURL = " + loaderInfo.loaderURL); + + trace("Loader.loadBytes()"); + var loader = new Loader(); + var bytes = new ByteArray(); + bytes.length = 1; + loader.loadBytes(bytes); + var loaderInfo = loader.contentLoaderInfo; + trace("loaderInfo.url = " + loaderInfo.url); + trace("loaderInfo.loaderURL = " + loaderInfo.loaderURL); + } + } +} + diff --git a/tests/tests/swfs/avm2/loaderinfo_loadurl/output.txt b/tests/tests/swfs/avm2/loaderinfo_loadurl/output.txt new file mode 100644 index 000000000000..82c652b0f689 --- /dev/null +++ b/tests/tests/swfs/avm2/loaderinfo_loadurl/output.txt @@ -0,0 +1,12 @@ +new Loader() +loaderInfo.url = null +loaderInfo.loaderURL = file:////test.swf +Loader.load() +loaderInfo.url = null +loaderInfo.loaderURL = file:////test.swf +Loader.unload() +loaderInfo.url = null +loaderInfo.loaderURL = file:////test.swf +Loader.loadBytes() +loaderInfo.url = null +loaderInfo.loaderURL = file:////test.swf diff --git a/tests/tests/swfs/avm2/loaderinfo_loadurl/test.swf b/tests/tests/swfs/avm2/loaderinfo_loadurl/test.swf new file mode 100644 index 000000000000..740f7e572cdb Binary files /dev/null and b/tests/tests/swfs/avm2/loaderinfo_loadurl/test.swf differ diff --git a/tests/tests/swfs/avm2/loaderinfo_loadurl/test.toml b/tests/tests/swfs/avm2/loaderinfo_loadurl/test.toml new file mode 100644 index 000000000000..67f15e8639d2 --- /dev/null +++ b/tests/tests/swfs/avm2/loaderinfo_loadurl/test.toml @@ -0,0 +1 @@ +num_ticks = 1 \ No newline at end of file