Commit Graph

1171 Commits

Author SHA1 Message Date
Adrian Wielgosik ef64413b8c avm2: Support ContextMenuItem fields 2022-03-30 21:42:48 +02:00
Adrian Wielgosik ea56902d80 chore: cargo fmt 2022-03-30 21:42:48 +02:00
Adrian Wielgosik 90b1d4722c avm2: Add ContextMenuItem stub 2022-03-30 21:42:48 +02:00
Adrian Wielgosik 2389422c99 avm2: Add ioErrorEvent stub 2022-03-30 21:42:48 +02:00
Adrian Wielgosik 388dc6fe31 avm2: Add customItems to ContextMenu stub 2022-03-30 21:42:48 +02:00
relrelb 984342abf3 swf: Avoid some `Vec::resize` usages
Use the `vec![]` macro instead.
2022-03-26 11:33:26 -07:00
Aaron Hill a281db3af6 Add `define_indirect_properties` helper macro for property/slot pairs
In both `FrameLabel` and `Scene`, we define multiple
'public property / private slot' pairs.
The public property has a getter which delegates to the private
property. There is no setter for the property, ensuring that
the private slot can only be modified from within Ruffle itself.

This PR adds a macro `define_indirect_properties` to abstract over
this pattern. Currently, it only supports the read-only property
pattern - however, it could be extended in the future to generate
a setter that invokes a caller-provided callback function.

This needs to be a macro (rather than a method) so that we can
generate a function with the property name hard-coded into it.
Using a closure that references an upvar will not work, since
`Method::from_builtin` requires a function pointer.
2022-03-21 19:00:25 -07:00
relrelb 8a17d88c77 core: Remove `NavigatorBackend::time_since_launch`
`core` already depends on the `instant` crate which abstracts
`std::instant::Instant` and polyfills it on Web. Use it to replace
`NavigatorBackend::time_since_launch` in order to make `NavigatorBackend`
a little smaller and more simple.
2022-03-17 00:08:44 +02:00
relrelb 031126a1b8 core: Remove `LocaleBackend`
Previously there were 3 implementations of `LocaleBackend`:
`DesktopLocaleBackend`, `WebLocaleBackend` and `NullLocaleBackend`.

While `DesktopLocaleBackend`, `WebLocaleBackend` were identical,
`NullLocaleBackend` always returned a fixed date/time for tests
determinism.

Unify them in a single file, and use `cfg!(test)` and a new dedicated
`deterministic` feature to decide whether to mock date/time or not.
This should not cause any behavioral changes.
2022-03-16 19:57:53 +02:00
Aaron Hill e87ad52deb avm2: Add initial implementation of `Matrix`
This implements the `a, b, c, d, tx, ty` properties,
as well as the constructor, `identity`, and `scale` methods.
2022-03-16 13:52:58 +02:00
relrelb f8f2764ac7 chore: Stop using traits available in prelude
This commit does the same as 36353df7f7,
cleaning up any leftovers and new code added since.
2022-03-14 01:16:00 +02:00
Aaron Hill 3bcb409bd8 Add more AVM2 'flash.' class stubs
This PR adds the following class stubs:

* 'flash.display.Loader'
* 'flash.net.URLRequest'
* 'flash.ui.Keyboard'
* 'flash.utils.Timer'

These are needed for 'This is the Only Level TOO' (though we'll need
actual implementations to get this game past the loading screen).
2022-03-12 15:09:41 +01:00
Aaron Hill f4bb6fc43c Change property definition from `loaderUrl` to `loaderURL`
The actual property name is `loaderURL` - it looks like
a typo was made when this was originally defined in Ruffle.
2022-03-07 09:24:01 +02:00
Aaron Hill 8d58c6974c Display `Muliname` when trying to lookup a non-public property
This will make these errors easier to debug.
2022-03-06 22:56:23 +01:00
Aaron Hill 4a534086b8 Make `Date` class prototype methods non-enumerable 2022-03-06 22:48:15 +01:00
Aaron Hill 2d1b3a2834 Also declare Date methods on class prototype 2022-03-06 22:48:15 +01:00
Aaron Hill 59ef987210 Declare AVM2 'Date' class methods in the AS3 namespace
We now declare these methods in the 'http://adobe.com/AS3/2006/builtin'
namespace. This corresponds to the 'AS3' namespace modifier shown on the
docs page: https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Date.html

Previously, we would fail to lookup these methods, since the namespace
used by the SWF would not match the namespace defined by Ruffle.
2022-03-06 22:48:15 +01:00
relrelb 0401b3c447 avm2: Replace `json` with `serde_json`
The `json` crate seems unmaintained, and recently also causes compile
errors with stable Rust 1.59.0. On the other hand, `serde_json` is
very maintained and more popular.

