David Wendt
673f85f067
XMLNode type 1 is an element, not a text node.
2020-01-04 19:00:36 -05:00
David Wendt
c76e5ce447
appendChild also refuses to orphan nodes already part of another XML tree.
2020-01-04 19:00:35 -05:00
David Wendt
34cbe2e04b
insertNode rejects child nodes that already have a parent
2020-01-04 19:00:34 -05:00
David Wendt
8c5dcfe662
Swap in newly constructed nodes *before* filling them with content.
...
Fixes a bug where new XML("<node />").childNode[0].parentNode did NOT refer to the overall document object, but to a phantom text node.
This is because the swap operation used to construct an XMLObject's node in-place was happening AFTER parsing, which means that referents already existed to the temporary XMLNode created by XMLObject::new. swap is not to be called after tree structure has been created; it does not update referents to the swapped nodes.
In the future I should examine the implications of explicitly reconstructing already existing nodes, e.g. through XML.apply(some_xml). Right now, the existing node will be swapped with a new one, and two nodes will exist pointing to the same script object, which is a huge problem with our overall design. We should, at the very least, disassociate swapped nodes from their script object, just in case they still have referents.
Ideally, we wouldn't have to swap nodes, but to avoid a swap, I'd have to instead have a second layer of indirection just to hold a rewritable pointer that every XMLObject points to. This isn't really worth it unless I HAVE to do it, so I'm not going to do it.
2020-01-04 19:00:32 -05:00
David Wendt
568d90f4dc
Warn if XML.removeNode fails for whatever reason
2020-01-04 19:00:32 -05:00
David Wendt
19ca11b08c
Impl `toString`
2020-01-04 19:00:31 -05:00
David Wendt
513460e4e0
Implement `insertBefore`
2020-01-04 19:00:31 -05:00
David Wendt
b0dce445b0
Impl `removeNode`
2020-01-04 19:00:29 -05:00
David Wendt
00319f14a8
Implement `namespaceURI`
2020-01-04 19:00:29 -05:00
David Wendt
abb2690367
When constructing new XML nodes or documents, always ensure that the new node we swap in is properly linked to the same script object so that we don't accidentally recreate them.
2020-01-04 19:00:28 -05:00
David Wendt
8939dae90c
Implement `XMLNode.attributes` w/ read tests
2020-01-04 19:00:27 -05:00
David Wendt
6f48f3436f
Expose `previousSibling` and `nextSibling` to ActionScript.
...
This commit also fixes a bug caused by excessive use of copypaste, which was detected by the included test.
2020-01-04 19:00:25 -05:00
David Wendt
223320c98c
Expose `parentNode` to ActionScript
2020-01-04 19:00:24 -05:00
David Wendt
807725d7aa
Expose `firstChild` and `lastChild` to ActionScript w/ tests
2020-01-04 19:00:24 -05:00
David Wendt
48d68bebc4
Implement `hasChildNodes()` and add test
2020-01-04 19:00:23 -05:00
David Wendt
881dcb76ab
`cloneNode` without arguments is morally equivalent to `false`
2020-01-04 19:00:21 -05:00
David Wendt
69a1ab1649
Expose namespace prefix and URI lookups to ActionScript.
...
Also, fix the previous commit's half-assed impl.
2020-01-04 19:00:20 -05:00
David Wendt
55fa6ef09b
Add node cloning support
2020-01-04 19:00:19 -05:00
David Wendt
37f6efb753
Expose `appendChild` to ActionScript
2020-01-04 19:00:19 -05:00
David Wendt
7e45dee8cf
Clippy said so.
2020-01-04 19:00:18 -05:00
David Wendt
cfacd397cf
Most XML properties return `null`, not `undefined`.
...
Furthermore, `prefix` does not distinguish between `<test>` and `<:test>` - they both have a `prefix` of `""`.
2020-01-04 19:00:17 -05:00
David Wendt
e47a1d1e38
Fix newly constructed XML trees not actually containing the XML they just parsed.
2020-01-04 19:00:16 -05:00
David Wendt
bec60acc1e
`XML.prototype` should be an `XMLObject` so that instances of `XML` can hold a node
2020-01-04 19:00:15 -05:00
David Wendt
571c4bbd52
Cargo fmt compliance
2020-01-04 19:00:15 -05:00
David Wendt
0af248d81f
Expose `childNodes` to ActionScript
2020-01-04 19:00:14 -05:00
David Wendt
e7768d0802
Add methods to allow storing XML objects on the accompanying tree nodes, so that expando properties on child nodes will work.
2020-01-04 19:00:13 -05:00
David Wendt
b06dd5d15e
Add a special node to represent the document root in the node tree, and get rid of the explicit document reference type in `XMLObject`.
2020-01-04 19:00:12 -05:00
David Wendt
bd1ea56cc3
Implement `XMLNode` properties that don't require child or attribute iteration.
2020-01-04 19:00:10 -05:00
David Wendt
4f5ac09b73
Expose XML document constructor, including text parsing ability
2020-01-04 19:00:09 -05:00
David Wendt
554f0dc1e5
Add XMLNode class and constructor impl
2020-01-04 19:00:07 -05:00
David Wendt
6a65e984ae
Add a new `XMLObject` variant to the AVM1 object ecosystem.
...
This particular variant is actually a two-in-one deal: `XMLObject`s may either refer to a document or a node.
2020-01-04 18:58:42 -05:00
Mike Welsh
36b3e5b34f
avm1: Implement Color class
2020-01-03 20:31:32 -08:00
Mike Welsh
4bf29f677f
avm1: Implement Sound.duration
...
Add AudioBackend::get_sound_duration.
2020-01-03 17:11:00 -08:00
Mike Welsh
b9d24d9a49
avm1: First pass at implementing Sound.stop
2020-01-03 17:11:00 -08:00
Mike Welsh
63dd92259b
avm1: First pass of Sound object
2020-01-03 17:11:00 -08:00
Nathan Adams
9000451d58
core: Implemented Mouse.show() & Mouse.hide()
2019-12-22 14:33:46 -08:00
Mike Welsh
a4a307cf9a
avm1: Use proper bool conversions for logical ops
...
ActionAnd, ActionOr, and ActionNot were incorrectly comparing
to 0. This only works for SWF<4. Now they all go through the
Value::as_bool method to handle version specific behavior.
Value::from_bool_v1 was also renamed to Value::from_bool.
2019-12-21 23:01:10 -08:00
Nathan Adams
eedc4bbe24
core: Added Input backend, currently unimplemented, for polling user input
2019-12-21 19:08:06 -08:00
Mike Welsh
531e4d640d
avm1: Implement StartDrag/EndDrag
2019-12-21 16:28:41 -08:00
Mike Welsh
d459bbe010
avm1: Functions store their base clip
...
Functions now store their base clip (the code that contains the
executing bytecode). This is because `GotoFrame` and other actions
will execute on the clip the bytecode exists on, not on `this`.
(Note that `this.gotoAndStop` uses `GetMember` actions, which
worked correctly).
`Activation` now stores `target_clip`, and `Avm1::target_clip` and
`target_clip_or_root` grab this from the current stack frame.
Renamed `start_clip` to `base_clip` to match Flash conventions.
Removed `active_clip` as this was superfluous. Now you can use
`Avm1::target_clip_or_root`.
`UpdateContext` no longer contains `target_clip` etc.
2019-12-19 17:30:50 -08:00
Mike Welsh
540b03090a
avm1: hitTest point is actually in root coordinates ( fix #185 )
2019-12-19 12:35:56 -08:00
Nathan Adams
f6f358b4de
avm1: Expose TextFields and allow setting their .text
2019-12-19 10:19:43 -08:00
Mike Welsh
c9a5d2dbb3
chore: Fix clippy lints in 1.40
2019-12-19 09:10:41 -08:00
Nathan Adams
d3848f97ea
avm1: Implemented MovieClip.hittest, without shape flag
2019-12-18 15:21:14 -08:00
Nathan Adams
5f6eea6f25
chore: Refactor system listeners into a reusable system
2019-12-18 15:15:56 -08:00
Mike Welsh
3a8256a993
avm1: Allow setting _name
2019-12-18 14:07:32 -08:00
Mike Welsh
3e003ed9dd
avm1: Add missing stage.rs
2019-12-17 22:36:53 -08:00
Mike Welsh
3ebc1ed928
avm1: Stub out Stage properties
...
This is a very rough stub out of Stage.width and height to get
basic V-cams to start functioning.
TODO: Implement the different stage scaling modes. We will probably
want to add a "Stage" display object to handle this.
2019-12-17 22:28:44 -08:00
Mike Welsh
74aa127b74
avm1: Fix double borrow in Executable::exec
2019-12-17 21:35:22 -08:00
Mike Welsh
dae3e27fb3
avm1: Rename Library::instantiate_by_id
2019-12-17 03:27:05 -08:00
Mike Welsh
1476930e0c
avm1: Implement MovieClip.removeMovieClip
2019-12-17 03:20:01 -08:00
Mike Welsh
1668e823e6
avm1: Implement MovieClip.createEmptyMovieClip
2019-12-17 03:02:07 -08:00
Mike Welsh
d33a8278d7
avm1: Implement MovieClip.duplicateMovieClip
2019-12-17 03:00:56 -08:00
Mike Welsh
009da39f12
avm1: Implement MovieClip.attachMovie
2019-12-17 03:00:56 -08:00
Nathan Adams
45e497826b
avm1: Implement `Mouse` listeners & events (excluding scroll)
2019-12-16 19:22:10 -08:00
Mike Welsh
c2f4633cdb
avm1: Trace constant_pool in Collect for Activation
2019-12-16 16:14:49 -08:00
Mike Welsh
f4f755e958
avm1: Remove warnings on _currentframe/_totalframe
2019-12-16 10:21:37 -08:00
Nathan Adams
c8e42123cf
avm1: Implemented `_xmouse` and `_ymouse`
2019-12-16 10:11:23 -08:00
Nathan Adams
783037e8cc
chore: Removed array debug code that snuck in. Oops!
2019-12-16 09:56:46 -08:00
Mike Welsh
bf0b777246
avm1: Use ECMA-262 ToInt32 modulo behavior
...
Everything is a double in ES land, so when converting a number to
int, the double is modulo'd to allow for wrapping 32-bit int
semantics.
See ToInt32 and ToUInt32 in the specs:
https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%202nd%20edition,%20August%201998.pdf
2019-12-16 00:52:27 -08:00
Mike Welsh
39f54b4a16
avm1: Add gotoAndPlay and gotoAndStop MovieClip methods
2019-12-16 00:52:27 -08:00
Mike Welsh
fa5a168fad
avm1: Clean up MovieClip prototype
2019-12-16 00:52:27 -08:00
Mike Welsh
46365c5702
avm1: Implement clip event method callbacks
2019-12-15 20:01:50 -08:00
Mike Welsh
174426856f
avm1: Use `EnumSet::from_bits` in `object::as_set_prop_func`
2019-12-15 14:26:43 -08:00
David Wendt
d9aac0f2cf
Adjust `SuperObject` based on actual Flash behavior.
2019-12-15 13:32:04 -08:00
David Wendt
edf7a19eb7
Implement `Function.prototype.toString`.
2019-12-15 13:32:04 -08:00
David Wendt
33c66571f5
Allow `is_instance_of` to inspect the prototype chains of implemented interfaces.
...
This makes the `extends_chain` test pass.
2019-12-15 13:32:04 -08:00
David Wendt
854526923e
Calls to `super` inherently bind to itself.
...
This requires some subclassing nonsense to be able to smuggle a self-reference into `SuperObject`s. When successfully smuggled, all calls to `call` will be invoked with the `super` object as `this`. This allows constructor chaining to work.
Note that not all `Object` trait methods are implemented on `SuperObject`, so things like `delete this.x` in super constructors will randomly fail. This should be fixed.
2019-12-15 13:32:04 -08:00
David Wendt
eb06501492
Since `get_local` doesn't scale the prototype chain anymore, we don't need to change the prototype chain traversal anymore.
2019-12-15 13:32:04 -08:00
David Wendt
5c1ac19c1b
Implement `super`, mostly.
...
We implement `super` by way of a new `Object` impl which wraps arbitrary objects with a modified prototype chain. Specifically, the lowest layer of the prototype chain is omitted. This new `SuperObject` script is composable: a chain of two `SuperObject`s will go two levels of inheritance upwards while still maintaining non-prototype property access.
2019-12-15 13:32:04 -08:00
David Wendt
681b4adfa4
Functions close over the constant pool they were defined with.
2019-12-15 13:17:41 -08:00
David Wendt
71d9655f6d
Implement `ASSetPropFlags`
2019-12-15 13:17:41 -08:00
David Wendt
213b3cfca1
Store implemented interfaces on the prototype, not the constructor, so that InstanceOf can get at them.
2019-12-15 13:17:41 -08:00
David Wendt
fcb37bd273
Implement `ActionCastOp`.
2019-12-15 13:17:41 -08:00
David Wendt
ee4b47d062
Add interface support, and add interface checking to `ActionInstanceOf`.
2019-12-15 13:17:41 -08:00
Mike Welsh
81e5c7ba1d
core: Rename get_length etc. -> length
2019-12-15 12:33:24 -08:00
Mike Welsh
bc42004db5
core: Implement From for Object variants to Value/ReturnValue
2019-12-15 12:33:24 -08:00
Nathan Adams
aca746eee7
core: Implemented Array.splice with tests
2019-12-15 12:33:24 -08:00
Nathan Adams
31b84c5f19
core: Made arrays a storage property of objects, not a unique object type. Added more corner case tests.
2019-12-15 12:33:24 -08:00
Nathan Adams
32a1eda080
core: Implement Arrays & array prototype
2019-12-15 12:33:24 -08:00
Mike Welsh
8c27097240
core: Implement _target property
...
Add DisplayObject::slash_path to get the Flash 4-style slash path
to the clip. This fixes the tellTarget regression test and removes
the superfluous `target_path` from `UpdateContext`.
2019-12-15 10:17:33 -08:00
Mike Welsh
d5f7521061
core: Ignore NaN in StageObject setters
2019-12-15 10:17:33 -08:00
Mike Welsh
c9864eb557
core: Add StageObject properties
2019-12-15 10:17:33 -08:00
Mike Welsh
f2422a2c9f
avm1: Add attributes for _global/_root/_parent
2019-12-15 08:54:26 -08:00
Mike Welsh
c29b042f5e
avm1: Get child clip instances in StageObject
...
Add the logic to get children display objects as properties in
`StageObject`.
2019-12-15 08:54:26 -08:00
Mike Welsh
783ede6f79
core: Add DisplayObject::path
2019-12-15 08:54:26 -08:00
David Wendt
724f845037
Remove the `DisplayNode` slot from `ScriptObject`, since all display node objects should be `StageObject`s now.
2019-12-15 08:54:26 -08:00
David Wendt
fa9329df68
Instantiate all MovieClips as StageObjects.
2019-12-15 08:54:26 -08:00
David Wendt
3df6c7eeef
Always post-instantiate display objects when running tests.
2019-12-15 08:54:26 -08:00
David Wendt
73655c0c88
Add a separate native object type for objects tied to the stage.
2019-12-15 08:54:26 -08:00
Mike Welsh
f0c6b2d8d8
core: Remove this from Object::get/set
2019-12-15 08:54:26 -08:00
Mike Welsh
b59bf40c78
core: Remove this from Object::get/set
2019-12-10 01:36:02 -08:00
Mike Welsh
f7822141b7
core: Rename display_node methods to display_object
2019-12-10 01:36:02 -08:00
Mike Welsh
71e4eb87d7
core: Remove as_*_mut methods on DisplayObject/Object
2019-12-10 01:36:02 -08:00
Mike Welsh
12c1bf7cf1
core: Clean up UpdateContext creation
...
Added Player::mutate_with_update_context, which takes a closure
and passes it an UpdateContext.
2019-12-10 01:36:01 -08:00
Mike Welsh
30ecbd0ecc
core: Use enum_trait_object for DisplayObject
2019-12-10 01:36:01 -08:00
Mike Welsh
23ca66a7e3
avm1: Use enum_trait_object for avm1::Object
2019-12-10 01:36:01 -08:00
Mike Welsh
90b6858bb2
avm1: Fix return value of `Object.addProperty`
2019-12-03 14:59:37 -08:00
Nathan Adams
eb185982cd
Add more Number(x) tests, and corrected primitive_as_number to match
2019-11-29 16:07:35 -08:00
Nathan Adams
85b9ffe102
core: Merge both test macros into a generic test_method
2019-11-29 13:12:00 -08:00