Commit Graph

6162 Commits

Author SHA1 Message Date
Mike Welsh 3e9f9741ea tests: Edit funky_function_calls to test undefined this
Test `this` instead of `this == other_this` to verify when it is
indeed an unboxed undefined.
2022-01-24 02:04:57 -08:00
Mike Welsh 354d7f0ce6 avm1: Remove unused `this` from `Scope::resolve` and `set` 2022-01-24 02:04:57 -08:00
Mike Welsh c35edaae82 avm1: Allow `this` to be `undefined`
Change `Activation::this` to be `Value` instead of `Object`.
2022-01-24 02:04:57 -08:00
Mike Welsh d9bedffb9f tests: Add tests for Object-to-String coercion 2022-01-23 17:19:09 -08:00
Mike Welsh 9ccb3ac3e7 avm1: Fix coercion in string-object concatenation
Previously we called `toString` when concatenating a string to an
Object. However, Flash actually has more complex behavior, usually
calling both `valueOf` and `toString`. This is loosely based on
ToPrimitive/DefaultValue with no type hint in the ECMAScript spec.

 * Call `valueOf`.
  * If the result isn't a primitive, call `toString`.
  * If the result still isn't primitive, return `"[type Object]"`.
 * For Date objects in SWFv6 and higher, call `toString`.
  * If the result isn't a primitive, call `toString` (AVM1 bug?)
  * If it still isn't primitive, return `"[type Object]"`.
2022-01-23 17:19:09 -08:00
Mike Welsh bfe0ee2563 wgpu: Fix gradient shader on vulkan backend
A regression in naga caused a mistranslation of the gradient shader
on the vulkan backend. This caused radial gradients to be rendered
as linear gradients on the vulkan backend. dx12 seems unaffected.

This seems to be cased by a switch statement starting with a default
case Re-order the case statements to avoid this. Looks like it's been
fixed in naga master.
2022-01-22 20:54:18 -08:00
David Wendt 48f8515c03 core: `mouseEnabled` controls whether or not display objects are mouse-pickable 2022-01-22 19:58:32 -08:00
David Wendt 35cbed01fa docs: Better document the `ClipEvent` dispatch patterns. 2022-01-22 19:58:32 -08:00
David Wendt e5d9379740 core: Implement `mouseMove` event 2022-01-22 19:58:32 -08:00
David Wendt 6271d069d7 core: `Stage` should not include it's own transform in it's local/global matrix. 2022-01-22 19:58:32 -08:00
David Wendt c42984a990 avm2: Implement `MouseEvent.toString`.
This also rearranges some things about how we construct events, because `MouseEvent` has different defaults from `Event`. When we finally support parameter metadata on methods we should remove that code.

We also remove the `value_of` code on `EventObject` as that was a mistake. Events don't do anything special in there and I misinterpreted the test results the first time around.
2022-01-22 19:58:32 -08:00
David Wendt 880211c238 core: Implement the `doubleClick` event on objects that request it. 2022-01-22 19:58:32 -08:00
David Wendt eeea5ffea6 core: Issue `MouseWheel` events for AVM2. 2022-01-22 19:58:32 -08:00
David Wendt 87a9a543ba chore: Fix clippy lint on nightly 2022-01-22 19:58:32 -08:00
David Wendt 84d1d5aa76 core: Issue `mouseOver`, `mouseOut`, etc when dragging. 2022-01-22 19:58:32 -08:00
David Wendt 42b606d058 core: Issue `rollOver`, `rollOut`, `mouseOut`, and `mouseOver` events to AVM2. 2022-01-22 19:58:32 -08:00
David Wendt 353a5a78d6 core: Move `mouse_pick` and `mouse_cursor` to `InteractiveObject` as no non-interactive object implements them.
This also cascades into other places, ultimately resulting in more things being marked as `InteractiveObject`.
2022-01-22 19:58:32 -08:00
David Wendt d0ef15503c avm2: Store the last-hovered or currently-hovered object on the event that notifies the clip that the hover state has changed. 2022-01-22 19:58:32 -08:00
David Wendt f69206aaa2 core: Fire AVM2's `mouseUp` event on the correct object.
This requires adding another notion of mouse-release events to `ClipEvent`. We now have four:

 * `MouseUp` - the mouse was released, any object on the render list can handle this event ("anycast" event)
 * `MouseUpInside` - the mouse was released inside this display object, only the mouse-picked target of the event can handle it
 * `Release` - the mouse was released inside the last clicked display object
 * `ReleaseOutside` - the mouse was released outside the last clicked display object

For those keeping score at home, in AVM2, the valid progression of events is either...

 * On the same object, `mouseDown`, `mouseUp`, and `click`
 * On one object, `mouseDown`, then some mouse movement that takes the cursor out of the first object, then on another object `mouseUp`, and then finally the first object gets `releaseOutside`.