However, from some reason a cyclic package dependency has introduced
by this change. For now use a workaround from: https://github.com/tkaitchuck/aHash/issues/95#issuecomment-903560879
2022-02-27 23:19:46 +02:00
Jean Marchand 9969e0ce5a avm2: Fix invalid option 2022-02-12 23:35:32 +02:00
Adrian Wielgosik 562a205f3d chore: clippy 2022-02-07 00:49:00 +01:00
Adrian Wielgosik 2c4b260a8c chore: cargo fmt 2022-02-07 00:49:00 +01:00
Adrian Wielgosik c67579e236 avm2: Implement Object() 2022-02-07 00:49:00 +01:00
Adrian Wielgosik 0004b9e58e avm2: Implement RegExp() 2022-02-07 00:49:00 +01:00
Adrian Wielgosik c8fe2fcfb2 avm2: Implement Namespace() stub 2022-02-07 00:49:00 +01:00
Adrian Wielgosik 8402f6637b avm2: Implement Vector.<T>(array_like) 2022-02-07 00:49:00 +01:00
Adrian Wielgosik db8aa42db9 avm2: Support custom Class() implementations 2022-02-07 00:49:00 +01: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 87a9a543ba chore: Fix clippy lint on nightly 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 18b8b227a1 avm2: Add utility method for pulling mouse event data from current context 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
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
David Wendt 57acf47a10 avm2: Allow access to stage properties without a valid root movie clip. 2022-01-18 11:06:23 -08:00
David Wendt df25d1ca8b avm2: Children of the root inherit their parent's `loaderInfo` 2022-01-18 11:06:23 -08:00
David Wendt f041cced72 avm2: The stage's loader info object allows access to `url`, `bytes`, and `parameters`. 2022-01-18 11:06:23 -08:00
Adrian Wielgosik 5358940774 avm2: Support basic string.replace
Supports:
- string.replace(string, string)
- string.replace(regex, simple_string)

