diff --git a/core/src/avm1/globals/movie_clip_loader.rs b/core/src/avm1/globals/movie_clip_loader.rs index c8c494353..3742a82d1 100644 --- a/core/src/avm1/globals/movie_clip_loader.rs +++ b/core/src/avm1/globals/movie_clip_loader.rs @@ -189,6 +189,46 @@ pub fn unload_clip<'gc>( Ok(false.into()) } +pub fn get_progress<'gc>( + _avm: &mut Avm1<'gc>, + context: &mut UpdateContext<'_, 'gc, '_>, + _this: Object<'gc>, + args: &[Value<'gc>], +) -> Result, Error> { + let target = args.get(0).cloned().unwrap_or(Value::Undefined); + + if let Value::Object(target) = target { + if let Some(movieclip) = target + .as_display_object() + .and_then(|dobj| dobj.as_movie_clip()) + { + let ret_obj = ScriptObject::object(context.gc_context, None); + ret_obj.define_value( + context.gc_context, + "bytesLoaded", + movieclip + .movie() + .map(|mv| (mv.data().len() + 21).into()) + .unwrap_or(Value::Undefined), + EnumSet::empty(), + ); + ret_obj.define_value( + context.gc_context, + "bytesTotal", + movieclip + .movie() + .map(|mv| (mv.data().len() + 21).into()) + .unwrap_or(Value::Undefined), + EnumSet::empty(), + ); + + return Ok(ret_obj.into()); + } + } + + Ok(Value::Undefined.into()) +} + pub fn create_proto<'gc>( gc_context: MutationContext<'gc, '_>, proto: Object<'gc>, @@ -231,6 +271,13 @@ pub fn create_proto<'gc>( EnumSet::empty(), Some(fn_proto), ); + mcl_proto.as_script_object().unwrap().force_set_function( + "getProgress", + get_progress, + gc_context, + EnumSet::empty(), + Some(fn_proto), + ); mcl_proto.into() } diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index fa18762fa..c8e7a3141 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -168,6 +168,7 @@ swf_tests! { (unloadmovie_method, "avm1/unloadmovie_method", 11), (mcl_loadclip, "avm1/mcl_loadclip", 11), (mcl_unloadclip, "avm1/mcl_unloadclip", 11), + (mcl_getprogress, "avm1/mcl_getprogress", 6), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/core/tests/swfs/avm1/mcl_getprogress/output.txt b/core/tests/swfs/avm1/mcl_getprogress/output.txt new file mode 100644 index 000000000..dddff57ef --- /dev/null +++ b/core/tests/swfs/avm1/mcl_getprogress/output.txt @@ -0,0 +1,3 @@ +Child movie loaded! +68 +68 diff --git a/core/tests/swfs/avm1/mcl_getprogress/target.fla b/core/tests/swfs/avm1/mcl_getprogress/target.fla new file mode 100644 index 000000000..3ec29ba19 Binary files /dev/null and b/core/tests/swfs/avm1/mcl_getprogress/target.fla differ diff --git a/core/tests/swfs/avm1/mcl_getprogress/target.swf b/core/tests/swfs/avm1/mcl_getprogress/target.swf new file mode 100644 index 000000000..1a1a83455 Binary files /dev/null and b/core/tests/swfs/avm1/mcl_getprogress/target.swf differ diff --git a/core/tests/swfs/avm1/mcl_getprogress/test.fla b/core/tests/swfs/avm1/mcl_getprogress/test.fla new file mode 100644 index 000000000..c2499cee0 Binary files /dev/null and b/core/tests/swfs/avm1/mcl_getprogress/test.fla differ diff --git a/core/tests/swfs/avm1/mcl_getprogress/test.swf b/core/tests/swfs/avm1/mcl_getprogress/test.swf new file mode 100644 index 000000000..8a53aecf9 Binary files /dev/null and b/core/tests/swfs/avm1/mcl_getprogress/test.swf differ