2022-01-22 19:58:32 -08:00
David Wendt 35f020f482 avm2: Allow `Stage` to receive button presses 2022-01-22 19:58:32 -08:00
David Wendt 9d4b222b29 core: AVM2 wants the same semantics as `Press`/`Release`, not `MouseDown`/`MouseUp`.
`MouseDown`/`MouseUp` are effectively broadcasts; they hit every movie clip that can accept them until one of them has a handler for it. AVM2 instead wants events that only apply to specific mouse-picked display objects, which means we need to use the Player-tracked events `Press`, `Release`, and `ReleaseOutside`. The only problem is that we also need to emit a `mouseUp` event on both `Release` and `ReleaseOutside`.
2022-01-22 19:58:32 -08:00
David Wendt f0ab17c979 core: AVM2 `MovieClip`s can accept mouse events without being in button mode.
This technically changes the meaning of `require_button_mode` slightly to something more like "accepts input".
2022-01-22 19:58:32 -08:00
David Wendt f56782c5c7 core: Movie clips do not have a hand cursor unless they are also in button mode. 2022-01-22 19:58:32 -08:00
David Wendt cbeb24f3f8 core: Implement forced button mode flag for AVM2. 2022-01-22 19:58:32 -08:00
David Wendt 7b6f8aef06 avm2: Implement `flash.events.EventPhase`. 2022-01-22 19:58:32 -08:00
David Wendt 6d02248ea5 core: Add a method to fire common `InteractiveObject` events into AVM2. 2022-01-22 19:58:32 -08:00
David Wendt 18b8b227a1 avm2: Add utility method for pulling mouse event data from current context 2022-01-22 19:58:32 -08:00
David Wendt 59d735a034 tests: Add a test for `MouseEvent.stageX`/`stageY` 2022-01-22 19:58:32 -08:00
David Wendt c53130e940 avm2: Automatically select a given event's class based on it's data. 2022-01-22 19:58:32 -08:00
David Wendt ada093938e avm2: Expose `MouseEvent` as a system class. 2022-01-22 19:58:32 -08:00
David Wendt ac0f62d475 avm2: Implement `MouseEvent.stageX`/`stageY` 2022-01-22 19:58:32 -08:00
David Wendt 9ee263160a avm2: Implement `MouseEvent.relatedObject` 2022-01-22 19:58:32 -08:00
David Wendt 477b8fb87f avm2: Implement `MouseEvent.movementX`/`movementY` 2022-01-22 19:58:32 -08:00
David Wendt b612980ace avm2: Impl `MouseEvent.localX`/`localY` 2022-01-22 19:58:32 -08:00
David Wendt 948b591378 avm2: Stub `MouseEvent.isRelatedObjectInaccessible` 2022-01-22 19:58:32 -08:00
David Wendt a3c48c5e29 avm2: Implement `MouseEvent.delta` 2022-01-22 19:58:32 -08:00
David Wendt 22638f4aae avm2: Impl `MouseEvent.buttonDown` 2022-01-22 19:58:32 -08:00
David Wendt d790b138b0 avm2: Implement accessor methods for `altKey`, `commandKey`, `controlKey`/`ctrlKey`, and `shiftKey`. 2022-01-22 19:58:32 -08:00
David Wendt d9bbafb0bb avm2: Make `MouseEvent`'s constructor set event data based on it's parameters. 2022-01-22 19:58:32 -08:00
David Wendt 016cd6ccc0 avm2: Make event construction take an `EventData` parameter.
This also necessitated the introduction of a `FullScreenEvent` data type.
2022-01-22 19:58:32 -08:00
David Wendt 43161976c7 avm2: Add a new field to store mouse event data on dispatched events. 2022-01-22 19:58:32 -08:00
David Wendt 69c66fe720 tests: Add a test of `MouseEvent`'s constructor 2022-01-22 19:58:32 -08:00
Mike Welsh cad76ad4fa ci: Fix publishing of Firefox extension
Supply FIREFOX_EXTENSION_ID var to the web build step to ensure
this gets correctly populated in the manifest.json.
2022-01-22 18:38:18 -08:00
relrelb 164e1a38c0 core: Remove unnecessary parameter from `post_instantiation`
`display_object` was always equivalent to `self`, there's no need to
pass both.
2022-01-22 11:37:33 -08:00
Mike Welsh 95ddc06e71 ci: Use macos-11 runner 2022-01-21 18:21:33 -08:00
Mike Welsh e11e1e870f avm1: Improve Object comparisons in SWFv5
SWFv5 always calls `Object.valueOf` at least once and sometimes
twice in the Equals2 op, even when comparing two Objects.

For example, `Object(1) == Object(1)` is true in SWFv5 but false
in SWFv6.
2022-01-21 16:40:19 -08:00
Mike Welsh bf599d9107 avm1: Clean up Value::abstract_eq
Consolidate several cases and fix some issues:
 * Object-to-primitive comparison always goes through `valueOf`.
 * `Object(undefined) == undefined` is true; this will coerce
   to a bare object with no `valueOf`, resulting in
   `undefined==undefined`.
 * `{valueOf:function() { return NaN; }} == NaN` is true.
2022-01-21 16:40:19 -08:00
Mike Welsh 6bffef2550 ci: Publish Chrome and Firefox extensions nightly 2022-01-21 16:19:49 -08:00
Mike Welsh 4d8db1e64d avm1: Fix function closures inside `with`
When creating a scope for a closure, any `with` scopes were being
filtered out, but this was incorrect; `with` scopes are still on
the scope chain when the function is called.
2022-01-19 20:29:26 -08:00
Mike Welsh 1e28e1da11 chore: Bump to wgpu 0.12 2022-01-19 13:20:27 -08:00