Does not support:
- string.replace(regex, string_with_replacement_codes)
- string.replace(any, function)
2022-01-17 20:10:20 -08:00
Adrian Wielgosik 86210363f0 avm2: Remove Object::derive() machinery for AS3 prototypes 2022-01-09 18:23:10 -08:00
Adrian Wielgosik 4230d1f19f avm2: Add Mouse.hide(), Mouse.show() 2021-12-21 17:32:57 +01:00
relrelb b1151b2ab2 html: Rewrite `FormatSpans::to_html`
The new implementation doesn't use the `xml` crate, nor `quick-xml`,
but rather just iterates the `TextSpan`s and builds the formatted HTML
string.
2021-12-20 08:31:59 +02:00
Adrian Wielgosik 5d81a0ce64 avm2: Remove .clone() calls now that Index is Copy 2021-12-17 21:09:40 -07:00
Adrian Wielgosik a8fb1c2b16 avm2: pass Multiname to resolve_type() by reference 2021-12-17 21:09:40 -07:00
Adrian Wielgosik 22a0711d85 avm2: Use TU's method cache for callstatic, newfunction opcodes 2021-12-17 21:09:40 -07:00
Adrian Wielgosik 4b23f4dfb7 avm2: Set correct value type in op_convert_u/i 2021-12-17 21:06:33 -07:00
David Wendt 2aee3555ab chore: Fix all new clippy lints added in latest Rust nightly 2021-12-17 20:53:26 -07:00
Adrian Wielgosik 726ec47f19 avm2: Support inheritance of protected traits 2021-12-15 22:26:41 +01:00
Adrian Wielgosik 11534a4b34 avm2: Implement parseInt, parseFloat 2021-12-15 22:16:49 +01:00
Adrian Wielgosik 49feb23649 avm2: Move toplevel functions to separate file 2021-12-15 22:16:49 +01:00
EmperorBale 30f2e0f8b1
avm2: Implement JSON (#5172)
* avm2: Implement JSON.parse

* avm2: Add AvmSerializer for serializing AVM values to JSON

* avm2: Add support for replacer objects

* avm2: use *const ObjectPtr for object stack

* avm2: Add support for space parameter is JSON.stringify

* avm2: Refactor AvmSerializer design

* avm2: Restrict spaces to a maximum of 10

* avm2: Refactor map_value

* tests: Add JSON.parse test

* chore: Appease clippy

* avm2: Check if value is undefined before inserting

* tests: Add test for JSON.stringify

* tests: Improve JSON.stringify test

* chore: Replace map_or with explicit match statements

* chore: Use QName::dynamic_name

* avm2: Use Object<'gc> instead of ObjectPtr

* chore: Use explicit match in deserialize_value

* Rebase fixes

Co-authored-by: Adrian Wielgosik <adrian.wielgosik@gmail.com>
2021-12-13 18:32:04 +01:00
Adrian Wielgosik ad1442dbaa avm2: Add a basic ContextMenu stub 2021-12-13 18:31:03 +01:00
Adrian Wielgosik 1f5979f168 chore: clippy 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 1311b0a3d0 avm2: refactor Domain::get_defining_script 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 0fb075a309 chore: cargo fmt 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 3d8f611651 avm2: Update comments. 2021-12-11 20:48:09 +01:00
Adrian Wielgosik b747541709 avm2: Panic upon encountering CallMethod opcode 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 1d8c556944 avm2: Handle TODOs, throw errors where applicable 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 24247dff0b avm2: install_const_late always appends slots 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 4bd12ae4b3 avm2: Get prototypes from classes without get_property() 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 49d16dea8b avm2: Rip out `receiver` from get/set/call_property 2021-12-11 20:48:09 +01:00
Adrian Wielgosik ee0798b258 avm2: Cleanup slots/global initialization some more 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 21865edf9b avm2: Support const slots, fill some TODOs 2021-12-11 20:48:09 +01:00
Adrian Wielgosik b272d8722e avm2: Reword slot/disp_id assignment, remove Slot. 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 4d8999c012 avm2: Make all prototypes ScriptObjects; also cleanup vector enumeration, Proxy 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 3706db86d2 avm2: move properties from instances to vtable 2021-12-11 20:48:09 +01:00
Adrian Wielgosik 6594d4159d avm2: Use Vec instead of HashMap for loaded constants 2021-12-11 10:03:29 +01:00
relrelb 7966d850dd core: Normalize `\r` to `\n` in `avm_trace`
Fixes #3120.
2021-12-10 19:54:35 +02:00
EmperorBale 0a25ebbc32 chore: Remove more explicit clones 2021-12-08 22:14:45 +01:00
EmperorBale d6b7d0c915 chore: Fix formatting 2021-12-08 22:14:45 +01:00
EmperorBale 847a4fb61a chore: Remove explicit clones in value 2021-12-08 22:14:45 +01:00
EmperorBale 1709ea94e7 chore: Remove explicit clones in object 2021-12-08 22:14:45 +01:00
EmperorBale 8ea41bc151 chore: Remove explicit clones in slot 2021-12-08 22:14:45 +01:00
EmperorBale 15378bcfde chore: Remove explicit clones from vector 2021-12-08 22:14:45 +01:00
EmperorBale 2f71360c3b chore: Remove explicit clones from primitive_object 2021-12-08 22:14:45 +01:00
EmperorBale a7f86e679c chore: Remove explicit clones from uint 2021-12-08 22:14:45 +01:00
EmperorBale 0a8b964754 chore: Remove explicit clones from number 2021-12-08 22:14:45 +01:00
EmperorBale 8f27196356 chore: Remove explicit clones in int 2021-12-08 22:14:45 +01:00
EmperorBale a0bbc96b4a chore: Remove explicit clones in function 2021-12-08 22:14:45 +01:00
EmperorBale 7027046588 chore: Remove explicit clones in shape 2021-12-08 22:14:45 +01:00
EmperorBale 51f909691f chore: Remove explicit clones in movieclip 2021-12-08 22:14:45 +01:00
EmperorBale 96eb14fdab chore: Remove explicit clones in boolean 2021-12-08 22:14:45 +01:00
EmperorBale 60fc4cd0c0 chore: Remove explicit clones in activation 2021-12-08 22:14:45 +01:00
EmperorBale 002158a1b0 chore: Remove explicit clones in array 2021-12-08 22:14:45 +01:00
EmperorBale 7fce022293 avm2: Derive Copy for Value 2021-12-08 22:14:45 +01:00
relrelb da4b5986b1 chore: Appease clippy 2021-12-08 22:36:55 +02:00
David Wendt 9f30a9d4a6 avm2: When passing namespaces around, use a `SmallVec` of one element for memory savings. 2021-12-02 16:30:21 -07:00
David Wendt 1302ea9986 avm2: Pass everything around as `SmallVec`s. 2021-12-02 16:30:21 -07:00
David Wendt 5e03382f5d avm2: Smallvec the property maps. 2021-12-02 16:30:21 -07:00
David Wendt a18faeb047 avm2: Also put definition scripts in a `PropertyMap` and query them the same way we do objects 2021-12-02 16:30:21 -07:00