avm2: Correctly apply 'skip_next_enter_frame' to Loader

We were missing the initial 'set_skip_next_enter_frame(true)'
call, and we weren't properly clearing it in `enter_frame`.
Loaders appear to have the same behavior as MovieClips.

This makes us correctly run the first framescript for the loaded
SWF.
This commit is contained in:
Aaron Hill 2023-03-17 09:23:49 -05:00
parent 33f585fa6c
commit ba88b52167
9 changed files with 18 additions and 6 deletions

View File

@ -117,6 +117,8 @@ impl<'gc> TDisplayObject<'gc> for LoaderDisplay<'gc> {
} }
child.enter_frame(context); child.enter_frame(context);
} }
self.base_mut(context.gc_context)
.set_skip_next_enter_frame(false);
} }
fn construct_frame(&self, context: &mut UpdateContext<'_, 'gc>) { fn construct_frame(&self, context: &mut UpdateContext<'_, 'gc>) {

View File

@ -640,6 +640,12 @@ impl<'gc> Loader<'gc> {
// 'this.parent == null' and 'this.stage == null' // 'this.parent == null' and 'this.stage == null'
mc.post_instantiation(context, None, Instantiator::Movie, false); mc.post_instantiation(context, None, Instantiator::Movie, false);
catchup_display_object_to_frame(context, mc.into()); catchup_display_object_to_frame(context, mc.into());
// Movie clips created from ActionScript (including from a Loader) skip the next enterFrame,
// and consequently are observed to have their currentFrame lag one
// frame behind objects placed by the timeline (even if they were
// both placed in the same frame to begin with).
mc.base_mut(context.gc_context)
.set_skip_next_enter_frame(true);
if let Some(MovieLoaderEventHandler::Avm2LoaderInfo(loader_info)) = event_handler { if let Some(MovieLoaderEventHandler::Avm2LoaderInfo(loader_info)) = event_handler {
let mut activation = Avm2Activation::from_nothing(context.reborrow()); let mut activation = Avm2Activation::from_nothing(context.reborrow());

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -4,10 +4,14 @@ loader.contentLoaderInfo.bytesLoaded = 0
loader.contentLoaderInfo.bytesTotal = 0 loader.contentLoaderInfo.bytesTotal = 0
loader.contentLoaderInfo.bytes = null loader.contentLoaderInfo.bytes = null
loader.contentLoaderInfo.url = null loader.contentLoaderInfo.url = null
Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=674]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = null Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=738]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = null
Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=674 bytesTotal=674]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 674, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = null Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=738 bytesTotal=738]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 738, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = null
Framescript frame 1
Hello from loaded SWF! Hello from loaded SWF!
loader.contentLoaderInfo === loader.content.loaderInfo : true loader.contentLoaderInfo === loader.content.loaderInfo : true
loader.contentLoaderInfo.content === loader.content : true loader.contentLoaderInfo.content === loader.content : true
Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 674, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = file:/// Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 738, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = file:///
Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 674, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = file:/// Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 738, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = file:///
Framescript frame 2
Framescript frame 1
Hello from loaded SWF!

Binary file not shown.

View File

@ -1,4 +1,4 @@
num_frames = 3 num_frames = 4
[image_comparison] [image_comparison]
tolerance = 0 tolerance = 0