Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion core/src/avm1/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ pub fn with_avm<F>(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();
Expand Down
11 changes: 7 additions & 4 deletions core/src/avm2/globals/flash/display/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
),
Expand Down Expand Up @@ -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(),
);

Expand Down
3 changes: 2 additions & 1 deletion core/src/avm2/object/loaderinfo_object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions core/src/display_object/movie_clip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ impl<'gc> MovieClip<'gc> {
loader_info: Option<LoaderInfoObject<'gc>>,
) {
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,
Expand Down Expand Up @@ -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))
Expand Down
6 changes: 5 additions & 1 deletion core/src/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
));

Expand Down Expand Up @@ -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(),
));

Expand All @@ -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(),
));

Expand Down Expand Up @@ -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(),
));

Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion core/src/player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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| {
Expand Down
20 changes: 14 additions & 6 deletions core/src/tag_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>) -> Self {
let url = "file:///".to_string();
let header = HeaderExt::default_with_swf_version(swf_version);

Expand All @@ -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,
Expand All @@ -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<String>,
compressed_len: usize,
) -> Self {
let url = "file:///".to_string();
let header = HeaderExt::default_with_swf_version(swf_version);

Expand All @@ -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,
Expand All @@ -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<u8>) -> Self {
pub fn fake_with_compressed_data(
swf_version: u8,
loader_url: Option<String>,
compressed_data: Vec<u8>,
) -> Self {
let url = "file:///".to_string();
let header = HeaderExt::default_with_swf_version(swf_version);

Expand All @@ -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,
Expand Down
40 changes: 40 additions & 0 deletions tests/tests/swfs/avm2/loaderinfo_loadurl/Test.as
Original file line number Diff line number Diff line change
@@ -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);
}
}
}

12 changes: 12 additions & 0 deletions tests/tests/swfs/avm2/loaderinfo_loadurl/output.txt
Original file line number Diff line number Diff line change
@@ -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
Binary file added tests/tests/swfs/avm2/loaderinfo_loadurl/test.swf
Binary file not shown.
1 change: 1 addition & 0 deletions tests/tests/swfs/avm2/loaderinfo_loadurl/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
num_ticks = 1