Commit Graph

2239 Commits

Author SHA1 Message Date
David Wendt da6a7c0723 Implement `kill`, at least a little.
I'm sure there's some other part of AVM2 that cares about killed registers, but I couldn't find it yet.
2020-07-13 17:44:30 -04:00
David Wendt 7253c091a2 Add tests for control flow instructions that use booleans or strict equality.
Other comparisons will have to wait until we have ECMA-compliant abstract comparison and coercion.
2020-07-13 17:44:30 -04:00
David Wendt 9c5ea1d30c Implement `jump`, `iftrue`, `iffalse`, `ifstricteq`, and `ifstrictne`. 2020-07-13 17:44:30 -04:00
David Wendt b33c246713 Implement `is_property_overwritable`. 2020-07-13 17:44:29 -04:00
David Wendt ddc9aa4cca Add a test for ES4 method binding of `this`. 2020-07-13 17:44:29 -04:00
David Wendt 915b2da42b Allow binding a reciever to a function, and make all method traits bind themselves to the object they were constructed on.
Our already odd `super` handling throws up another subtlety regarding bound recievers. Since we have to construct an instance of a parent class in order to get traits on it, we also have to make sure that we initialize traits with the correct reciever. I'll demonstrate here:

```let mut base = base_proto.construct(avm, context, &[])?;
let name = base.resolve_multiname(&multiname).unwrap();
let value = base.get_property(object, &name, avm, context)?.resolve(avm, context)?```

In this case, if `name` is the name of a method, getter, or setter trait, then `get_property` will instantiate that trait on `base` but bound to `reciever`. This is correct behavior for this case, but more generally, trait instantiation is permenant and therefore there's potential for confusing shenanigans if you `get_property` with the wrong reciever.

To be very clear, `reciever` should *always* be the same object that is getting `get_property` et. all called on it. In the event that you need to instantiate traits with a different `reciever`, you should construct a one-off object and retrieve prototypes from that.
2020-07-13 17:44:28 -04:00
David Wendt f042e453a3 Add a test for interactions between prototype and class-trait properties.
This is the test that broke the old object model's back, please see parent commit's description for more details.
2020-07-13 17:44:27 -04:00
David Wendt 2f95a7a81b Completely overhaul the way traits are defined on objects.
Previously, we were treating ES4 classes like syntactic sugar over a prototype chain (like ES6 classes); e.g. each declared trait was set in the given prototype and then property look-ups happened as normal.

This already caused problems with virtual properties, which could be partially-defined in subclasses and required careful checks to make sure we stopped checking the prototype chain on the *correct* half of the property.

However, this is a hint of a larger problem, which is that ES4 classes don't actually define anything on the prototype chain. Instead, the instance itself constructs class properties and methods on itself. This allows things like methods automatically binding `this`, which isn't included in this commit but will be implemented really soon.

The prototype chain still exists even on pure ES4 classes, due to the need for backwards compatibility with ES3 code. Object, for example, still defines it's methods as prototype methods and thus there needs to be a prototype chain to reach them. I actually could have gotten away with using the prototype chain if AS3 *hadn't* retained this "legacy" detail of ES3 allowing this class/prototype distinction to leak out into upcoming tests.

We still actually use the prototype chain for one other thing: trait resolution. When we look for a trait to install onto an object, we pull traits from the prototype chain using a special set of `TObject` methods. This happens in opposite order from normal prototype lookups so that subclassing and verification can proceed correctly.

`super` somehow became even harder to implement: we now actually construct the parent class so we can get traits from it, which is going to complicate method binding as mentioned above.
2020-07-13 17:44:27 -04:00
David Wendt 353017576a `ScriptObject` now holds a reference to a class and allows retrieving traits from it. 2020-07-13 17:44:27 -04:00
David Wendt f10920adc0 Implement `Object.prototype.hasOwnProperty` and resolution of `Namespace::Any`. 2020-07-13 17:44:26 -04:00
David Wendt 67744650f1 Pass the ABC name and lazy init flag to the AVM2. 2020-07-13 17:44:25 -04:00
David Wendt 6cc3f7ecc3 Add a test for stored properties as well.
This test passed with no errors.
2020-07-13 17:44:24 -04:00
David Wendt 5abc78d3bd Add test of AVM2 virtual properties.
This tests:

 * Getter invocation
 * Setter invocation
 * Properties with one or the other, but not both
 * Inheritance
 * Superproperty getters and setters
 * Getters with inherited setter
 * Setters with inherited getter
2020-07-13 17:44:24 -04:00
David Wendt c5e3af2053 When resolving `get_property`, skip over virtual properties that do not have a defined getter. 2020-07-13 17:44:23 -04:00
David Wendt 54b792ef3a Ensure that called setters are properly resolved so that errors in setters propagate up the Rust stack correctly.
The previous system for handling setters would execute the setter and then return a value to indicate whether or not the caller needed to resolve a stack frame. However, no caller of `Property.set` actually did this. Ergo, errors in setters and getters would not resolve up the stack at the correct time.

This problem also exists in AVM1 but is far less noticable as AVM1 only has two very uncommon runtime errors and very few movies use `throw`.
2020-07-13 17:44:23 -04:00
David Wendt b8106d24d2 Ensure virtual setters are run when defined on a prototype.
Normally, `set_property` only affects the object it was called on, which makes sense: otherwise, we couldn't override values that originate from a class prototype without accidentally monkey-patching the prototype. However, virtual setters only exist in prototypes and need to be accessible from child objects.

The solution to this is to have a specific method to check if a virtual setter exists. Virtual setters are then resolved through the prototype chain. If no virtual setter exists, then the reciever object is handed the value.

Note that we always use the `reciever` object rather than `self` so that `setsuper` can work correctly. In `setsuper`, we resolve the base class, and then set properties on it with the actual object in question as it's reciever. If a virtual setter is called, it will get the actual object it should be manipulating; and otherwise, prototypes will not be modified or consulted.
2020-07-13 17:44:22 -04:00
David Wendt 665d7a4342 Implement `getsuper` and `setsuper`.
This required the reintroduction of dedicated reciever parameters to `Object.get_property_local` and `Object.set_property`, which I had removed from the AVM1 code I copied it from. It turns out being able to change the reciever was actually necessary in order to make super set/get work.
2020-07-13 17:44:22 -04:00
David Wendt 785832b7f3 Add `as3_inheritance` test, which is primarily designed to test method calls, constructor execution, and usage of `super`. 2020-07-13 17:44:22 -04:00
David Wendt e8fbac6cf2 Refactor the base_proto system to more accurately record what prototype methods come from.
The previous system primarily relied on `Executable` to automatically start and continue a super chain. This works, but only for class hierarchies without *override gaps* - methods that override another method not defined by the direct superclass of the method. In that case, the override method would be called twice as the `base_class` was moved up one prototype at a time, which is wrong.

The new system relies on the call site to accurately report the prototype from which the current method was retrieved from. Super calls then start the resolution process *from the superclass of this prototype*, to ensure that the already-called method is skipped.

It should be noted that the proper `base_class` for things like `callmethod`, `callstatic`, `call`, `get`/`set` methods, and other call opcodes that don't use property look-up are best-effort guesses that may need to be amended later with better tests.

To facilitate `base_proto` resolution, a new `Object` method has been added. It's similar to `get_property`, but instead returns the closest prototype that can resolve the given `QName`, rather than the actual property's `ReturnValue`. Call operations use this to resolve the `base_proto`, and then resolve the method being called in `base_proto`. The existing `exec_super` method was removed and a `base_proto` method added to `exec` and `call`.
2020-07-13 17:44:21 -04:00
David Wendt 43da7ac952 `resolve_multiname` should actually return it's prototype's return value. 2020-07-13 17:44:20 -04:00
David Wendt ab5a95c05b Add a test for various types of class methods. 2020-07-13 17:44:19 -04:00
David Wendt 1c3b9c50fe Implement prototype awareness for `get_property`, `has_property`, and `resolve_multiname`.
Furthermore, implement `has_own_property`.
2020-07-13 17:44:19 -04:00
David Wendt fa4369da72 Execute static class initializers.
This also fixes the lack of function prototype on classes.
2020-07-13 17:44:18 -04:00
David Wendt 687a82f643 Constructors should also inherit closure scope. 2020-07-13 17:44:18 -04:00
David Wendt 73966f1b31 Make sure that we actually call the super constructor, not our own constructor. 2020-07-13 17:44:17 -04:00
David Wendt 1b67bb94c8 Impl `callsuper`, `callsupervoid`, and `constructsuper`.
This works primarily by retaining the current superclass prototype in the activation object and then using it to retrieve the super method.

For constructors, we implement the `constructor` property, which is probably not the correct way to do this.
2020-07-13 17:44:15 -04:00
David Wendt f3dee5c310 Add (currently failing) test for constructors. 2020-07-13 17:44:14 -04:00
David Wendt a77f676279 `construct` and `constructprop` should push the object that was just constructed. 2020-07-13 17:44:13 -04:00
David Wendt 0fc9b9a287 `construct` and `constructprop` should take their args in reverse-order like the call functions do. 2020-07-13 17:44:13 -04:00
David Wendt 9431e02802 The class function should use the *instance* initializer as it's callable, not the class initializer. 2020-07-13 17:44:13 -04:00
David Wendt bedf5cb459 Add a basic test for function calls. 2020-07-13 17:44:13 -04:00
David Wendt 38868fbdfe Args are pushed onto the stack in normal order, so we need to pop them off in reverse order. 2020-07-13 17:44:12 -04:00
David Wendt a2dfffc56e Add our first AVM2 regression test: hello world! 2020-07-13 17:44:09 -04:00
David Wendt 7d576203c9 Impl `coerce_a`.
This currently treats `coerce_a` as a no-op. Strictly speaking, this is for type verification purposes, but we currently don't type-verify ABC code. Ergo, this requires no VM support at this time.
2020-07-13 17:43:50 -04:00
David Wendt a0ab978bed Impl `callmethod`, `callproperty`, `callproplex`, `callpropvoid`, and `callstatic`.
Also, implement a method table that method traits can optionally add themselves to.

Also also, add the ability to invoke a method without a `this` object. This required a non-trivial refactoring of the activation machinery, and changes to the signature of `NativeFunction`, and all native AVM2 functions.
2020-07-13 17:43:49 -04:00
David Wendt 68cf9e8869 Upon encountering an `Err`, dispose of the current AVM2 stack.
In the future, the `unwrap_stack_frame` mechanism should be expanded upon to allow running exception handlers and recovering from a Rust error - but not today.
2020-07-13 17:43:49 -04:00
David Wendt a7ff2de476 Don't spam the test log with `Resolving Multiname` messages for each scope that gets checked 2020-07-13 17:43:48 -04:00
David Wendt dd6b0a8728 Remove unused reference to slot property fields 2020-07-13 17:43:48 -04:00
David Wendt bf45f7f161 Fix crash when reading or writing a property that redirects to a slot. 2020-07-13 17:43:48 -04:00
David Wendt 7792fd5581 Impl `trace`, which is a free function rather than an opcode this time. 2020-07-13 17:43:48 -04:00
David Wendt a557867c71 Add the entire class hierarchy of `MovieClip` and `Sprite`. 2020-07-13 17:43:47 -04:00
David Wendt f6e2ca1fe5 Clean up the current set of builtins to accurately reflect the namespace hierarchy. 2020-07-13 17:43:47 -04:00
David Wendt 38b1524a49 Fix the error messages for `findpropstrict` and `getlex` to be more informative. 2020-07-13 17:43:47 -04:00
David Wendt 843de29460 Impl `newobject` 2020-07-13 17:43:46 -04:00
David Wendt 7201f6c4fe Impl `debug`, `debugfile` and `debugline`. 2020-07-13 17:43:46 -04:00
David Wendt 1d1bad1ab4 Impl `getglobalscope` 2020-07-13 17:43:46 -04:00
David Wendt 074ba94c17 Impl `newfunction` and `newclass`.
Notably, this also removes `new_closure_scope` as it is not needed. AVM1 does not capture `with` scopes in closures, but AVM2 (as well as modern ECMAScript) does.
2020-07-13 17:43:46 -04:00
David Wendt 1fe73b3329 Impl `dup` 2020-07-13 17:43:45 -04:00
David Wendt 0ff1c04697 Impl `initproperty` 2020-07-13 17:43:45 -04:00
David Wendt 5042fc1bc7 Debug all multiname resolutions 2020-07-13 17:43:44 -04:00
David Wendt 5c0e095ab5 `getlex` does not support runtime multinames according to spec. 2020-07-13 17:43:44 -04:00
David Wendt 9e120c216b Propagate arguments into local registers when calling AVM functions. 2020-07-13 17:43:44 -04:00
David Wendt 5b00c1fd96 Ensure that `this` is properly populated into local registers. 2020-07-13 17:43:44 -04:00
David Wendt b2f5307213 Add `flash.display.Sprite` because Flash Builder tests demand it. 2020-07-13 17:43:42 -04:00
David Wendt 4ab9a46515 Impl `getscopeobject` 2020-07-13 17:43:41 -04:00
David Wendt 5f98a198cb Remove dead code in Activation 2020-07-13 17:43:41 -04:00
David Wendt 279d90ec22 Remove `define_value` from AVM2 objects.
We already have a menagerie of `install_*` functions for adding static properties to a an object; and we don't have to support any kind of asinine nonsense liks `ASSetPropFlags` here. Ergo, we don't need this.
2020-07-13 17:43:39 -04:00
David Wendt cbce8660bc Implement `deleteproperty`. 2020-07-13 17:43:37 -04:00
David Wendt d19d9ef90e Clean up unused variables 2020-07-13 17:43:35 -04:00
David Wendt 8b56973d29 Remove scope methods that aren't necessary.
In AVM1, these are necessary because `ActionGetVariable` et. all directly interface with the scope chain. In AVM2, you `findpropstrict` up the scope chain, which gives you a normal object that you can interact with as you like. Ergo, the scope chain doesn't need set/get property methods.
2020-07-13 17:43:34 -04:00
David Wendt fd275bdcf3 Implement constant slots and traits.
Class and Function traits now generate const slots, too.
2020-07-13 17:43:33 -04:00
David Wendt 412c3d8489 Implement `Function` traits. 2020-07-13 17:43:29 -04:00
David Wendt af70024f62 Implement slot traits. 2020-07-13 17:43:28 -04:00
David Wendt 200c10b4a2 Classes can fit in slots, so let's stick them in there. 2020-07-13 17:43:27 -04:00
David Wendt d42b16f021 Add stub impl of `flash.display.MovieClip`. 2020-07-13 17:43:27 -04:00
David Wendt ebcfee4676 Add specific error messages for unresolvable super classes 2020-07-13 17:43:27 -04:00
David Wendt 362294181f Implement constant pool default values (index 0).
All constant pools in an ABC file are actually numbered starting from one; there's an implicit 0 entry not stored in the file that the runtime is expected to retrieve when pulling constants from the pool.

The AVM2/ABC spec only mentions this in passing.
2020-07-13 17:43:27 -04:00
David Wendt e1916519dd Add debug for trait installs 2020-07-13 17:43:26 -04:00
David Wendt cfe0e333be Fix invalid script index when loading an ABC file. 2020-07-13 17:43:26 -04:00
David Wendt bc0bdf8496 The public namespace appears to just be an unnamed package namespace, not a regular namespace. 2020-07-13 17:43:25 -04:00
David Wendt 04879fc419 Implement class traits.
This allows the AVM to declare classes, which necessitated some refactoring to avoid double-borrows or having to do something "magic" that would dodge virtual properties.
2020-07-13 17:43:25 -04:00
David Wendt ecfd5abb41 Impl `construct` and `constructprop`. 2020-07-13 17:43:24 -04:00
David Wendt 1ab4091050 Implement slots and related opcodes. 2020-07-13 17:43:24 -04:00
David Wendt 88957b2b3d Add stub builtins for Object and Function. These are more-or-less identical to the way we did it in AVM1 (e.g. no fancy player globals file) 2020-07-13 17:43:24 -04:00
David Wendt 1945f36dc0 When running the initial script, also install it's traits onto the global scope. 2020-07-13 17:43:23 -04:00
David Wendt 35c36a807b Always execute the last script when loading an ABC file 2020-07-13 17:43:23 -04:00
David Wendt 560900e708 ABC files are always pre-loaded.
Frame actions are handled as syntactic sugar on top of a `MovieClip` subclass and event handlers. ABC scripts do not live on the normal timeline.
2020-07-13 17:43:23 -04:00
David Wendt 502936f0fe Implement non-slot trait properties (Method, Getter, and Setter) 2020-07-13 17:43:22 -04:00
David Wendt 12e9fbbffb Impl virtual property slots 2020-07-13 17:43:22 -04:00
David Wendt eb0c9dcaec Allow constructing a function around a particular class definition.
I'm writing all this code assuming that classes and traits are syntactic sugar around ES3-style prototype chains on function objects. Hence, `FunctionObject` is still our workhorse object type for implementing typing.
2020-07-13 17:43:21 -04:00
David Wendt cf490bedfb Unstub `proto`. 2020-07-13 17:43:20 -04:00
David Wendt b12c6e0ff1 Implement closure scope stacks. 2020-07-13 17:43:20 -04:00
David Wendt 7d75255a1a Add global scope which is automatically included on all new activations. 2020-07-13 17:43:20 -04:00
David Wendt 984e701142 Swap out `has_property`'s stub impl. 2020-07-13 17:43:19 -04:00
David Wendt e5142e85e9 Replace `get_property` and `set_property` with slightly-less-stub impls. 2020-07-13 17:43:17 -04:00
David Wendt d56db06447 Implement `resolve_multiname`, sort of. 2020-07-13 17:43:16 -04:00
David Wendt 78a1c9a7e3 Implement `pushscope`, `popscope`, and `pushwith`. 2020-07-13 17:43:16 -04:00
David Wendt 5e6fc79f42 Implement `getproperty`, `setproperty` 2020-07-13 17:43:15 -04:00
David Wendt 60c16b0a60 Implement `findproperty`, `findpropstrict`, and `getlex`; which are necessary for interacting with global scope. 2020-07-13 17:43:15 -04:00
David Wendt 3c8035f871 clippy pls 2020-07-13 17:43:14 -04:00
David Wendt 12223d524a Add support methods in `Scope` to support opcodes that traverse the scope chain. 2020-07-13 17:43:14 -04:00
David Wendt 0ff1ba7120 Multiname resolution is another object method. 2020-07-13 17:43:14 -04:00
David Wendt 376d1a8ca6 Add scope support 2020-07-13 17:43:13 -04:00
David Wendt 3b476cba9e Implement `pushnamespace` since that's a value type now 2020-07-13 17:43:13 -04:00
David Wendt 1a6acb9440 Implement late binding and runtime qualifications for names. 2020-07-13 17:43:12 -04:00
David Wendt 2f3a3aff6f Add exact type assertion methods for strings and namespace values. 2020-07-13 17:43:11 -04:00
David Wendt 6d8dc6e63d Pull ABC constant pool methods out of Avm2 and into Value.
The old methods still exist and do the same thing, but the Value methods
accept arbitrary AbcFile references.
2020-07-13 17:42:51 -04:00
David Wendt c65d93d063 Implement multinames, sans runtime namespace support. 2020-07-13 17:42:50 -04:00
David Wendt 6bd94d6bc9 `from_abc_namespace` should accept a namespace index and retrieve it from the file's constant pool itself. 2020-07-13 17:42:50 -04:00
David Wendt 43f1080fab Implement namespaces as a value type 2020-07-13 17:42:49 -04:00
David Wendt 52ac7a6583 Implement call/return for bare functions 2020-07-13 17:42:49 -04:00
David Wendt 115f0393aa Add `call` method to the object trait. Only functions are callable in AVM2, all others error out. 2020-07-13 17:42:48 -04:00
David Wendt d1aeae8e02 Add support for local registers in the interpreter. 2020-07-13 17:42:47 -04:00
David Wendt 4d000e1ce0 Implement `pushxyz` opcodes for all value types that we currently support. 2020-07-13 17:42:46 -04:00
David Wendt 5600ac477c Always execute any AVM2 code that may have been queued as a result of loading ABC files. 2020-07-13 17:42:45 -04:00
David Wendt 7f60fab1e5 Add the bare minimum necessary to get opcodes out of an ABC and into an interpreter loop.
Surprisingly enough, the "bare minimum" includes a stack, object model, and values already.
2020-07-13 17:42:45 -04:00
David Wendt e80c887261 Add a very basic object model to the AVM2 interpreter. 2020-07-13 17:42:44 -04:00
David Wendt b7f257e7c8 Add a path to get from the movie clip to the Avm2. 2020-07-13 17:42:43 -04:00
David Wendt a852a6939a Add an extremely trivial implementation for the AVM2 interpreter state. 2020-07-13 17:42:31 -04:00
Nathan Adams fba8ccda81 avm1: Rename Avm1String to AvmString 2020-07-13 10:12:54 -07:00
Nathan Adams d8f043fa1a avm1: Value::coerce_to_string returns an Avm1String, as it can avoid a clone-and-reallocate 2020-07-13 10:12:54 -07:00
Nathan Adams f0ef68cb16 avm1: Reenabled paused string-value tests during string refactor 2020-07-13 10:12:54 -07:00
Nathan Adams c60b2cf4fc avm1: Implement From<&'static str> for Value 2020-07-13 10:12:54 -07:00
Nathan Adams e03e3f6c4e avm1: Allow Avm1String to contain &'static str 2020-07-13 10:12:54 -07:00
Nathan Adams ad733f2f21 avm1: Add Avm1String which wraps Gc<String> 2020-07-13 10:12:54 -07:00
Nathan Adams 016b9db3c5 avm1: Change Value::String(String) to Value::String(Gc<String>) 2020-07-13 10:12:54 -07:00
CUB3D 0591c0fe4b core: Add functions to prototypes 2020-07-12 15:25:58 -07:00
CUB3D ab022b66e9 chore: Format and cleanup clippy lints 2020-07-12 15:25:58 -07:00
CUB3D 83cca044ad core: Add tests for ContextMenu and ContextMenuItem 2020-07-12 15:25:58 -07:00
CUB3D 46cd8eb507 core: Add ContextMenuItem 2020-07-12 15:25:58 -07:00
CUB3D 04ca652f98 core: ContextMenu fully implemented 2020-07-12 15:25:58 -07:00
CUB3D 73a98c7f78 core: Implement copy() for ContextMenu 2020-07-12 15:25:58 -07:00
CUB3D f3aa6f7f01 core: Add stub of ContextMenuItem 2020-07-12 15:25:58 -07:00
CUB3D c8fefc56b5 core: Add stubs for context menu 2020-07-12 15:25:58 -07:00
dependabot-preview[bot] aaf42d1948 build(deps): bump syn from 1.0.33 to 1.0.34
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.33 to 1.0.34.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.33...1.0.34)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-12 15:01:43 -07:00
Nathan Adams 180891c58e avm1: Add impl_custom_object!() macro to simplify custom object types 2020-07-10 16:48:05 -07:00
Nathan Adams eb94cc54b2 chore: Move avm1 objects to their own module, we have plenty of them now 2020-07-10 16:48:05 -07:00
Mike Welsh 3322c2d916 avm1: Implement updateAfterEvent 2020-07-10 14:38:48 -07:00
Mike Welsh 8715589f50 tests: Add setInterval test 2020-07-10 14:38:48 -07:00
Mike Welsh 98e7da7d93 avm1: Implement setInterval 2020-07-10 14:38:48 -07:00
Mike Welsh a1ff80bb18 avm1: Object.watch is case insensitive on SWFv6 2020-07-10 12:02:26 -07:00
Nathan Adams 8a0430d744 avm1: Implement Object.watch & Object.unwatch (#268) 2020-07-10 12:02:26 -07:00
Nathan Adams ecbab536b5 avm1: Respect ScriptLimits for recursion depth, and use that in infinite_recursion_function 2020-07-08 14:47:38 -07:00
Nathan Adams 2b30fd32b7 avm1: Activation depth can be up to u16. 2020-07-08 14:47:38 -07:00
Nathan Adams 51ec5739c6 avm1: Throw errors when functions (user-called, or special) go too deep 2020-07-08 14:47:38 -07:00
Nathan Adams aa98c2c24f avm1: Track the reason for executions, if it's a function call vs
something special, like a getter
2020-07-08 14:47:38 -07:00
Nathan Adams 65396ba87a avm1: All errors are ignored during getters or setters 2020-07-08 14:47:38 -07:00
Nathan Adams 3ee1902117 avm1: Don't log errors at every Activation, only at the "root" frames 2020-07-08 14:47:38 -07:00
Nathan Adams 8218e14824 avm1: Remove unused field is_executing from Activation 2020-07-08 14:47:38 -07:00
dependabot-preview[bot] a3bdb20cf1 build(deps): bump smallvec from 1.4.0 to 1.4.1
Bumps [smallvec](https://github.com/servo/rust-smallvec) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.4.0...v1.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-06 20:30:41 -07:00
Mike Welsh 2cbbe32412 tests: Add test for GetVariable/SetVariable on _x, etc. 2020-07-05 15:15:31 -07:00
Mike Welsh 804385347f tests: Add test for virtual properties on prototype 2020-07-05 15:15:31 -07:00
Mike Welsh fec8cf5e52 tests: Add tests for with from issue #792 2020-07-05 15:15:31 -07:00
Mike Welsh bd7f986594 avm1: Allow overwriting _parent 2020-07-05 15:15:31 -07:00
Mike Welsh ad6e2ceed4 avm1: Remove TObject::is_property_overwritable
Local virtual properties take precedence over prototype/parent
scopes, even for read-only propreties.
2020-07-05 15:15:31 -07:00
Mike Welsh 1240c79f70 avm1: StageObject::has_property should return true for _x, etc. 2020-07-05 15:15:31 -07:00
Mike Welsh 6feb266576 avm1: with(undefined) or with(null) is ignored 2020-07-05 15:15:31 -07:00
CUB3D 00d55b05a0 chore: Fix formatting 2020-07-05 13:49:59 -07:00
CUB3D 64eed4def9 chore: Cleanup 2020-07-05 13:49:59 -07:00
CUB3D ab58cff8b3 core: Add tests for ColorTransform and cleanup code 2020-07-05 13:49:59 -07:00
CUB3D 0dcbd05f5d chore: Fix formatting 2020-07-05 13:49:59 -07:00
CUB3D 68eb6a6342 core: Fix ColorTransformObject virtual prototype setters 2020-07-05 13:49:59 -07:00
CUB3D 73e9dc1a82 core: Refactor ColorTransform 2020-07-05 13:49:59 -07:00
CUB3D 26ae182584 core: Update to reflect avm changes 2020-07-05 13:49:59 -07:00
CUB3D 431cc532be core: ColorTransform no longer passed through engine ColorTransform object 2020-07-05 13:49:59 -07:00
CUB3D a8b1be2afa core: Remove useless to_owned in color_transform 2020-07-05 13:49:59 -07:00
CUB3D c0315dce3f chore: Format 2020-07-05 13:49:59 -07:00
CUB3D a8f7638d99 core: Implement ColorTransform 2020-07-05 13:49:59 -07:00
dependabot-preview[bot] 328246dc10 build(deps): bump jpeg-decoder from 0.1.19 to 0.1.20
Bumps [jpeg-decoder](https://github.com/image-rs/jpeg-decoder) from 0.1.19 to 0.1.20.
- [Release notes](https://github.com/image-rs/jpeg-decoder/releases)
- [Changelog](https://github.com/image-rs/jpeg-decoder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/image-rs/jpeg-decoder/compare/v0.1.19...v0.1.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-04 15:29:45 -07:00
Mike Welsh 7b4045f32b core: Remove some unneccessary `take` calls in tag functions 2020-07-03 18:52:26 -07:00
Mike Welsh 08569ae979 core: Limit tag parsing to slice of tag data 2020-07-03 18:52:26 -07:00
Nathan Adams c50c835790 avm1: Made Executable::Action take in a Gc to Avm1Function, reducing the size of the struct significantly 2020-07-03 18:47:34 -07:00
Nathan Adams c4980d0bf5 core: Make XMLName::node_name return Cow<str>. It's not always owned, and we don't always need it to be. 2020-07-03 17:30:59 -07:00
Nathan Adams c036e2cf88 avm1: Made f64_to_string return Cow<str> instead of String, as we sometimes return static values 2020-07-03 17:30:59 -07:00
Nathan Adams 938d644d7d core: Made PropertyMap::insert take &str instead of String, as ownership isn't always needed 2020-07-03 17:30:59 -07:00
Nathan Adams fb84999778 core: Made VacantEntry store a &str instead of a String, avoiding allocation until insertation is requested 2020-07-03 17:30:59 -07:00
Nathan Adams f4921fad45 core: Made PropertyMap::entry take &str instead of String. We often don't need ownership here. 2020-07-03 17:30:59 -07:00
Nathan Adams b5c06be8a2 avm1: Anonymous function names for debugging when not in debug mode 2020-07-03 17:24:20 -07:00
Nathan Adams 51321713b5 avm1: Show stack frame with the avm_debug feature 2020-07-03 17:24:20 -07:00
Nathan Adams c976cf8efb avm1: Replace action.avm() with activation.avm to help with borrow checker in next commit 2020-07-03 17:24:20 -07:00
Mike Welsh 07814fdf53 tests: Add test for Error 2020-07-02 20:58:01 -07:00
Jon Pacheco 48c65f02a1 avm1: Implement Error object (see #251) 2020-07-02 20:58:01 -07:00
Adrian Wielgosik 301d696670 Add a fast path for ASCII case conversions 2020-07-02 12:48:50 -07:00
Mike Welsh 3a4d432645 tests: Edit textfield_variable test for #777 2020-07-02 01:29:41 -07:00
Mike Welsh dd32acd8fc avm1: Empty text field does not initialize variable binding
If a text field with a variable binding is placed on the stage,
usually the variable is initialized with the initial text. However,
if the text field is empty, the variable remains undefined.

Fixes #777.
2020-07-02 01:29:41 -07:00
Mike Welsh b05da5ef0f avm1: CastOp fails for primitive values 2020-07-01 17:30:56 -07:00
Nathan Adams d86761db5d avm1: Implement try {..} catch {..} finally {..} - #731 2020-07-01 17:30:56 -07:00
Nathan Adams 7c0b0a7a57 avm1: Fix instanceof checks with primitives 2020-07-01 16:36:54 -07:00
Nathan Adams d1732dd3d6 avm1: Returning from with{} should return from the parent activation 2020-07-01 16:21:43 -07:00
Mike Welsh 4b4370b90d
avm: Refactor Avm1, move execution to StackFrame (merge #767)
AVM1 refactoring: moving execution from Avm1 to StackFrame
2020-07-01 15:56:09 -07:00
Nathan Adams 8bc3eedc43 avm1: Rename StackFrame to Activation now that they're merged 2020-07-02 00:09:43 +02:00
dependabot-preview[bot] 41e262d745 build(deps): bump libflate from 1.0.1 to 1.0.2
Bumps [libflate](https://github.com/sile/libflate) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/sile/libflate/releases)
- [Commits](https://github.com/sile/libflate/compare/1.0.1...1.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-01 11:43:31 -07:00
Nathan Adams 9b66b496d0 avm1: Fix double-borrow when calling a getter that calls another method 2020-07-01 18:53:16 +02:00
dependabot-preview[bot] aa9100395f build(deps): bump downcast-rs from 1.1.1 to 1.2.0
Bumps [downcast-rs](https://github.com/marcianx/downcast-rs) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/marcianx/downcast-rs/releases)
- [Changelog](https://github.com/marcianx/downcast-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/marcianx/downcast-rs/compare/v1.1.1...v1.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-30 17:32:47 -07:00
Nathan Adams 987375299b avm1: Replace 'run_in_avm' with just building a StackFrame object, letting Rust borrowchecker do our stack management for us 2020-06-30 21:57:51 +02:00
Nathan Adams 47a806a5ee avm1: Removed errors that are no longer possible to run into 2020-06-30 21:28:32 +02:00
Nathan Adams a989aa235a avm1: We don't need to lock StackFrames anymore, the borrow checker will steer us right 2020-06-30 21:26:57 +02:00
Nathan Adams 2288919663 avm1: We don't need to store data in StackFrame, it's only used when actually running data 2020-06-30 21:24:46 +02:00
Nathan Adams 45c3967deb avm1: Merge Activation into StackFrame 2020-06-30 21:08:42 +02:00
Nathan Adams d889b98043 avm1: Merge Activation::from_function and Activation::from_action as they're identical 2020-06-30 20:34:05 +02:00
Nathan Adams 6e4dd506da avm1: Activation doesn't need to be in a GcCell 2020-06-30 20:31:49 +02:00
Nathan Adams 4d24bc7f09 avm1: Removed pc from Activation, it's no longer needed 2020-06-30 19:42:18 +02:00
Nathan Adams 3e9c380ba1 avm1: Remove is_function from Activation, it's no longer needed 2020-06-30 19:40:21 +02:00
Nathan Adams ec4affcf10 avm1: Use child activations when already running from another activation 2020-06-29 10:13:59 +02:00
Nathan Adams aaa082fb60 avm1: Replace run_with_stack_frame with run_in_avm 2020-06-29 10:13:57 +02:00
Nathan Adams 0dd2ece371 avm1: Introduce parents to StackFrame, and move run_activation from avm1 to StackFrame 2020-06-29 10:12:17 +02:00
Nathan Adams 9b630bd305 avm1: Remove ReturnValue, it's no longer needed 2020-06-29 10:12:16 +02:00
Nathan Adams ab4304d634 avm1: Properly and more explicitly work around the double-borrow issue in setters 2020-06-29 10:10:38 +02:00
Nathan Adams a2103d906d avm1: Remove dead code from Avm1 2020-06-29 10:10:24 +02:00
Nathan Adams f85684fec0 avm1: Move current_swf_version and is_case_sensitive from avm1 to stackframe 2020-06-29 10:10:11 +02:00
Nathan Adams d470c52aea avm1: Move root_object, target_clip_or_root, target_clip and base_clip from avm1 to StackFrame 2020-06-29 10:09:57 +02:00
Nathan Adams ca305684db avm1: Removed unused return_value on Activation 2020-06-29 10:09:40 +02:00
Nathan Adams da8ca1379f avm1: Change from 'avm, context' to 'activation, context' and restructured to support this 2020-06-29 10:09:38 +02:00
Nathan Adams a841743962 avm1: Make current_stack_frame return a Result for easy chaining 2020-06-29 10:07:48 +02:00
Nathan Adams cdfd58d619 avm1: Move register get/setting from avm1 to StackFrame 2020-06-29 10:07:31 +02:00
Nathan Adams 63e66c29eb avm1: We already have our stack frame, don't refetch it in actions 2020-06-29 10:07:14 +02:00
Nathan Adams 3a093dddbd avm1: Run activations immediate, not queued up for some-time-later 2020-06-29 10:07:12 +02:00
Nathan Adams 10b8f4abaf avm1: Handle stack poping in avm 2020-06-29 08:55:50 +02:00
Nathan Adams 84a5fae43f avm1: Only perform stack-frame adjustments in one place, not scattered throughout actions 2020-06-29 08:51:34 +02:00
Nathan Adams 9109d89daa avm1: Allow for frame control in StackFrame from any action 2020-06-29 08:51:34 +02:00
Nathan Adams 329716bfe7 avm1: Don't refetch activation.data every action 2020-06-29 08:51:33 +02:00
Nathan Adams af72f68f0f avm1: Run entire stack frames at once 2020-06-29 08:51:33 +02:00
Nathan Adams c6b9de883f avm1: Add Activation to StackFrame, removing lots of get-and-unwraps 2020-06-29 08:51:33 +02:00
Nathan Adams 4d76e8b24d avm1: Move all actions from Avm1 to a new StackFrame 2020-06-29 08:51:33 +02:00
Mike Welsh 3bc3d4acb2 text: Fix bindings being incorrectly cleared in StageObject
Call to `Vec::retain` was backwards, causing bindings to be
incorrectly cleared/not cleared when a text field was removed.
2020-06-28 23:38:58 -07:00
Mike Welsh 93cf7a1386 text: Use retire_stack_frame after firing text bindings 2020-06-28 23:37:50 -07:00
Mike Welsh ed82d984d2 text: Properly set text field position when created dynamically 2020-06-28 18:36:10 -07:00
Mike Welsh 7eeda7d93e chore: clippy 2020-06-28 18:36:10 -07:00
Mike Welsh ef31a6bea4 text: Don't override TextField::set_matrix and other layout changes
Don't override set_matrix and set_x for TextFields, and leave the
bounds intact.

TODO: There are still some wrapping issues in the tests, but
this allows the simple case of single-line texts to render
correctly.
2020-06-28 18:36:10 -07:00
Mike Welsh b40f9d4c1a avm1: Implement TextField.html 2020-06-28 18:36:10 -07:00
Mike Welsh d97a515330 tests: Add text field variable test 2020-06-28 18:36:10 -07:00
Mike Welsh 618fa11acb avm1: Implement text field variable binding 2020-06-28 18:36:10 -07:00
Mike Welsh 51d66c53f0 core: Edit text sets variables on instantiation 2020-06-28 18:36:10 -07:00
Mike Welsh 12fca71b21 avm1: Move StageObjectData behind a GC pointer 2020-06-28 18:36:10 -07:00
Mike Welsh a922fd559f avm1: Add EditText variable property
Add `EditText::variable` as well as `TextField.variable` property.
This commit only adds the getter/setter and does not yet add the
binding functionality.
2020-06-28 18:36:10 -07:00
Mike Welsh dd50071240 core: Move frame and goto methods from MovieClipData to MovieClip 2020-06-28 18:36:10 -07:00
Mike Welsh 8da0f43412 tests: Add test for DefineLocal and issue #760 2020-06-28 15:15:45 -07:00
Mike Welsh 52fbb77e99 avm1: DefineLocal respects virtual properties and prototype chain (fix #760)
DefineLocal will call a virtual setter if the property already exists
on the local object, including the local object's prototype chain.

DefineLocal2 will also not overwrite a property if it already exists
on the local object, including the local object's prototype chain.
2020-06-28 15:15:45 -07:00
Mike Welsh 905f9d7ac6 core: Clear mouse down flag even if there is no hovered object 2020-06-27 23:34:19 -07:00
Mike Welsh a846d92d8c core: Don't fire rollOut events if clip is removed
Allows the inventory to work in The Room Tribute.
2020-06-27 21:24:49 -07:00
Mike Welsh 0833c15e25 tests: Add test for enumerating array indices 2020-06-27 20:25:45 -07:00
Mike Welsh 478d88b22d tests: Test hasOwnProperty for array indices in array_properties 2020-06-27 20:25:45 -07:00
Mike Welsh 8e3b96f1b1 tests: Add tests for non-string params in hasOwnProperty: 2020-06-27 20:25:45 -07:00
Mike Welsh ccf33eedf6 avm1: Array indices are enumerable 2020-06-27 20:25:45 -07:00
Mike Welsh ecc54d01f7 avm1: Disallow setting "" property
object[""] has no effect.
2020-06-27 20:25:45 -07:00
Mike Welsh ef82fc472e avm1: Object.hasOwnProperty should coerce_to_string 2020-06-27 20:25:45 -07:00
Mike Welsh b37b74e0b6 tests: Add test for __constructor__ being DontEnum 2020-06-27 18:54:01 -07:00
Mike Welsh 054194026e avm1: Mark __constructor__ and constructor as DontEnum 2020-06-27 18:54:01 -07:00
dependabot-preview[bot] 63beea22a2 build(deps): bump weak-table from 0.2.3 to 0.3.0
Bumps [weak-table](https://github.com/tov/weak-table-rs) from 0.2.3 to 0.3.0.
- [Release notes](https://github.com/tov/weak-table-rs/releases)
- [Changelog](https://github.com/tov/weak-table-rs/blob/master/release.toml)
- [Commits](https://github.com/tov/weak-table-rs/compare/0.2.3...0.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-27 16:08:52 -07:00
dependabot-preview[bot] 82a86d6139 build(deps): bump png from 0.16.5 to 0.16.6
Bumps [png](https://github.com/image-rs/image-png) from 0.16.5 to 0.16.6.
- [Release notes](https://github.com/image-rs/image-png/releases)
- [Changelog](https://github.com/image-rs/image-png/blob/master/CHANGES.md)
- [Commits](https://github.com/image-rs/image-png/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-27 16:08:11 -07:00
Nathan Adams 463b79f063 avm1: Implement Action::Throw 2020-06-25 02:03:15 -07:00
Nathan Adams 70e4a40f01 avm1: Allow for user errors inside avm1::error::Error 2020-06-25 02:03:15 -07:00
Mike Welsh 81d75c6256
text: Text formatting for EditText fields (merge #615)
First implementation of HTML parsing and formatting for text fields.
2020-06-24 23:06:11 -07:00
Mike Welsh 5d9701313e text: Fix TextField.embedFonts setter 2020-06-24 22:46:59 -07:00
Mike Welsh b2c96336fd text: Cull text field if offscreen 2020-06-24 22:46:54 -07:00
David Wendt 74af7b345c Adjust `BoxBounds` to use `Copy` instead of `Clone`. 2020-06-24 23:40:27 -04:00
David Wendt d7a257f93f Adjust `LayoutContext` and `LayoutBox` to construct a `Vec` of boxes rather than an intrusive, garbage-collected linked list. 2020-06-24 23:34:38 -04:00
David Wendt d281452fe1 Expose the device font flag to AVM1 code. 2020-06-24 22:55:50 -04:00
David Wendt 453cf6c0f1 Remove *extremely* out of date documentation on `BoxBounds`. 2020-06-24 22:36:36 -04:00
David Wendt 2723c3f6d9 Rename `Collec` to `CollectWrapper` 2020-06-24 22:34:04 -04:00
David Wendt 5b36522258 Remove out-of-date doccomment on `LayoutBox`. 2020-06-24 22:19:16 -04:00
David Wendt 0b8d0e8c85 Move the internal padding to a separate constant. 2020-06-24 21:53:58 -04:00
David Wendt e4d4d996f9 Don't push each line of text down with the leading adjustment.
We already adjust the cursor with the same adjustment, so we don't need to move the text down.
2020-06-24 21:32:59 -04:00
David Wendt bfb150ec05 Remove hardcoded 3px margin.
This was originally intended to correctly position text within the border, but it appears borders are weird and this doesn't jive with what unbordered text does.
2020-06-24 21:32:59 -04:00
Mike Welsh 0f794489a4 text: Don't create underline drawing if no underline exists 2020-06-24 12:53:51 -07:00
Mike Welsh 3558e42c34 text: Always fallback to Noto Sans if text field is set to use device fonts 2020-06-24 12:19:06 -07:00
Mike Welsh f591e1dafc text: process_html_entity returns a Cow 2020-06-24 11:56:20 -07:00
Mike Welsh 5a7012923b avm1: Move TextField methods into functions 2020-06-24 11:11:00 -07:00
Mike Welsh d2702464a5 avm1: TextField properties are emumerable and deletable 2020-06-24 11:02:21 -07:00
Mike Welsh b47e84b131 text: Derive Default for TextFormat 2020-06-24 10:44:34 -07:00
CUB3D a5b0a196cc core: Update to use updated value conversion functions 2020-06-24 01:57:15 +01:00
CUB3D f03093528c core: Add shared object cache and saving on exit
On the desktop player, shared objects will now be flushed on quit.
Attempting to retrieve an existing shared object will now return a
reference to the existing one.
2020-06-24 01:46:42 +01:00
CUB3D 166cb60d89 chore: Clean up useage of unwrap 2020-06-24 01:46:07 +01:00
CUB3D 62834fd690 chore: Remove unnecessary comment 2020-06-24 01:46:07 +01:00
CUB3D fce8e8b7de chore: Fix build 2020-06-24 01:46:07 +01:00
CUB3D 8a65ac764b chore: Clean up comments 2020-06-24 01:46:07 +01:00
CUB3D 8e28bab159 chore: Fix clippy lints, refactor storage to use data_local_dir 2020-06-24 01:46:07 +01:00
CUB3D 0122d65a09 core: Refactor SharedObject 2020-06-24 01:46:07 +01:00
CUB3D 1b130ccd47 chore: Refactor storage access 2020-06-24 01:46:06 +01:00
CUB3D 4e286b43ae chore: Format 2020-06-24 01:46:06 +01:00
CUB3D 0c6a7b3b4c core: Add SharedObject object type 2020-06-24 01:46:05 +01:00
CUB3D 752ffc5cca chore: Fix clippy lints and tests 2020-06-24 01:44:07 +01:00
CUB3D eff06d3d4d core: Add stub listener methods for SharedObject 2020-06-24 01:43:25 +01:00
CUB3D d3ae6a3a40 core: Fix data property of SharedObject 2020-06-24 01:43:25 +01:00
CUB3D 48693e4a7a core: Add inital storage backend implementation
Currently SharedObjects are encoded and decoded from JSON via the
StorageBackend, also provided is a basic in-memory implementation
2020-06-24 01:43:23 +01:00
CUB3D 539b4b0f63 core: Add stub for SharedObject 2020-06-24 01:42:19 +01:00
David Wendt 12495de91e Generate `LI`s when newlines are encountered with bullets on. 2020-06-22 19:45:39 -04:00
David Wendt ed5f3cdd0e Don't attempt to use non-embedded fonts. Instead, replace all of them with Noto (like EditText used to do). 2020-06-22 19:02:32 -04:00
David Wendt 40ea58c1c0 Since we cannot parse `<br>` properly yet, replace them and `<sbr>` with newlines before parsing so that we don't get spurious parse errors. 2020-06-22 18:00:51 -04:00
dependabot-preview[bot] 0a166af8ac build(deps): bump syn from 1.0.32 to 1.0.33
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.32 to 1.0.33.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.32...1.0.33)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-22 10:15:50 -07:00
Nathan Adams cea2c9520d chore: Ignore new 'unnested_or_patterns' clippy lint as we the suggested behaviour doesn't exist outside of nightly 2020-06-21 04:18:44 -07:00
David Wendt 7a9796a2f9 Restore BR parsing.
Note that this won't actually work since we're behind an XML parser that chokes on implicitly self-closing HTML tags.
2020-06-20 20:15:00 -04:00
David Wendt c1ad37a0f6 Implement text span raising, sans list items.
During the raising process, we maintain a list of pointers to the lowest-most `textformat`, `p`, `font`, `a`, `b`, `i`, and `u` in the document that we are appending to. When we get a new one of any of those elements, we clear the rest off the stack. This forces us to add HTML in the same order Flash does.

LIs are not yet supported because they require us to process text line-by-line which doesn't mesh with this model.

There's also a test but the XML DOM generates HTML strings with the wrong attribute order, so the test fails spuriously.
2020-06-20 20:14:57 -04:00
David Wendt e036d6594b Add some entity support to HTML parsing. 2020-06-20 20:08:22 -04:00
David Wendt 88fcb98913 Allow disabling entity processing when parsing XML.
This necessitated a change to edittext_bullet, which turns out is accidentally an entity test, too. It now no longer uses entities so that it won't spuriously fail due to an entity related problem.
2020-06-20 20:06:21 -04:00
David Wendt 65f4d2cf1e Add regression tests for `underline`.
We're within 4px in every case.
2020-06-20 19:56:01 -04:00
David Wendt f097a6584e Implement underlines. 2020-06-20 19:56:01 -04:00
David Wendt d63b3f23e9 Add support for inserting arbitrary drawings into the layout. 2020-06-20 19:56:00 -04:00
David Wendt a2d69a69a3 Add a test for bullets.
As usual with most newline related things, we're 3px off no matter how many or how few lines we have.
2020-06-20 19:56:00 -04:00
David Wendt 1c371c3a95 Render bullets.
Bullets are implemented by rendering U+2022 as if it were normal text, but always placed 18px from the left of the line. This appears to be sort of what Flash does.
2020-06-20 19:55:59 -04:00
David Wendt a3dfa8c21f Bulleted lists get 35px of additional left-margin and do not respect alignment at all. 2020-06-20 19:55:59 -04:00
David Wendt fa2da492a7 Allow ActionScript to control text field borders. 2020-06-20 19:55:58 -04:00
David Wendt 2aa7d9770f Draw a border around text if requested. 2020-06-20 19:55:58 -04:00
David Wendt 8628261dc8 Add a bunch of necessary fixes to default text formatting and HTML format extraction.
This also replaces the `edittext_html_defaults` test with a more robust test that checks the default format and global format of SWF-based, text, and HTML test vectors.
2020-06-20 19:55:57 -04:00
David Wendt 4f3d4c82fb For some reason, Flash does not respect `<br>` at all, so we won't, either.
It *does*, however, respect `<sbr>` (which does the exact same thing), as well as `\n` (which makes absolutely no sense in HTML, normally that would get stripped out).
2020-06-20 19:55:57 -04:00
David Wendt efc6236cb5 Treat the end of each paragraph as a newline. 2020-06-20 19:55:56 -04:00
David Wendt d5fc2709fc Don't use a slice to hold an index.
Fixes clippy on beta and nightly Rust.
2020-06-20 19:55:56 -04:00
David Wendt 58a039a6aa Nulls in font names are ignored. 2020-06-20 19:55:56 -04:00
David Wendt d8a38d06bb Collect font height, letter spacing and the kerning flag into a single `EvalParameters` structure. 2020-06-20 19:55:55 -04:00
David Wendt 1f6d6018dc Use a char pattern here for clippy's sake 2020-06-20 19:55:55 -04:00
David Wendt 1966ec5cb1 Implement `sbr` tags.
No, I don't know what they are either, but at least one movie exists which treats them like `br`, so we'll treat them like that, too.
2020-06-20 19:55:54 -04:00
David Wendt 9e56f10fd0 Approx the align and margins text by up to 3 pixels.
These tests currently have visual bugs in all cases, and measurement bugs in the justification case that require me to approx them.
2020-06-20 19:55:54 -04:00
David Wendt f746ac5539 Implement `justify`, mostly.
This implementation has a few bugs which appear to have something to do with alignment. It's not only justify, but justify is the only test that's flagged as failing.

If you look at the margins test, you'll see what I mean: right-aligned and justified text doesn't quite make it to the right edge of the box even though it should. I'm not sure why.

This also restricts text rounding further: `measure` now only rounds when wrapping text, since Flash Player appears to account for fractional pixels in all other cases.
2020-06-20 19:55:54 -04:00
David Wendt 670c4723e3 Add support for the `kerning` flag, which turns on and off the kerning information on fonts. 2020-06-20 19:55:53 -04:00
David Wendt 3c9a43ea72 Add a regression test for newlines.
This test includes tests for HTML newlines, which causes the XML parser in Ruffle to throw errors. Hence why it's currently ignored.
2020-06-20 19:55:53 -04:00
David Wendt 180ef3b423 Recognize `<br>` as a line break.
This code is currently unreachable as `<br>` will actually trigger an AVM1 error due to our overly-strict XML parser.
2020-06-20 19:55:52 -04:00
David Wendt 045a81e79e Implement `html` and `htmlText`... sort of.
There are several problems, first off:

1. I'm not entirely sure what I'm supposed to be changing on the text field when someone writes `html`.
2. We're using the XML parser for HTML (both `htmlText` and SWF tag parsing) which causes problems. Notably, `<br>` issues an AVM1 error (!!!) because the XML parser doesn't like unclosed tags.
3. Reading `htmlText` should not return the same HTML tree (at least, not until we implement stylesheets). It should instead regenerate an HTML tree from text spans.
2020-06-20 19:55:52 -04:00
David Wendt 2452124631 Break individual words at the start of lines that are too big to fit on the line. 2020-06-20 19:55:51 -04:00
David Wendt 6c44418b10 Add a test for tab_stops.
This test is currently inaccurate by up to 5 pixels, this is due to some behavior with really, really wide tabstops and word breaks that I don't entirely get yet.
2020-06-20 19:55:51 -04:00
David Wendt 2ad216cab4 Don't continue comparing tab stops after we find one that fits. 2020-06-20 19:55:50 -04:00
David Wendt b6c12b1e23 Use current font height times 2.7 as the natural tab stop, as that seems to match Flash... for now. 2020-06-20 19:55:50 -04:00
David Wendt 0e45dc12e9 Recompile the letter spacing test 'cause I spotted an errant `s` in the FLA 2020-06-20 19:55:49 -04:00
David Wendt 2caaa6875d Add support for explicit tabs and newlines. 2020-06-20 19:55:49 -04:00
David Wendt 153ab675e9 When aligning a line, actually consider all the boxes within the line. 2020-06-20 19:55:49 -04:00
David Wendt 3d094ed689 Add margins test.
This test is also approx'd to 1px due to the same issue where heights are off by one.
2020-06-20 19:55:48 -04:00
David Wendt db0398d2ee Left and right margins and indents should not be included in `textWidth`. 2020-06-20 19:55:48 -04:00
David Wendt 74d4c25133 Add a test for letter spacing.
This test is approximate because the 0.5px test is off by 1px in terms of height.
2020-06-20 19:55:47 -04:00
David Wendt 6ce7ecee78 Implement `letterSpacing`. 2020-06-20 19:55:47 -04:00
David Wendt 171954d5e4 Add `edittext_leading` test.
This test constructs a handful of text fields and measures them. Each field has 0, 5, or 15px of `leading` applied to it's text format.
2020-06-20 19:55:47 -04:00
David Wendt bbc73f1477 The `edittext_align` test now passes perfectly. 2020-06-20 19:55:46 -04:00
David Wendt 16da6d827c Line-leading is always applied at least once, even if there are no line breaks in the text field. 2020-06-20 19:55:46 -04:00
David Wendt 410fb3ab86 Don't round each line's leading. Instead, round at the end of the operation.
This was verified by visual comparison with Flash Player; lines of text appear to be shifted by half-pixels, while the script output is always still rounded down.
2020-06-20 19:55:45 -04:00
David Wendt 2858c09b6e Only apply leading adjustment on newlines.
This results in ALL height adjustments being off by 2px, regardless of leading or font size. Tantalizing!
2020-06-20 19:55:45 -04:00
David Wendt 2ab85c32e2 When wrapping text, measure the text including the trailing space (if present).
This matches Flash behavior, but breaks an existing test, which I've adjusted appropriately.
2020-06-20 19:55:44 -04:00
David Wendt c67bf0b6b7 Add approximate test of text field metrics during alignment.
This is an approximate text with a 1-pixel tolerance because our height is currently off by one and I cannot explain why. Previous attempts to fix the bug have resulted in cascading errors that resulted in off-by-one errors in the opposite direction. This is still better than nothing and I need to check other tests in.
2020-06-20 19:55:44 -04:00
David Wendt a1e52ab556 Add a test for formatting defaults on HTML text. 2020-06-20 19:55:44 -04:00
David Wendt 09c91d191a Round-trip tab stops between `EditText` and AVM1 2020-06-20 19:55:43 -04:00
David Wendt 00217072e6 After the previous set of fixes our tests are now consistent with a layout engine that always rounds down to the nearest pixel and never up. Adjust code to match. 2020-06-20 19:55:43 -04:00
David Wendt 06c66533c7 Don't apply leading twice. 2020-06-20 19:55:42 -04:00
David Wendt 82c6269cf6 Ensure that presentational markup styles cascade from parent tag to child, and from the default format to the first tag. 2020-06-20 19:55:42 -04:00
David Wendt 88d07f5d17 We don't need to relayout when the new-text text format gets changed. 2020-06-20 19:55:42 -04:00
David Wendt 9981148482 Add a test for `BoxBounds.with_size`, since we're using it now 2020-06-20 19:55:41 -04:00
David Wendt aae1f0ba7a Skip fixups on empty lines. 2020-06-20 19:55:41 -04:00
David Wendt bd40295076 Ensure that the font-provided leading is accounted for when moving the cursor for a newline. 2020-06-20 19:55:41 -04:00
David Wendt 0e0b2fb85d All layout boxes on the line should have trailing whitespace trimmed off of their measurements.
Flash has a weird bug where it will NOT trim trailing spaces off of the metrics reported to users if the text is left-aligned. We replicate this here so that tests pass.
2020-06-20 19:55:40 -04:00
David Wendt 50a05df998 Generated lines should *always* include their end spaces, there should be no gaps. 2020-06-20 19:55:40 -04:00
David Wendt ab2b9cc733 Change all of the `BoxBounds` in the layout machinery to not use `Default`.
The `Default` bounds are NOT safe to union against if they were uninitialized. Doing so will force any resulting layout box to enclose `(0,0)`, which can throw off certain layout calculations. Instead, we use `None` to signal an uninitialized box.
2020-06-20 19:55:40 -04:00
David Wendt 806a741bf4 EditText appears to have internal padding between it's borders equivalent to a CSS padding of `3px 4px 3px 0`.
Verified by experimentation with Flash Player, appears to be necessary for tests to pass.
2020-06-20 19:55:39 -04:00
David Wendt 96c43654d0 Retain the bounds returned when constructing layout boxes and use them as the `textWidth` and `textHeight` of a given text field. 2020-06-20 19:55:39 -04:00
David Wendt 318f09d241 Include the font-provided leading in the exterior bounds sent off for `autoSize` calculation. 2020-06-20 19:55:39 -04:00
David Wendt 06dc2f5fe0 Implement the `leading` attribute as defined by fonts.
`EditText` supports two different forms of leading:

1. Font-provided leading, specified relative to the EM square and scaled with font size
2. User-specificed leading, specified in pixels

Notably, the former appears to apply to the first line in the text and pushes it down. This showed up in the `edittext_font_size` test, and according to that test result the leading is rounded *up* to the nearest pixel, plus one.

That last bit seems possibly wrong and is subject to further change, but it matches the tests at multiple scales.
2020-06-20 19:55:29 -04:00
David Wendt 6e81f30a70 Round down to the nearest pixel when measuring text.
Certain text routines calculate text on the pixel grid, despite the fact that Flash ordinarily works in twips. There is probably a reason for this - my guess is to keep text wrapping stable across multiple pixel densities (e.g. low-res screens plus high-res print).
2020-06-20 19:53:42 -04:00
David Wendt 7a62a8e9ce Programmatically created text fields get a biased depth. 2020-06-20 19:53:34 -04:00
David Wendt 75aaa49169 Y coordinates should always be adjusted by Y coordinates. 2020-06-20 19:48:14 -04:00
David Wendt 245cea784f Running an `autoSize` on any text field should always synchronize the X coordinate between the bounding box and the base transform.
I don't know why, but this is necessary for the "NEW STUFF" box on homestarrunner.com's toons menu to position correctly. SOMEWHERE, we are performing some kind of operation that adjusts one of the two, but not the other, and I can't find out what.
2020-06-20 19:48:13 -04:00
David Wendt 5a2b74c5fc Setting a new matrix should also transform the bounds as well. 2020-06-20 19:48:13 -04:00
David Wendt e7e944ad76 Account for the width of glyphs when measuring text.
This fixes spaces at the start of text spans not being rendered, but also breaks center-align.

I also broke the font tests, so I had to rewrite them, which makes me question their value.
2020-06-20 19:48:13 -04:00
David Wendt 8a5a2bf7c7 When `Font.wrap_text` indicates that none of the line can fit, we should also refresh our width and offset and check if there's even more text to measure or not. 2020-06-20 19:48:12 -04:00
David Wendt efc50da367 `Font.wrap_text` should return `0` if no part of the string can fit within the requested bounds. 2020-06-20 19:48:12 -04:00
David Wendt 38d679ef29 `wrap_line` should take spaces into account when sizing lines. 2020-06-20 19:48:12 -04:00
David Wendt 85a3a845d9 Dynamic `EditText` bounds should go from `x` to `x+width`, not `x` to `x+height` (etc) 2020-06-20 19:48:12 -04:00
David Wendt bacbf06614 Setting the matrix of an `EditText` should scale it's bounds. 2020-06-20 19:48:12 -04:00
David Wendt 9564cbeda4 Use the new dynamic bounding box to calculate a width for word-wrapping, and update the new bounding box directly in autosize rather than hitting `DisplayObject` methods.
This also adjusts `DisplayObject` methods to use the bounds.
2020-06-20 19:48:11 -04:00
David Wendt a0477e7525 Adjust the layout code to properly align content with right margins, trailing spaces on lines, and lines wider than the bounds.
Right margins: Simple enough, we just need to subtract the right margin from the bounds when we calculate our alignment adjustment.

Trailing spaces: This is very tricky as we effectively have to remeasure the last box in the line when fixing it up. This also means LayoutContext has to hold the text itself so we can remeasure again...

Lines wider than bounds: If word wrap is disabled it is possible for a line to exceed the bounds of the box. In this case it will be left-aligned. Effectively, the align adjustment is clamped to positive values and we do that here too.
2020-06-20 19:48:11 -04:00
David Wendt 4eb2113a77 Setting positions and widths on the `EditText` should adjust intrinsic bounds rather than stretching or transforming the field. 2020-06-20 19:48:11 -04:00
David Wendt 7cf2cce3ef Add functions to set positions and widths on bounding boxes. 2020-06-20 19:48:10 -04:00
David Wendt dc46885021 Implement `autoSize`.
This doesn't work right yet because the resulting width doesn't apply correctly to the field. This is because `EditText`'s `_width` and `_height` change it's intrinsic bounds rather than it's X and Y scale (like it would with a button or a movie clip).
2020-06-20 19:48:00 -04:00
dependabot-preview[bot] 6928e75cd6 build(deps): bump syn from 1.0.31 to 1.0.32
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.31 to 1.0.32.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.31...1.0.32)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-20 16:36:01 -07:00
David Wendt 18e93b3d11 Implement tests for `wrap_line`.
These tests depend on the particulars of our default device font, Noto Sans. If this test proves to be fragile we may need to create a testing font with a locked width and kerning table...
2020-06-20 19:26:47 -04:00
David Wendt cb47e0bae8 `wrap_line` returns breakpoints relative to how we sliced the text, so we need to break things appropriately.
This prevents a bounds-check panic when we inevitably try to slice an array like `[300..2]` or something like that.

We also skip rendering the space that we're turning into a newline to avoid it popping up on the next line by accident.
2020-06-20 19:26:47 -04:00
David Wendt ece879a15c The align adjustment should be positive, not negative. 2020-06-20 19:26:47 -04:00
David Wendt 593f442372 Implement `leading` between lines 2020-06-20 19:26:47 -04:00
David Wendt e83cebc4fb Vertically align different-font-size boxes to the same bottom baseline. 2020-06-20 19:26:46 -04:00
David Wendt b517019b57 Clean up how we calculate the width of the text field.
`max_length` isn't a geometrical width, despite the fact that the type system didn't prevent me from making erroneous conversions. It's actually just a text length limit, which we won't be dealing with for some time.

When first instantiated, we use the static bounds; however, further relayouts grab `local_bounds` and calculate a width from that. `EditText` works almost identically to any other display object, with the exception that device fonts do not render if the transform is not an axis-aligned bounding box (and it doesn't respect scale). We don't have to worry about that for now.
2020-06-20 19:26:46 -04:00
David Wendt c7ac0e4bb1 Implement center and right alignment.
Justification will have to wait for another day.
2020-06-20 19:26:46 -04:00
David Wendt 562adcdc7e Implement `leftMargin`, `rightMargin`, `indent` and `blockIndent`.
This is surprisingly difficult because of how Flash handles these properties: they are cached at the start of a new line (explicit or flown) and then used for all spans that intersect with that line. Ergo, `LayoutContext` needs to keep track of all the boxes we generate within the line and the span that ultimately is going to provide margins for it.

And yet, at the same time, we also have to precalculate the effects of these margins when flowing text so that we know how much space we have to play with. This needs to be calculated the same at the start of the line as it is at the end. This is why `LayoutContext` is a separate type: it handles all the state tracking and crap that has to be done when splitting text into spans, paragraphs, and lines all at the same time.

Fortunately, this design will make it easier to implement other features like text alignment where we couldn't even begin to calculate everything in one pass.
2020-06-20 19:26:46 -04:00
David Wendt 5fcaa52687 Restore newline functionality (mostly...) 2020-06-20 19:26:45 -04:00
David Wendt 9f60567f66 Remove library lookup as layout can do it itself 2020-06-20 19:26:45 -04:00
David Wendt e3f59ac00f Implement `color` on spans 2020-06-20 19:26:45 -04:00
David Wendt 9bcc7ef0cc `setTextFormat` should trigger a relayout 2020-06-20 19:26:44 -04:00
David Wendt b5de92edeb Properly retrieve default font class 2020-06-20 19:26:44 -04:00
David Wendt c4e5a9afc2 In the spirit of shared-nothing `post_instantiation` should duplicate any `LayoutBox`es it has, in case we mutate them later. 2020-06-20 19:26:44 -04:00
David Wendt 467fd9db80 Implement `TextField.length` in AVM1. 2020-06-20 19:26:44 -04:00
David Wendt ef6ebe2b44 The default format of a text field should match it's SWF tag. 2020-06-20 19:26:43 -04:00
David Wendt 361ea1f774 Index fonts by font name, boldness, and italicization.
This involves a new struct called a `FontDescriptor` which is generated whenever a font is registered and used to index the font in the library. When a font is requested, it goes through the descriptor system to get found.
2020-06-20 19:26:43 -04:00
David Wendt f234926e63 Default text formats are not replaced when movies call `setNewTextFormat`, they instead mix with the existing one.
"Mixing" is defined as `Option.or`ing all the properties in the new text format with the old one. Not specifying a text format in the new default will result in the field retaining it's old properties.
2020-06-20 19:26:43 -04:00
David Wendt 0aab45f389 Fix panic in `render_layout_box` caused by indexing an already-indexed slice. 2020-06-20 19:26:42 -04:00
David Wendt 3b80ff8d23 Clippy compliance 2020-06-20 19:26:42 -04:00
David Wendt fde5e13358 Expose `replaceText` to AVM1 code. 2020-06-20 19:26:42 -04:00
David Wendt a8a1b985a3 Expose `getTextFormat` and `setTextFormat` to AVM1. 2020-06-20 19:26:41 -04:00
David Wendt 74912525ed Add ancestor iteration to XML nodes. 2020-06-20 19:26:41 -04:00
David Wendt a2836a0b92 Tie `EditText` into the new layout system, which is currently unfinished.
This should *significantly* regress `EditText` layout.
2020-06-20 19:26:37 -04:00
David Wendt 8622cb97a9 Add a system of layout boxes to store text layout decisions made at update time. 2020-06-20 19:16:17 -04:00
David Wendt 4a2fac28d1 Add iterator for text spans 2020-06-20 19:16:17 -04:00
David Wendt ec72ac518c Allow HTML text nodes to populate text.
This will need to be updated to handle line breaks, spaces, and so on correctly - the way whitespace works in HTML differs from plain text.
2020-06-20 19:16:17 -04:00
David Wendt 816644c497 Add an internal implementation of `replaceText`. 2020-06-20 19:16:17 -04:00
David Wendt a1f548f744 Add a routine to generate `TextFormat`s from presentational markup, and another lowering process which tracks the text formats generated by this process. 2020-06-20 19:16:16 -04:00
David Wendt 62a13cd7a6 Add the ability to `walk` through an XML tree.
This yields nodes as `Step`s. This allows keeping track of the structure of the tree as you walk through descendents, as each element will be yielded twice: both as a `Step::In` *and* as a `Step::Out`. Non-element nodes will be yielded once as a `Step::Around`.

I'm adding `walk` iteration specifically to avoid having to write certain methods recursively. Existing recursive callers of `children` should probably be updated to `walk` the tree and maintain a separate `Vec` stack.
2020-06-20 19:16:16 -04:00
David Wendt 4eca2d4bdd Replace the existing default format on `EditText` with our brand-new `FormatSpans`.
This also includes code to automatically populate the default format with data from the SWF tag.
2020-06-20 19:16:16 -04:00
David Wendt efdecdea64 Store the default text format, and use it when generating new spans during normalization.
I'm sure this will wind up having further uses eventually.
2020-06-20 19:16:15 -04:00
David Wendt 153571c0c4 Implement `FormatSpans::set_text_format`.
This also necessitated the addition of code to:

 * Ensure span breaks exist at both sides of the text boundary, without creating degenerate (length-0) spans
  * Consolidate spans with matching text formats
  * Shorten or lengthen the total list of text spans to match the backing string
  * Ensure at least one text span exists at all times

This still has some minor to-dos: for example, it relies on the default `TextSpan` formatting, which probably should be replaced with actually accepting or storing a default format to be used when constructing new text spans.
2020-06-20 19:16:15 -04:00
David Wendt 102c494de4 Add a type to hold text with some text spans, and some tests for that type. 2020-06-20 19:16:14 -04:00
David Wendt 1671fc6eba Add an internal representation of text spans.
Despite having HTML and CSS rendering capabilities, the Flash text field actually does not use HTML as it's internal representation. Instead, the text-span format implied by `getTextFormat` and `setTextFormat` is used to drive layout. You can see this by watching what happens to `htmlText`, *especially* when you add and remove stylesheets.

The `LayoutBox` machinery will be adapted to consume text spans in a future commit. This would make the entire rendering pipeline: HTML/CSS -> Text Spans -> Layout Boxes -> Render commands.
2020-06-20 19:16:14 -04:00
David Wendt 850831181c Add tests for all non-trivial methods of `Position`, `Size`, and `BoxBounds`. 2020-06-20 19:16:13 -04:00
David Wendt ef035c5283 Add `Size.max`, conversions between `Position` and `Size`, `BoxBounds.extent`, and `BoxBounds.with_size`. 2020-06-20 19:16:13 -04:00
David Wendt e7c34d9745 Switch `BoxBounds` from a position-and-size representation to an offset-and-extent representation.
This makes the implementation of rectangle union (`Add`/`AddAssign`) far easier as we just compute the min and max of the offset and extent coordinates. It also makes the conversion into and from `swf::Rectangle` easier as it's now effectively a generic version of that datatype.

On the other hand, `width`, `height`, and `size` now have to be calculated, and require `T` to be self-`Sub`. I'm not sure if this is that much of a problem or not.
2020-06-20 19:16:12 -04:00
David Wendt 0a1de3276f Add extra types for indicating moving a position and resizing a box. 2020-06-20 19:16:12 -04:00
David Wendt a4c8cd4711 Add a set of types for tracking CSS attributes, positions, sizes, and bounds on layout boxes. 2020-06-20 19:16:12 -04:00
David Wendt 4739e08c11 Add the ability to split lines from the middle of an already-existing flow operation 2020-06-20 19:16:12 -04:00
David Wendt 7e7ca88c3d `post_instantiate` is morally equivalent to duplicating the display object it's called on, so we should also duplicate the XML document attached to it.
We don't have to do this for `object` because we don't actually construct the script object until instantiation time.
2020-06-20 19:16:11 -04:00
David Wendt a3f4509d63 Store all text internally as an HTML tree, alongside the existing strings.
We're reusing the XML machinery to handle HTML - this is probably not 100% correct, but writing a new HTML parser to cover just `EditText` will be rather complicated.
2020-06-20 19:16:11 -04:00
David Wendt cc854db9b3 Derive `Collect` on `EditTextData`. 2020-06-20 19:16:10 -04:00
David Wendt ac9cd0cf87 Move `TextFormat` over to a new `html` module, which will hold all the stuff necessary for rendering HTML in an `EditText`.
`TextFormat` is owned data and should be collectable as static.
2020-06-20 19:16:10 -04:00
Nathan Adams 2e7ebbf258 avm1: Fatal errors will halt the AVM and prevent further execution 2020-06-20 15:02:00 -07:00
Nathan Adams f5da954b32 avm1: Merge avm1::Error and avm1::ExecutionError for now. It's plausible that nested inside actions we can encounter an ExecutionError, so at that point it doesn't make sense to have a separation. 2020-06-20 15:02:00 -07:00
Nathan Adams e2c607c70f avm1: Avm1::retire_stack_frame can't error, so adjust its signature appropriately 2020-06-20 15:02:00 -07:00
Nathan Adams a36e2105a3 avm1: Made avm1::Error an actual error type, and removed all calls that throw incorrect errors in avm1 2020-06-20 15:02:00 -07:00
Nathan Adams ad07520af3 avm1: Add avm1::ExecutionError 2020-06-20 15:02:00 -07:00
Nathan Adams adb8ffbf9c core: Convert XML errors into an enum 2020-06-20 15:02:00 -07:00
Nathan Adams 59ccd75518 core: Rename loader::LoaderError to loader::Error 2020-06-20 15:02:00 -07:00
Nathan Adams b6f012cf7f core: Use thiserror to derive Loader errors 2020-06-20 15:02:00 -07:00
Nathan Adams 0f1eef9022 core: Introduce LoaderError to all Loader methods 2020-06-20 15:02:00 -07:00
Nathan Adams c8f0753da4 core: Rename Value::as_number to Value::coerce_to_f64 2020-06-19 12:48:28 -07:00
Nathan Adams 67042b255c core: Replace Value::as_* numeric methods in favour of coerce_to_* or manual matching 2020-06-19 12:48:28 -07:00
Nathan Adams 270f63b2f3 core: Made Object::to_string return a Cow<str> 2020-06-19 12:48:28 -07:00
Nathan Adams f4b4d0ebb7 core: Replace Value::into_string in favour of coerce_to_string or manual matching 2020-06-19 12:48:28 -07:00
Nathan Adams 5662b2d4d9 core: Make Value::coerce_to_string return a Cow<str>` 2020-06-19 12:48:28 -07:00
Nathan Adams 9633dc71c3 core: Replace Value::as_string in favour of coerce_to_string or manual matching 2020-06-19 12:48:28 -07:00
Nathan Adams e44568c31c core: Remove Value::call_method, you must box the value first 2020-06-19 12:48:28 -07:00
Nathan Adams 5dd1a1e509 core: Remove Value::get, you must box the value first 2020-06-19 12:48:28 -07:00
Nathan Adams fc18c2fce5 core: Rename Value::as_object to Value::coerce_to_object 2020-06-19 12:48:28 -07:00
Nathan Adams b2b57c1540 core: Make Value::as_object always return a (possibly boxed) object 2020-06-19 12:48:28 -07:00
Nathan Adams 3695c3c9fa tests: Add test for default names of display objects 2020-06-18 16:26:36 -07:00
Mike Welsh 62cfeb3754 core: Assign default name to unnamed clips (fix #66) 2020-06-18 16:26:36 -07:00
Nathan Adams 25ad2a428d tests: Improve attach_movie test to prove when the first frame is executed 2020-06-17 14:16:38 -07:00
Mike Welsh 83feeefeeb audio: Don't panic on unimplemented codecs
Remove `unimplemented` calls when encountring unsupported codecs
such as Nellymoser. Instead, return an Error that can be
gracefully handled.
2020-06-17 12:14:08 -07:00
Mike Welsh 1d7e6b7e8a chore: Fix let-unit-value clippy lint 2020-06-17 11:25:06 -07:00
Mike Welsh 77cb186357 avm1: Constructors queue to run after a goto
If a class is registered to a clip that is placed on the timeline
during a goto, that constructor should run after the frame is
completely constructed. In order to tell whether to run the
constructor immediately, add a parameter to `post_instantiation`
to indicate if the clip is instantiated from the AVM or via a
standard timeline seek.
2020-06-16 14:53:44 -07:00
Mike Welsh 568d0513ed tests: register_and_init_order tests for constructor after goto 2020-06-16 14:53:44 -07:00
Nathan Adams 5efab4c579 core: Implement RGB15 PNGs - fixes #724 2020-06-16 14:53:19 -07:00
dependabot-preview[bot] fcea6012bb build(deps): bump png from 0.16.4 to 0.16.5
Bumps [png](https://github.com/image-rs/image-png) from 0.16.4 to 0.16.5.
- [Release notes](https://github.com/image-rs/image-png/releases)
- [Changelog](https://github.com/image-rs/image-png/blob/master/CHANGES.md)
- [Commits](https://github.com/image-rs/image-png/compare/v0.16.4...v0.16.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-13 18:52:24 -07:00
Mike Welsh 5da9863402 tests: Add test for #710 2020-06-13 02:48:38 -07:00
Mike Welsh 35a4c05923 avm1: CallFunction can resolve variable paths 2020-06-13 02:48:38 -07:00
Mike Welsh 29dc88ec01 tests: Clip event test now tests for children unloading
The test now verifies that a child movie clip runs its `unload`
clip event if its parent is removed.
2020-06-11 23:39:16 -07:00
Mike Welsh ce73b4eaa7 core: Recursively unload child display objects
Child movie clips should run their unload actions when the parent
is removed.
2020-06-11 23:39:16 -07:00
Mike Welsh 9b0881edb7 core: Set $version on root
_root has a $version property that should matches
`System.capabilites.version`. This allows Nanaca Crash to boot.
2020-06-11 10:03:29 -07:00
Mike Welsh faa35a53e9 tests: Add test for getBounds with empty children 2020-06-10 17:17:08 -07:00
Mike Welsh b5daf3d020 core: Fix BoundingBox::union for invalid bounds 2020-06-10 17:17:08 -07:00
dependabot-preview[bot] f03e75951a build(deps): bump syn from 1.0.30 to 1.0.31
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.30 to 1.0.31.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.30...1.0.31)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-09 22:14:57 -07:00
CUB3D fa11ef1e81 core: Add remaining capabilities 2020-06-09 23:57:46 +01:00
CUB3D dd5d2976ea core: Add missing functions to System.security 2020-06-09 23:03:13 +01:00
CUB3D 07d4f3a8eb core: Fix build 2020-06-09 22:41:11 +01:00
CUB3D ad3bc612aa chore: Fix clippy lints 2020-06-09 22:41:11 +01:00
CUB3D 4987cfdaac core: Refactor enums, Add unknown windows os support and fix attributes
Now using Display to convert enums.
Also added support for a fallback "Windows" os for when the current version can't be detected
2020-06-09 22:41:11 +01:00
CUB3D 48bef91917 core: Remove clear_clipboard, format and fix tests 2020-06-09 22:41:11 +01:00
CUB3D bc1055e381 core: Create system protos in globals.rs, fix version-dependant output
Make get_server_string output order match flash, also make language and manufacturer output respect emulated player version
2020-06-09 22:41:11 +01:00
CUB3D de013426bc core: Url encode serverString 2020-06-09 22:41:11 +01:00
CUB3D 887e09337f core: Add dummy impl of System.security 2020-06-09 22:41:11 +01:00
CUB3D fc8cd1139a core: Add initial System.IME implementation 2020-06-09 22:41:11 +01:00
CUB3D 94a53f3506 core: Store System.capabilities in SystemProperties 2020-06-09 22:41:11 +01:00
CUB3D af41ac5602 core: Add clipboard support to input backend 2020-06-09 22:41:11 +01:00
CUB3D 0f0f778830 core: Retain properties for System in the player 2020-06-09 22:41:11 +01:00
CUB3D 8471523e49 core: Add basic System.capabilities implementation 2020-06-09 22:41:11 +01:00
CUB3D 50abbe1887 core: Implement basic System global 2020-06-09 22:41:10 +01:00
Nathan Adams 58df56e4a4 core: Add `Value::get` shortcut that resolves Objects or returns Undefined 2020-06-08 15:12:05 -07:00
Nathan Adams d0ad1b57fe core: Replace `toString`/`valueOf` calls with `call_method` 2020-06-08 15:12:05 -07:00
Nathan Adams c592b5fb2a core: `Value::call_method` no longer requires you to resolve after calling it 2020-06-08 15:12:05 -07:00
Nathan Adams d39ffcfadc core: `Value::call` no longer requires you to resolve after calling it 2020-06-08 15:12:05 -07:00
Nathan Adams fe55c5a264 core: `TObject::call_method` no longer requires you to resolve after calling it 2020-06-08 15:12:05 -07:00
Nathan Adams da3e2bb0a0 core: `TObject::call` no longer requires you to resolve after calling it 2020-06-08 15:12:05 -07:00
Nathan Adams 26590d4c63 core: `TObject::get_local` no longer requires you to resolve after retrieving it 2020-06-08 15:12:05 -07:00
Nathan Adams a121a3a4d0 core: `TObject::get` no longer requires you to resolve after retrieving it 2020-06-08 15:12:05 -07:00
dependabot-preview[bot] 36fb0cd43c build(deps): bump quote from 1.0.6 to 1.0.7
Bumps [quote](https://github.com/dtolnay/quote) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.6...1.0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-07 17:17:32 -07:00
Mike Welsh 359df6860f tests: Add String.charCodeAt tests
Tests the fix provided in #634.
2020-06-04 16:02:55 -07:00
Nathan Adams 34cf21289b avm1: Fixed some missing behaviours with flash.geom.Rectangle 2020-06-02 18:49:01 -07:00
Nathan Adams f5765f2bac avm1: Implement all of flash.geom.Rectangle + tests (#305) 2020-06-02 18:49:01 -07:00
Nathan Adams 226a97ef4b core: Don't panic on `new DoesntExist()` 2020-06-02 18:49:01 -07:00
dependabot-preview[bot] 4b22fc723d build(deps): bump indexmap from 1.3.2 to 1.4.0
Bumps [indexmap](https://github.com/bluss/indexmap) from 1.3.2 to 1.4.0.
- [Release notes](https://github.com/bluss/indexmap/releases)
- [Commits](https://github.com/bluss/indexmap/compare/1.3.2...1.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-01 13:42:08 -07:00
dependabot-preview[bot] cf4df4058f build(deps): bump png from 0.16.3 to 0.16.4
Bumps [png](https://github.com/image-rs/image-png) from 0.16.3 to 0.16.4.
- [Release notes](https://github.com/image-rs/image-png/releases)
- [Changelog](https://github.com/image-rs/image-png/blob/master/CHANGES.md)
- [Commits](https://github.com/image-rs/image-png/compare/v0.16.3...v0.16.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-01 12:23:21 -07:00
dependabot-preview[bot] 078c64c201 build(deps): bump syn from 1.0.28 to 1.0.30
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.28 to 1.0.30.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.28...1.0.30)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-01 12:19:30 -07:00
dependabot-preview[bot] 0e7b0f8467 build(deps): bump libflate from 1.0.0 to 1.0.1
Bumps [libflate](https://github.com/sile/libflate) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/sile/libflate/releases)
- [Commits](https://github.com/sile/libflate/compare/1.0.0...1.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-01 11:24:15 -07:00
Nathan Adams 0d53f0a952 chore: Fix new clippy lint about short variable names - fixes #668 2020-06-01 10:31:46 -07:00
Mike Welsh 3a8c705e95 chore: Fix clippy lints 2020-05-30 03:47:12 -07:00
Nathan Adams 4c1ce6d765 core: Print swf version on startup, and warn when we run into avm2 2020-05-30 02:48:54 -07:00
dependabot-preview[bot] c0593ce081 build(deps): bump syn from 1.0.27 to 1.0.28
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.27 to 1.0.28.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.27...1.0.28)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-29 09:49:49 -07:00
dependabot-preview[bot] 97f69e8ed2 build(deps): bump syn from 1.0.25 to 1.0.27
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.25 to 1.0.27.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.25...1.0.27)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-27 07:24:00 +00:00
Nathan Adams ddf2aa3ec1 avm1: Implement all of flash.geom.Point (#304) 2020-05-27 00:23:45 -07:00
Nathan Adams 2e25fec099 tests: Add test coverage for flash.geom.Point 2020-05-27 00:23:45 -07:00
Nathan Adams df6764a69c chore: Add license metadata to all packages & crates 2020-05-27 00:11:02 -07:00
dependabot-preview[bot] 458ca2a478 build(deps): bump syn from 1.0.24 to 1.0.25
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.24 to 1.0.25.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.24...1.0.25)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-25 20:36:01 +00:00
CUB3D 590321133f core: Fix incorrect String.charCodeAt bounds check (close #633) 2020-05-25 13:35:41 -07:00
dependabot-preview[bot] 4712446314 build(deps): bump syn from 1.0.23 to 1.0.24
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.23 to 1.0.24.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.23...1.0.24)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-25 01:42:44 +00:00
Mike Welsh 993421e732 core: Children run an initial frame when changing button states
There was a one-frame-off flicker when a button changed states.
Now children will tick a frame so that they are properly created
immediately when the parent button changes state.
2020-05-24 08:57:30 -07:00
Mike Welsh 932ad30570 core: Flatten ClipActions into a single event per action
Previously a MovieClip's clip action would have a set of events
that would trigger it. Now we flatten these out into a single
event per action, because this is by far the common case. If an
action does happen to have >1 event, it will be duplicated for each.
2020-05-24 08:57:30 -07:00
Mike Welsh c427d55dbb core: Clean up clip event handlers
Remove ButtonEvent and subsume it in ClipEvent. Player now tosses
ClipEvents down the display tree, cleaning up some of the event code.
2020-05-24 08:57:30 -07:00
Mike Welsh 6929cea996 core: Implement button event handlers for movie clips 2020-05-24 08:57:30 -07:00
Mike Welsh 09ca11f788 webgl: Implement linear RGB gradients 2020-05-22 11:03:16 -07:00
Mike Welsh 97db518fb1
core: First pass of drawing API (merge #611) 2020-05-22 08:54:55 -07:00
Nathan Adams 3346accb9c core: More accurate shape_bounds/edge_bounds in drawing api 2020-05-21 20:34:48 +02:00
Nathan Adams 62a1914c3e core: BoundingBox::encompass should properly convert invalid BBs to valid BBs.
This means that encompassing 100,100 on an invalid BB should create a BB of 100,100-100,100, and not 0,0-100,100
2020-05-21 20:19:26 +02:00
Nathan Adams 279c07d9b8 core: Update drawings on render instead of on tick 2020-05-21 18:38:10 +02:00
Nathan Adams 55215273e8 core: Stretch edge & shape bounds separately and avoid a clone, in rendering api 2020-05-21 18:38:10 +02:00
Nathan Adams 04690581ba core: Refactor common code in drawing api 2020-05-21 18:38:10 +02:00
Nathan Adams 1f8abc92fd core: Keep track of cursor position in drawings 2020-05-21 18:38:10 +02:00
Nathan Adams 99574cfa72 core: Move drawing api out from `movie_clip` into `drawing` 2020-05-21 18:38:10 +02:00
Nathan Adams 4f69566f77 tests: Add test coverage for flash.geom.Matrix 2020-05-21 18:38:08 +02:00
dependabot-preview[bot] 898232394b build(deps): bump syn from 1.0.22 to 1.0.23
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.22 to 1.0.23.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.22...1.0.23)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-21 03:49:03 +00:00
Nathan Adams 31b0a5ae76 avm1: Implement gradient matrix types 2020-05-20 14:54:41 +02:00
Nathan Adams 5098eb079d avm1: Implement most of flash.geom.Matrix (#303) 2020-05-20 14:54:41 +02:00
Nathan Adams 14331da71b avm1: Add flash.geom.Matrix and methods to convert between this and swf::Matrix 2020-05-20 14:54:41 +02:00
Nathan Adams eda862c719 swf: Merged core::Matrix into swf::Matrix 2020-05-20 14:54:41 +02:00
Nathan Adams 61e464099c core: Add initial drawing API to MovieClip 2020-05-20 14:54:40 +02:00
Nathan Adams 7ab6703fc9 render: Add RenderBackend::replace_shape method 2020-05-20 14:54:40 +02:00
Nathan Adams 4c80ae150c core: Make DistilledShape use Boundingbox and not Rectangle
Rectangle more represents compressed swf data and isn't suited for performing operations, and the drawing api will be generating these dynamically
2020-05-20 14:54:33 +02:00
Nathan Adams f7b5f14f65 core: Make RenderBack::register_bitmap* methods return a Result (fixes #531) 2020-05-19 07:12:36 -07:00
dependabot-preview[bot] 6134ae091f build(deps): bump generational-arena from 0.2.7 to 0.2.8
Bumps [generational-arena](https://github.com/fitzgen/generational-arena) from 0.2.7 to 0.2.8.
- [Release notes](https://github.com/fitzgen/generational-arena/releases)
- [Changelog](https://github.com/fitzgen/generational-arena/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fitzgen/generational-arena/compare/0.2.7...0.2.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-18 23:54:45 -07:00
dependabot-preview[bot] 41a8b01fe7 build(deps): bump quote from 1.0.5 to 1.0.6
Bumps [quote](https://github.com/dtolnay/quote) from 1.0.5 to 1.0.6.
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.5...1.0.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-18 08:38:24 +00:00
dependabot-preview[bot] 3b163c2b6e build(deps): bump syn from 1.0.21 to 1.0.22
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.21 to 1.0.22.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.21...1.0.22)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-16 09:46:08 +00:00
dependabot-preview[bot] 1f0e695465 build(deps): bump fnv from 1.0.6 to 1.0.7
Bumps [fnv](https://github.com/servo/rust-fnv) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/servo/rust-fnv/releases)
- [Commits](https://github.com/servo/rust-fnv/compare/v1.0.6...v1.0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 19:05:48 +00:00
dependabot-preview[bot] 1641d05d00 build(deps): bump syn from 1.0.20 to 1.0.21
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.20 to 1.0.21.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.20...1.0.21)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-13 17:18:29 +00:00
dependabot-preview[bot] e22da9ac4c build(deps): bump quote from 1.0.4 to 1.0.5
Bumps [quote](https://github.com/dtolnay/quote) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.4...1.0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-13 14:42:48 +00:00
Mike Welsh 031f5d6501 core: Avoid undefined behavior in f64_to_wrapping functions 2020-05-13 02:41:50 -07:00
Mike Welsh b59140ee01 render: Add support for GIF decoding in DefineBitsJPEG tags 2020-05-13 00:15:09 -07:00
Mike Welsh 5d84d33710 render: Handle PNG data in DefineBitsJPEG tags (fix #530) 2020-05-13 00:15:09 -07:00
dependabot-preview[bot] f68edb37b5 build(deps): bump syn from 1.0.19 to 1.0.20
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.19 to 1.0.20.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.19...1.0.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-12 00:10:19 -07:00
Nathan Adams b82b869950 core: Don't panic when NullNavigatorBackend can't do futures 2020-05-11 01:09:07 -07:00
Nathan Adams 2343074c56 core: Make RenderBackend downcastable 2020-05-11 01:09:07 -07:00
Nathan Adams edcd1e6d65 core: Add keyboard shortcut to dump every variable (ctrl+alt+V, same as Flash Player) 2020-05-10 23:39:54 -07:00
Nathan Adams c787e28fcd render: Introduce a DistilledShape and use that instead of swf::Shape for the rendering API 2020-05-10 22:03:56 -07:00
Nathan Adams 5767fb1772 swf: Added utility method for `Color::from_rgb(rgb, alpha)` 2020-05-10 22:03:56 -07:00
Nathan Adams 601715aa19 render: Merge begin_frame and clear as they're always called together 2020-05-10 22:03:56 -07:00
dependabot-preview[bot] 60ca1da468 build(deps): bump syn from 1.0.18 to 1.0.19
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.18 to 1.0.19.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.18...1.0.19)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-11 03:12:14 +00:00
Nathan Adams 054e6f1ac6 chore: Fix new rust check lint about std::mem::replace 2020-05-10 03:29:25 -07:00
Nathan Adams bac99368be chore: Fix new clippy lints about cloning 2020-05-10 03:29:25 -07:00
dependabot-preview[bot] a81adfa336 build(deps): bump num_enum from 0.4.3 to 0.5.0
Bumps [num_enum](https://github.com/illicitonion/num_enum) from 0.4.3 to 0.5.0.
- [Release notes](https://github.com/illicitonion/num_enum/releases)
- [Commits](https://github.com/illicitonion/num_enum/compare/0.4.3...0.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-10 10:27:38 +00:00
dependabot-preview[bot] 08a786a213 build(deps): bump libflate from 0.1.27 to 1.0.0
Bumps [libflate](https://github.com/sile/libflate) from 0.1.27 to 1.0.0.
- [Release notes](https://github.com/sile/libflate/releases)
- [Commits](https://github.com/sile/libflate/compare/0.1.27...1.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-05 08:12:26 +00:00
Nathan Adams 47a44a5fe8 desktop: Prime window with known width/height of the movie 2020-05-04 16:07:38 -07:00
Nathan Adams 51d9f3ef36 core: Change Player::new to take in a SwfMovie, not &[u8] 2020-05-04 16:07:38 -07:00
Nathan Adams 84f6b4d06e core: Set init_object values after prototype but before constructor 2020-05-03 12:46:55 -07:00
Nathan Adams 96d1f8fd30 tests: Add test for order of init_object vs constructor when attaching movies 2020-05-03 12:46:55 -07:00
Nathan Adams 0152f384ea core: Run any on(construct) events at the appropriate time 2020-05-03 12:46:55 -07:00
Nathan Adams 2b9219e8f9 tests: Add test for undocumented on(construct) property (note: this swf is hand-crafted) 2020-05-03 12:46:55 -07:00
Mike Welsh f09bd8c079 core: Clean up tick/render loop
Don't call `render` from `Player::tick`; instead, require the
frontends to explicitly call `render` when they wish to redraw.
The frontend can query `Player::needs_render` to see if the stage
is dirty and needs a redraw. Update desktop and web to use this
new method.

This fits better with the newer winit event loop model, which
requires explicitly calling `request_redraw`, and should avoid
spurious renders.
2020-05-02 04:25:21 -07:00
Mike Welsh 6339c74d67
render: Add wgpu backend (merge #527)
Adds a wgpu-rs render backend.
2020-05-02 03:42:05 -07:00
Nathan Adams 8384847084 avm1: Deleting on a non-object is a silent failure & warning, not a hard error 2020-04-30 14:18:54 -07:00
dependabot-preview[bot] 04660a9540 build(deps): bump quote from 1.0.3 to 1.0.4
Bumps [quote](https://github.com/dtolnay/quote) from 1.0.3 to 1.0.4.
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.3...1.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-30 21:18:17 +00:00
Nathan Adams 99d15aef0d render: Cache color transforms in wgpu backend, don't re-upload unchanged values 2020-04-30 16:33:41 +02:00
dependabot-preview[bot] 014df249a8 build(deps): bump jpeg-decoder from 0.1.18 to 0.1.19
Bumps [jpeg-decoder](https://github.com/image-rs/jpeg-decoder) from 0.1.18 to 0.1.19.
- [Release notes](https://github.com/image-rs/jpeg-decoder/releases)
- [Changelog](https://github.com/image-rs/jpeg-decoder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/image-rs/jpeg-decoder/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-28 04:54:23 +00:00
Mike Welsh 8aa12d181f render: Remove RenderBackend::draw_pause_overlay 2020-04-27 04:45:53 -07:00
David Wendt ed29b1c3bb It turns out Macromedia just used an undocumented but user-modifiable property called `__constructor__` to store the constructor.
A previous version of this PR (whose history has been scrubbed, but go check 918d88abe68b7467a4194738b95e5bf3e9b5bb72 if you're curious) implemented a new `TObject` property which basically every line of code that dealt with object construction had to populate. It was terrible.
2020-04-25 14:37:24 -04:00
David Wendt bb879870ec Add test for the constructor property on v6 and v7 SWFs 2020-04-25 13:25:21 -04:00
Nathan Adams b3322acc8c tests: Copy as2_super_and_this test for manual prototype setting, used by mx (currently broken) 2020-04-25 13:25:20 -04:00
David Wendt aaa6f481ac Add a v6 version of the super-and-this test, which is exactly the same source compiled to SWF version 6. 2020-04-25 13:25:20 -04:00
David Wendt 17d96a0fa6 Constructing a new object sets `constructor` on that object for SWFv6 and lower. 2020-04-25 13:25:20 -04:00
David Wendt b8fd1eac9c Invoke virtual setters defined in the prototype chain.
This is accomplished via two new `TObject` methods: `has_own_virtual` and `call_setter`. If an object does not contain it's own version of a property, it will first crawl the prototype chain to see if there is an overwritable virtual. If so, it will invoke that prototype's setter.

A bit of borrow finangling was required to do this; `super` now no longer caches it's proto and constr values and instead dynamically constructs them. This also means it can't be downcasted to `Executable` anymore.

With this commit, virtual setters and super-setters now work correctly.
2020-04-25 13:25:19 -04:00
David Wendt 35197f889f `Property.set` should return a `ReturnValue` as it can potentially execute AVM code 2020-04-25 13:25:19 -04:00
David Wendt e76ba4de87 Method calls on `super` objects should substitute the child object instead of itself as `this`. 2020-04-25 13:25:19 -04:00
David Wendt 869cbd17da Extend `as2_super_and_this` to cover accessing object properties in super-methods, super-getters, and super-setters. 2020-04-25 13:25:18 -04:00
David Wendt 9c5cd79e2c Refactor how `SuperObject` works to use `base_proto` and avoid handing copies of itself as `this`.
This allows supercalled functions to properly read and mutate the object they were called on.
2020-04-25 13:25:18 -04:00
David Wendt f3b3db51cb Alter AVM1 to keep track of each function call's *base prototype*: the object from which a particular function was retrieved from.
A base prototype is only applicable in cases where a method is being called as a property on an object. Bare function calls, `apply`/`call` calls, and so on do not generate a base prototype.

We also add a convenience method, `call_method`, to all objects. This method automatically calculates the correct base prototype for a method call on an object, which is the only operation that should generate base prototypes.
2020-04-25 13:25:18 -04:00
David Wendt 15a19f4cf8 Add test from @Dinnerbone that checks to make sure super-called functions can still initialize the object they are a part of. 2020-04-25 13:25:17 -04:00
dependabot-preview[bot] c5a8402eae build(deps): bump syn from 1.0.17 to 1.0.18
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.17 to 1.0.18.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.17...1.0.18)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-25 10:19:18 +00:00
Mike Welsh fd114959f9 core: Fix regressions from init order changes in #498
Revert to the old action queue method of popping off actions in a
loop, as new actions can be queued while iterating. Store proto
changes in a separate queue to maintain the high priority behavior.
2020-04-25 03:06:54 -07:00
Mike Welsh bad34c4d8f tests: Fix tests for regressions caused by #498
Changes to the action queue caused actions queued during other
actions to run too late. These regressions weren't caught by the
tests because many of the goto tests ran for more frames than was
necessary, allowing the late actions to still run.
2020-04-25 03:06:54 -07:00
Mike Welsh c1dc69c6b7 chore: rustfmt 2020-04-24 22:16:16 -07:00
dependabot-preview[bot] 24a26541a3 build(deps): bump smallvec from 1.3.0 to 1.4.0
Bumps [smallvec](https://github.com/servo/rust-smallvec) from 1.3.0 to 1.4.0.
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.3.0...v1.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-24 12:20:39 +00:00
Nathan Adams b43d0c2430 core: Pass SwfMovies along to empty movie clips 2020-04-21 05:49:25 -07:00
Nathan Adams a673e7108d tests: Add test for movieclip.createEmptyMovieClip().attachMovie()` 2020-04-21 05:49:25 -07:00
Nathan Adams 8b34fbdd81 chore: Removed debug code from a test 2020-04-21 05:48:17 -07:00
Nathan Adams 330e6b40f0 core: post_instantiation should happen after properties are set, but before first frame or actions 2020-04-17 23:48:58 -07:00
Nathan Adams 9318290336 core: Execute init actions immediately, do not queue them up
Clip initializers can and will influence how the next clips are loaded, and must execute before that

This fixes #418
2020-04-17 23:48:58 -07:00
Nathan Adams fe6b79a9b7 chore: Make avm1 accessible to MovieClip::preload 2020-04-17 23:48:58 -07:00
Nathan Adams 46d31548b0 chore: Move MovieClipData::do_init_action to MovieClip::do_init_action
No functional changes, just replaces `self` with `self.0.read()` and removed `self_display_object` argument
2020-04-17 23:48:58 -07:00
Nathan Adams c0d1dec7dd chore: Move MovieClipData::preload to MovieClip::preload
No functional changes, just replaced `self` with `self.0.read/write`.
2020-04-17 23:48:58 -07:00
Nathan Adams 601fcbfebd core: Queue up changes of movieclip prototypes, don't execute it immediately (but at a higher priority than normal actions) 2020-04-17 23:48:58 -07:00
Nathan Adams 6b48e77b61 avm1: Add TObject::set_proto 2020-04-17 23:48:58 -07:00
Nathan Adams 6316d7e0b3 tests: Add (currently failing) test for init order when combined with register_class 2020-04-17 23:48:58 -07:00
Nathan Adams d0fd26a89c avm1: Fix panic with [].unshift(x) 2020-04-17 21:17:13 -07:00
Nathan Adams bf639e1802 avm1: Don't crash when enumerating non-objects, it's a silent fail 2020-04-15 05:26:09 -07:00
Mike Welsh b7d464f367 chore: Bump enumset to 1.0.0 2020-04-13 04:14:29 -07:00
dependabot-preview[bot] 2146c42863 build(deps): bump smallvec from 1.2.0 to 1.3.0
Bumps [smallvec](https://github.com/servo/rust-smallvec) from 1.2.0 to 1.3.0.
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.2.0...v1.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-09 21:19:11 +00:00
Mike Welsh 47e936fcc2 tests: Add tests for Array.sort 2020-04-01 18:46:12 -07:00
Mike Welsh bd0d2031bc avm1: Implement Array.sort and constants 2020-04-01 18:46:12 -07:00
Mike Welsh 2bdbac9247 tests: Test that Color has no effect when target is undefined 2020-03-30 01:09:05 -07:00
Mike Welsh e47c2aa356 avm1: Color object has no effect if target is undefined/empty 2020-03-30 01:01:37 -07:00
Mike Welsh d5bd7c2dd8 avm1: Math.round rounds towards infinity 2020-03-29 18:44:28 -07:00
Mike Welsh 0c0d3dfd41 core: Add Navigator::time_since_launch to use for getTimer
Change `ActionGetTime` (`getTimer`) to use a new backend method.
This allows it to return updated times if it is called multiple
times in a single frame. This fixes hangs caused by games that use
busy-loop "frame limiter" code.
2020-03-28 22:28:07 -07:00
Mike Welsh f7375c3700 avm1: Use `PropertyMap::get_index` for stage object properties 2020-03-28 16:22:02 -07:00
Mike Welsh 4ea609cca1 tests: Don't special case enumeration tests 2020-03-28 16:22:02 -07:00
Mike Welsh 8da9487c0a avm1: Match Flash's property enumeration order (fix #153) 2020-03-28 16:22:02 -07:00
Mike Welsh 2cdf780e6f avm1: Handle case sensitivity in DisplayObject children
Alter `get_child_by_name` and alter `get_level_by_path` to respect
case sensitivity.
2020-03-28 16:22:02 -07:00
Mike Welsh 81a0bb370b tests: Add test for SWF<=6 case insensitivty 2020-03-28 16:22:02 -07:00
Mike Welsh ea245895b0 avm1: Use PropertyMap for stage object magic properties 2020-03-28 16:22:02 -07:00
Mike Welsh 7d848f4f34 avm1: Add avm parameter to TObject methods
This is necessary to get the current SWF version for properly
handing case sensitivity.
2020-03-28 16:22:02 -07:00
Mike Welsh 1ef698f2ea core: Add PropertyMap for handling AVM1 object properties
`PropertyMap` wraps over `IndexMap` to handle object properties in
AVM1. All insert/remove/get methods require and `swf_version`
parameter, and the `PropertyMap` will take care of handling case
senstivity and maintaing iteration order based on the SWF version.
2020-03-28 16:22:02 -07:00
Mike Welsh d42a402522 avm1: Add display object methods to TextField 2020-03-26 14:19:18 -07:00
Mike Welsh 7865ec1021 avm1: Implement Button object
First implementation of Button object. Hook up to the button
display object and run onRelease etc. methods as appropriate.

Pull out common display object methods into globals::display_object.
2020-03-26 00:21:21 -07:00
Mike Welsh 4df1128c19
core: Implement Object.registerClass (merge #344)
Implement Object.registerClass
2020-03-25 18:55:49 -07:00
dependabot-preview[bot] ef5ee3a889 build(deps): bump syn from 1.0.16 to 1.0.17
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.16 to 1.0.17.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.16...1.0.17)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-21 01:37:48 +00:00
Mike Welsh e9cb05aeb4 avm1: Correct order of modulo operands
Addresses part of #458.
2020-03-20 16:00:28 -07:00
hthh a16885d84b avm1: Fix string-to-number octal and whitespace handling
This conversion allows negative octal values, but not negative
hex values, and ignores only leading ASCII whitespace. A test
for this behavior is included.
2020-03-20 04:27:41 -07:00
Nathan Adams b4624fddce avm1: GetVariable and SetVariable look through the scope chain. Fixes #414
GetVariable and SetVariable attempt to resolve paths on each scope
in the scope chain.
2020-03-19 19:58:16 -07:00
Mike Welsh 454cd29ed6 chore: EditText::font takes self by value 2020-03-17 19:42:57 -07:00
Mike Welsh 068f4c3bee core: Edit text uses device fonts when outline flag isn't set
Specifically fall back to the device font when the UseOutlines
flag is not set in DefineEditText (SWF19 p.172). Fixes #451.

Note that since we only use a single font for "device" rendering,
this may sometimes be a different font than is specified in the
Flash IDE.
2020-03-17 19:13:20 -07:00
dependabot-preview[bot] da3398c832 build(deps): bump bitstream-io from 0.8.4 to 0.8.5
Bumps [bitstream-io](https://github.com/tuffy/bitstream-io) from 0.8.4 to 0.8.5.
- [Release notes](https://github.com/tuffy/bitstream-io/releases)
- [Commits](https://github.com/tuffy/bitstream-io/commits/v0.8.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-17 17:08:59 +00:00
dependabot-preview[bot] 2bfa2502a9 build(deps): bump num_enum from 0.4.2 to 0.4.3
Bumps [num_enum](https://github.com/illicitonion/num_enum) from 0.4.2 to 0.4.3.
- [Release notes](https://github.com/illicitonion/num_enum/releases)
- [Commits](https://github.com/illicitonion/num_enum/compare/0.4.2...0.4.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-17 17:07:35 +00:00
Mike Welsh c2ce9892b1 core: Clamp RGBA when un-multiplying alpha
Fixes some bad pixels sometimes appearing in decoded JPEGs (such
as in #437 and in Dad 'n' Me).
2020-03-16 16:11:59 -07:00
dependabot-preview[bot] 0f7f36681d build(deps): bump quick-xml from 0.17.2 to 0.18.1
Bumps [quick-xml](https://github.com/tafia/quick-xml) from 0.17.2 to 0.18.1.
- [Release notes](https://github.com/tafia/quick-xml/releases)
- [Changelog](https://github.com/tafia/quick-xml/blob/master/Changelog.md)
- [Commits](https://github.com/tafia/quick-xml/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 05:34:45 +00:00
Mike Welsh 24a557807d chore: Fix more clippy lints 2020-03-12 21:40:48 -07:00
Mike Welsh 13b039fa34 chore: Fix clippy iter-nth-zero warnings
New lint added in latest clippy versions.
2020-03-12 21:16:30 -07:00
Mike Welsh 098bf33068 chore: Bump quote to 1.0.3 2020-03-08 18:58:39 -07:00
dependabot-preview[bot] a0ee19fd37 build(deps): bump syn from 1.0.14 to 1.0.16
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.14 to 1.0.16.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.14...1.0.16)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 20:26:50 +00:00
dependabot-preview[bot] ba185d3d43 build(deps): bump minimp3 from 0.3.3 to 0.3.5
Bumps [minimp3](https://github.com/germangb/minimp3-rs) from 0.3.3 to 0.3.5.
- [Release notes](https://github.com/germangb/minimp3-rs/releases)
- [Commits](https://github.com/germangb/minimp3-rs/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 19:07:25 +00:00
dependabot-preview[bot] 3f28554285 build(deps): bump enumset from 0.4.4 to 0.4.5
Bumps [enumset](https://github.com/Lymia/enumset) from 0.4.4 to 0.4.5.
- [Release notes](https://github.com/Lymia/enumset/releases)
- [Changelog](https://github.com/Lymia/enumset/blob/master/RELEASES.md)
- [Commits](https://github.com/Lymia/enumset/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 18:14:25 +00:00
Nathan Adams 751b15beec chore: Raise errors during Object.registerClass 2020-02-29 23:13:02 +01:00
Nathan Adams 7bed4d4940 chore: Document each trace in attach_movie avm1 tests 2020-02-29 23:05:17 +01:00
Nathan Adams 041bb6b44c avm1: Implement `Object.registerClass` 2020-02-29 23:05:17 +01:00
Nathan Adams d850443c84 avm1: Refactor to expose `avm, context` in `post_instantiate` 2020-02-29 23:05:15 +01:00
David Wendt fdce33ff5e Return an `Err` when decompression fails, rather than just logging it and returning an empty vec. 2020-02-26 18:18:24 -05:00
David Wendt ded7737ac0 `SwfMovie::from_data` is falliable and we should not hide those errors behind panics. 2020-02-26 18:15:01 -05:00
David Wendt 0313225164 Don't allow movie loads to be removed from the load manager unless they have completed or errored. 2020-02-26 18:03:45 -05:00
David Wendt a023e161fc Don't panic if our target handle was removed from the load manager. Instead, return an `Err` so that it can be properly reported on the console without killing the player. 2020-02-26 17:38:31 -05:00
Mike Welsh 223edb9bc1 core: Matrix translation is in twips 2020-02-26 12:47:47 -08:00
Mike Welsh c4c02260fb core: Implement keyUp event 2020-02-26 03:48:07 -08:00
Mike Welsh db9bd1616e chore: Remove unused deref impl from AudioBackend 2020-02-26 02:00:28 -08:00
Mike Welsh 86ec2c6cb8 input: Add InputBackend::set_mouse_cursor. Change cursor on buttons
It doesn't feel like Flash without having the hand cursor display
when hovering over buttons. First pass at implementing this;
core communicates which mouse cursor to use via
`InputBackend::set_mouse_cursor`.

TODO: Hand cursor only displayed for Button display objects
currently. Movie clips should also display this when they are in
"button mode" (when a button mouse event is set on them in AVM1,
or `buttonMode` property in AVM2).
2020-02-25 02:50:26 -08:00
Mike Welsh a917fa4028 tests: Add temporary test for MovieClip.getRect
This is just testing that it exists and returns the same values as
getBounds for shapes without strokes.

TODO: When it is properly implemented for strokes, add stroked
shapes to testing.
2020-02-24 14:12:48 -08:00
Mike Welsh d8079ac04a core: Stub out MovieClip.getRect
Just defer to getBounds for now. TODO: getRect should return bounds
ignoring strokes, so in reality it is <= getBounds.
2020-02-24 14:12:48 -08:00
Mike Welsh 993c05cf19 core: Calculate bounds for each morphshape frame 2020-02-24 14:12:48 -08:00
Mike Welsh a5c08f2e59 avm1: Implement MovieClip.getBounds and clean up bounding box methods
Implements MovieClip.getBounds, and also reorganized the
DisplayObject AABB methods:

 * `self_bounds` calculates the inherent untransfomed bounds of
 the object without children. All `DisplayObject`s must implement
 this method. For example, `Bitmap` returns the size of bitmap.
 Composite objects like `MovieClip` return a null AABB because they
 are made up of only children.
 * `bounds` calculates the untransformed bounds including children.
 * `local_bounds` calculates the bounds relative to the object's
 parent.
 * `world_bounds` calculates the bounds in global stage space.
 * `bounds_with_transform` calculates a tight AABB for the object
 with a given transform, and is used to implement the above.
2020-02-24 14:12:48 -08:00
Mike Welsh 73a9a0e771 tests: Add test for MovieClip.getBounds 2020-02-24 14:12:48 -08:00
Mike Welsh 8c486b7544 chore: Use free functions for movie_clip methods
Try to keep style more consistent by using functions for all MC
methods. Previous was a mix of closures and functions (we're still
a little bad with this elsewhere)
2020-02-24 11:17:40 -08:00
Mike Welsh f163afc5b4 core: Use collect to copy level pointers 2020-02-24 02:28:27 -08:00
Mike Welsh 1b08fb538d chore: Rename layer -> level
Unify mix of 'layer' and 'level' in the code, and it's probably
better to stick with Flash nomenclature.
2020-02-23 23:41:55 -08:00
David Wendt 05e5fbb69c For some reason, this color transform code broke on the moviefetch branch 2020-02-22 00:02:52 -05:00
David Wendt abc1d00276 Fix incorrect preload of `_root` in `DefineFunction2` function calls.
This is caused by the fact that `avm.root_object` references the *current* stack frame, not the one we are about to introduce. Ergo, we need to pull the base clip of the *new* stack frame and find it's root.

This particular behavior only crops up in situations where there can be multiple root objects, at least until we implement `_lockroot`.
2020-02-22 00:02:51 -05:00
David Wendt 766ded6dfd When replacing a movie clip with another movie, don't wipe out the entire display object base as that disassociates us from our parent, siblings, and most importantly, *layer depth*. 2020-02-22 00:02:51 -05:00
David Wendt e0b4a0f193 Top-level layers are referenced via their path (`_leveln`) rather than name - in fact, their name is always the empty string. 2020-02-22 00:02:51 -05:00
David Wendt 00f88f9e87 Use the depth to indicate which layer a particular root clip is, and then use that to calculate it's `_leveln` path. 2020-02-22 00:02:50 -05:00
David Wendt 8ef759d377 Top-level layers do not get an instance name of `_leveln`. 2020-02-22 00:02:50 -05:00
David Wendt 9adf0f43d7 Allow levels to be read as scope variables, and add a test for this. 2020-02-22 00:02:50 -05:00
David Wendt 5a7e530c91 Add a test for cross-movie `_root`.
This test does not pass yet. Other layers need to resolve as target paths in order for this to happen.
2020-02-22 00:02:48 -05:00
David Wendt aa6aba13dd Abolish `context.root` completely.
`_root` is calculated dynamically based on the clip the currently executing function was called in.

Other things that used `context.root` have been changed to either update all layers or just update layer 0, which is the former `context.root`.
2020-02-22 00:02:46 -05:00
David Wendt 33d26b9149 Shorten `Pin<Box<dyn Future<Output=Result<T,E>> + 'static>>` into `OwnedFuture<T,E>`.
This is technically stricter on `fetch` impls, but right now we can't support non-`'static` futures at all.
2020-02-22 00:02:45 -05:00
David Wendt aab339880d Implement `XML.load()`, with tests.
Interestingly enough, very little actually has to be done inside the async process for XML. The async process basically just fetches data and fires an event handler when it's done. Everything else is handled via a system builtin, `XML.onData`.
2020-02-22 00:02:45 -05:00
David Wendt 538a5f05e5 Add tests for various forms of `loadVariables`.
Surprisingly enough these tests passed without any changes, somehow.
2020-02-22 00:02:43 -05:00
David Wendt c00ecccd1f Basic, stub implementation of `MovieClipLoader.getProgress`, plus test.
This implementation just returns the size of the current loaded movie. The test is also deliberately written to be loose on timings so that it likely won't see a partially loaded movie. (I don't want it to be a test of load events, so I just wait a few frames, rather than the correct way of waiting for `onLoadComplete`.)

Until we support streaming file loads, we can't faithfully support these properties. Still, it's better to have them, just in case.
2020-02-22 00:02:42 -05:00
David Wendt 3f7e3a9ed8 Implement `MovieClipLoader.unloadClip`, with tests. 2020-02-22 00:02:41 -05:00
David Wendt a132226da4 Run `onLoadInit` at the *end* of a frame, rather than before the movie clip's own actions.
This is technically better, but it may make more sense to trigger `ClipEvent::Load` at the start of the next frame instead. Furthermore, I don't know if other forms of load events should trigger on the next frame (or end of the current one) like this.
2020-02-22 00:02:39 -05:00
David Wendt 55734619f7 `GetUrl2` can accept a `DisplayObject` as target in `LoadTargetFlag` mode.
I have no idea what happens to non-MovieClip objects, or if I'm really supposed to `coerce_to_string` here.
2020-02-22 00:02:36 -05:00
David Wendt d49c0e9bf7 Rewrite some of the unload and cliploader tests to be more generous with load timing.
Loads in Flash Player, like all web technologies, are asynchronous tasks of some kind (probably a separate thread). They appear to operate on some kind of a delay. If I `trace` each frame out, like in the previous version of `mcl_loadclip`, you get a series of events that look like this:

1. Parent frame 1
2. Parent frame 2
3. Event: onLoadStart
4. Event: onLoadProgress
5. Event: onLoadComplete
6. Parent frame 3
7. Event: onLoadInit

If I run that version of the test on Ruffle, everything happens after frame 1. This is an artifact of how we're testing asynchronous behavior in Ruffle. In order to guarantee test determinism, we have a dummy implementation of `fetch` that does a blocking load, and we poll all futures every frame of execution. This means that there is a very specific order of execution with these tests, which is good for testing, but probably isn't 100% accurate.

Flash Player appears to delay all loads by at least one frame, even loads that are coming from disk which should load immediately. I don't know if this is intentional or not, so I don't want to implement a load delay just for the sake of making tests pass. Ergo, I'm loosening the tests to just test the ability to load and unload movies, and fire events from a loader.

Specifically:

1. `mcl_loadclip` no longer traces out frames of the parent timeline
2. `unloadmovie` et. all use a target movie that doesn't fail the test until 10 frames have passed.

If someone can find a movie network that breaks with fast loading, then I'll consider implementing explicit frame delays for async tasks. Otherwise, this is how we're testing this.
2020-02-22 00:01:22 -05:00
David Wendt 8ece2d1b31 Add another ignored test, this time measuring the timing of load events broadcasted by `MovieClipLoader`. We're loading too early, which is why this is ignored. 2020-02-22 00:01:20 -05:00
David Wendt b56c3b6aed Fire events directly onto `broadcastMessage` instead of the individual event handlers on the `MovieClipLoader`, so that listeners run correctly.
Also, this fixes a double-borrow for `onClipInit`.
2020-02-22 00:01:19 -05:00
David Wendt 89e5dd97f3 Implement `MovieClipLoader.loadClip` 2020-02-22 00:01:19 -05:00
David Wendt 162b6b70f8 Allow unloading a movie by sending `None` to `replace_with_movie`.
This also adjusts `MovieClip.unloadMovie` to do just that, instead of removing the clip from the display list. We also have to unload clips when loading new movies into them, since `unloadMovie` desugars to loading `""` as the URL.
2020-02-22 00:01:19 -05:00
David Wendt 8ef4a94672 Add new tests for `unloadMovie`, `unloadMovieNum`, and `MovieClip.unloadMovie`.
They currently fail in Ruffle, so they're ignored.
2020-02-22 00:01:18 -05:00
David Wendt cc5dff4254 Add a test for `MovieClip.loadMovie`. 2020-02-22 00:01:17 -05:00
David Wendt 82d305a0f5 Add test for `loadmovienum` 2020-02-22 00:01:16 -05:00
David Wendt a9621da47d Add tests for `loadMovie`.
This test also includes changes to the SWF testing environment to allow asynchronous movie loads to execute.
2020-02-22 00:01:15 -05:00
David Wendt a8545ee277 Implement `onLoadInit` by pulling `LoadManager` into all clip load events. 2020-02-22 00:01:14 -05:00
David Wendt 7ff885a0de Implement `MovieClipLoader` event broadcasts for `onLoadStart`, `onLoadProgress`, `onLoadComplete`, and `onLoadError`.
Note that we do not implement `onLoadInit` yet - this requires some ability to trigger an event when another movie clip loads.
2020-02-22 00:01:14 -05:00
David Wendt db41bec91e Implement `MovieClipLoader`'s `addListener`, `removeListener`, and `broadcastMessage` methods.
Interestingly, this constitutes an implementation of `AsBroadcaster`. It appears Macromedia decided to implement event handling on `MovieClipLoader` in a very similar fashion to `AsBroadcaster`, down to invoking `broadcastMessage` and searching a `_listeners` property for listeners.
2020-02-22 00:01:12 -05:00
David Wendt b7d318a897 Implement `MovieClip.loadMovie`, `MovieClip.loadVariables`, and `MovieClip.unloadMovie`.
*De*implement the free function versions of the above, as well as their `Num` variants, since they don't actually exist as callables. Instead, the ActionScript compiler treats them as preprocessor functions that represent various forms of `ActionGetURL`/`ActionGetURL2`.
2020-02-21 23:59:13 -05:00
David Wendt 31b1364b82 Implement `unloadMovie` / `unloadMovieNum` 2020-02-21 23:58:00 -05:00
David Wendt b2b2a165fc Implement `loadVariables` and `loadVariablesNum`. 2020-02-21 23:58:00 -05:00
David Wendt c7539872f7 Add the ability to POST data from `fetch`, and allow methods that read AVM locals into form data to `GET` or `POST` them. 2020-02-21 23:58:00 -05:00
David Wendt 3fe6884c90 Refactor layer resolution into a separate function.
This function is part of `Avm1`, rather than a hypothetical `LayerManager`, because we're going to need to eventually construct layers differently for AVM2.
2020-02-21 23:57:59 -05:00
David Wendt ea28c2c4a2 Impl `loadMovie` / `loadMovieNum` (sans local variable support) 2020-02-21 23:57:59 -05:00
David Wendt 07637fe676 Replaced movies should start out playing. This fixes a regression from a previous rebase. 2020-02-21 23:57:58 -05:00
David Wendt 64b787b73f Implement `Collect` for `Loader`. (How did this compile without that?) 2020-02-21 23:57:58 -05:00
David Wendt d84e11ed40 Introduce a new top-level object, `LoadManager`, which is responsible for all asynchronous behavior in the program. Migrate the existing async impls to it. 2020-02-21 23:57:58 -05:00
David Wendt 2d7a4fef28 `Sound` methods that reference sounds by library export name should default to `_layer0`'s library if the `Sound` was created without a movie clip target. 2020-02-21 23:57:57 -05:00
David Wendt 6b78ec6e03 More thoroughly clean `MovieClip`s that have movies loaded into them. This does everything except wipe the object it's attached to - I need further testing to see how Flash handles that. 2020-02-21 23:57:57 -05:00
David Wendt 2a82d21966 Change the layer list from a static array to a `BTreeMap`.
Flash allows creating layers at any 31-bit height without issue, so this should support similar limitations.
2020-02-21 23:57:57 -05:00
David Wendt f4e4171ebe Make spawned futures falliable, and report those errors. 2020-02-21 23:57:56 -05:00
David Wendt 5ce499d11e Add separate libraries for each loaded movie. 2020-02-21 23:57:56 -05:00
David Wendt e0c0779bd0 Make sure to preload all loaded clips. 2020-02-21 23:57:55 -05:00
David Wendt 6da374c567 Implement loading movies into `_leveln` via `ActionGetUrl` 2020-02-21 23:57:55 -05:00
David Wendt ed799fd2b9 Split the player up into nine layers, each of which is a separate root movie clip. 2020-02-21 23:57:55 -05:00
David Wendt 8c9d290db7 Implement the MovieClip loading portion of `ActionGetURL2`. 2020-02-21 23:57:54 -05:00
David Wendt 5ed5876e9a Merge SWF data and version into a single structure. Refactor everything that interacts with it to use `SwfSlice`s. 2020-02-21 23:57:53 -05:00
David Wendt 250ec13c12 Implement LoadVariablesFlag.
This has some subtle problems: we cannot hold references to garbage-collected data in Futures, so we have to arrange for the AVM itself to forcibly root them for us. Then we get them back when our async code is ready to do something to the AVM.
2020-02-21 23:44:06 -05:00
David Wendt 55149b7b7e Reference count the Player and provide a weak reference in UpdateContext.
This allows the formation of `'static` futures that can still interact with a player. Async code will need to upgrade the weak reference in order to be able to interact with the player.
2020-02-21 23:44:06 -05:00
David Wendt 491d94c947 Pinbox all Futures.
Due to some strangeness with the way Rust implemented unsafe-to-move behavior, boxed futures are implicitly `Unpin`. Which is useless to us.

The reason for this is a little counter-intuitive. Actually, the fact that Rust supports memory pinning at all is a little odd, because the core language explicitly requires all types be movable. To get around this, Pin requires that all !Unpin types be *born pinned*. This is because you can't re-pin an already unpinned value in memory.

Anyway, this necessitates this silly API change.
2020-02-21 23:44:05 -05:00
David Wendt 00d25a768c Extremely basic impl of fetch/spawn methods for getting data off the web 2020-02-21 23:44:05 -05:00
David Wendt 2137b9f1fd Migrate `set_frame_rate` into the core `AudioBackend` trait 2020-02-21 23:44:05 -05:00
David Wendt c1cf73ccb3 Add a public method to trigger a player update.
User-defined player updates are treated the same as if a stage frame had been run: queued actions are executed and garbage is collected.
2020-02-21 23:44:04 -05:00
Mike Welsh f80c188048 core: Stop stream sounds when a clip is removed 2020-02-21 19:24:45 -08:00
Mike Welsh 6b503ac053 avm1: Fix DefineFunction2 preload order when _parent is undefined
The order is misdocumented in SWF19 (and also miscompiled assuming
this incorrect order by the Flash IDE!).

`_global` gets preloaded before `_parent`.
2020-02-20 12:58:26 -08:00
Mike Welsh dc1f99e2ba tests: Add test for misdocumented DefineFunction2 register preload 2020-02-20 12:58:26 -08:00
Mike Welsh 10fb6c7c04 tests: Add define_function2_preload test 2020-02-19 23:22:33 -08:00
Mike Welsh 19d0bf64a9 avm1: Preload _parent directly from base clip
When `_parent` is preloaded  in a `DefineFunction2` action,
we previously resolve it on the scope chain. This could cause
double borrow panics as the parent object could already be
borrowed, and also this matches the behavior of the official Flash
player.

Addresses #398.
2020-02-19 23:22:33 -08:00
Mike Welsh 8d7e58011e avm1: undefined coerces to "" in SWFv6 and below
Except in the AVM1 trace op, which will print out "undefined".
2020-02-19 10:47:43 -08:00
Mike Welsh dfde98da7d tests: Add tests for coercing undefined to string in SWF6 2020-02-19 10:47:43 -08:00
Mike Welsh 452ac84f0e tests: Uncomment Number.POSITIVE_INFINITY/Number.NEGATIVE_INFINITY tests 2020-02-18 10:17:55 -08:00
Mike Welsh c073afb077 avm1: Use proper value for Number.MIN_VALUE
This is the smallest positive number, not the most negative value.
This is actually the smallest positive subnormal f64, which Rust
does not provide a constant for. This is ~5e-324.
2020-02-18 10:17:55 -08:00
Mike Welsh 6bbe1dbab8 avm1: Match Flash when converting exotic numbers to string (fix #361)
Match Flash's more closely when converting number to string:
 * NAN -> NaN
 * inf -> Infinity
 * -inf -> -Infinity
 * Use exponential notation for very large/very small

This is a little bit of a cheat by using Rust's number-to-string
formatting for exponentials, and shoving a sign in front of the
exponent.
2020-02-18 10:17:55 -08:00
Mike Welsh 324dd1c5e4 tests: Add swf_tests_approx macro
Use this macro to test numeric calculations that might have some
variance using approx_eq.
2020-02-17 15:42:29 -08:00
Mike Welsh b6249cdb73 tests: Add localToGlobal/globalToLocal test 2020-02-17 15:42:29 -08:00
Mike Welsh 2af21d87e0 avm1: Implement MovieClip.localToGlobal/globalToLocal 2020-02-17 15:42:29 -08:00
Mike Welsh cd94486f7e desktop: Fix stream audio from prematurely ending (fix #222) 2020-02-14 20:32:25 -08:00
Mike Welsh 7c406732c7 audio: Ensure stream sounds stop upon goto/loop (fix #370) 2020-02-14 20:32:25 -08:00
Mike Welsh 9ad069e11a avm1: Improve display object property setters for weird values
Setting a property such as _x to undefined or null should have no
effect. This was working for v7+ SWFs because it would coerce to
NaN and we toss out NaNs. But on v6 and below, these coerce to 0
and would end up setting the property to 0.

Explicitly check for undefined/null and bail out. Fixes #380.

Also adjust the _visible setter, since this actually coerces to a
number (because of its legacy from SWFv4). For example,
_visible = "" should have no effect.
2020-02-14 15:34:14 -08:00
Mike Welsh 3a1a73ae11 tests: Add more tests for display object properties
Add more _x = weirdo value tests, and copy the test into a v6 SWF.
(because undefined etc. can coerce to 0 instead of NaN in SWFv6).
2020-02-14 15:34:14 -08:00
Mike Welsh 7d14b98f3b avm1: Ignore undefined values in Color.setTransform
If a property is not set on the object passed to Color.setTransform,
then that channel is left unmodified. This fixes invisible objects
in some games (fixes #369, addresses #380).

Also improve handling of wrapping/invalid values to better match the
behavior in the Flash Player (some work pending on #193).
2020-02-13 18:06:27 -08:00
Mike Welsh 21f117e7bc avm1: Add Value::coerce_to_i16 2020-02-13 18:06:27 -08:00
Mike Welsh 19df074a79 tests: Add more tests for AVM1 Color object
Include not defined values, wrapping values, invalid values.
2020-02-13 18:06:27 -08:00
David Wendt 18516c8eac Pre-strip HTML from HTML tags, rather than skipping them. 2020-02-03 19:32:05 -05:00
David Wendt 7d225f8b55 Fix overflow when shifting `u8`s 2020-02-03 14:46:36 -05:00
David Wendt 3d6b00c1e4 Impl the remaining text layout properties 2020-02-03 14:46:36 -05:00
David Wendt 517e7ce9ff Add word-wrap for `measure_text` and caching for word-wrap calculations 2020-02-03 14:46:36 -05:00
David Wendt 5e808c8cd6 Adjust the wordwrap machinery to work in break points (indicies where new lines start) so we can cache them later 2020-02-03 14:46:35 -05:00
David Wendt fb8664c818 Implement wordWrap and multiline rendering, poorly 2020-02-03 14:46:35 -05:00
David Wendt 7df8eb7674 Impl `is_multiline`'s effect of respecting newlines 2020-02-03 14:46:35 -05:00
David Wendt f95ec777de Also impl storage of the `wordWrap` flag 2020-02-03 14:46:34 -05:00
David Wendt 819757e2b6 Fix text measurement now that the underlying SWF tags are correctly parsed as `Twips`.
Transform coordinates are always in twips, so we have to convert pixels to twips when evaluating the font, and then convert back when measuring.
2020-02-03 14:46:34 -05:00
David Wendt 63b7d172f4 `TextRecord.height` is also in `Twips`.
Notably, the `Text` rendering code does not appear to actually work in pixel scale.
2020-02-03 14:46:34 -05:00
David Wendt fde7715fb8 `EditText.height` is in `Twips` 2020-02-03 14:46:33 -05:00
David Wendt 75022f36d2 Pull `TextFormat` into the `font` module.
Also, since there's a separate function for attaching virtual properties to an AVM1 `TextField` object, let's use that!
2020-02-03 14:46:33 -05:00
David Wendt 4b3660bf2c Impl get/set for `is_multiline`. 2020-02-03 14:46:32 -05:00
David Wendt c1ff1d94d5 Pull the `EditText.evaluateFont` method into `Font`.
`Text` itself doesn't use this method, but it probably could with some changes.
2020-02-03 14:46:32 -05:00
David Wendt 81b7958090 Impl `textWidth` / `textHeight`, although it currently only works well for single-line scenarios. 2020-02-03 14:46:32 -05:00
David Wendt 2181f0d0d0 Impl `getNewTextFormat`/`setNewTextFormat`.
These don't actually do anything yet, because we don't track text spans, nor do we actually use those text spans to alter rendering or text layout.
2020-02-03 14:46:30 -05:00
David Wendt db56217f20 `TextFormat` does *not* coerce `undefined` or `null`; instead those both become `null`. 2020-02-03 14:46:30 -05:00
David Wendt 8449d964ef Implement `TextFormat` as a property bag. 2020-02-03 14:46:29 -05:00
David Wendt 2b0600ab1a Impl `createTextField`. 2020-02-03 14:46:29 -05:00
Mike Welsh 2ff76775e0 core: Empty movie clips can not be used as a mask
When a movie clip or button is used as a mask, the masking will be
disabled if that object has no children; the maskee will be
completely visible. An empty movie clip inside an empty movie clip
successfully masks.

An EditText can also not be used as a masker (although it can be
wrapped inside a movie clip, and then the text successfully masks).

Add a `TDisplayObject::allow_mask` trait method that will
return whether the object can be used as a mask.

This fixes characters not being visible in Dad 'n' Me.
2020-02-01 01:15:31 -08:00
Mike Welsh 2e304a81ef core: Flag as transformed-by-script after swapDepths 2020-01-31 19:44:42 -08:00
Mike Welsh a55a378a73 avm1: Improve comments in MovieClip depth methods 2020-01-31 19:44:42 -08:00
Mike Welsh 4d1f7c4d4a tests: Add movieclip depth method tests 2020-01-31 19:44:42 -08:00
Mike Welsh a4e175a790 avm1: Implement MovieClip.getNextHighestDepth 2020-01-31 19:44:42 -08:00
Mike Welsh 4d12cd1566 avm1: Implement MovieClip.getDepth 2020-01-31 19:44:42 -08:00
Mike Welsh 9e337ede34 avm1: Implement MovieClip.swapDepths 2020-01-31 19:44:42 -08:00
dependabot-preview[bot] 2f98fd1a0e build(deps-dev): bump webpack-dev-server in /web/selfhosted
Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 3.10.1 to 3.10.2.
- [Release notes](https://github.com/webpack/webpack-dev-server/releases)
- [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.10.1...v3.10.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-31 19:44:42 -08:00
Mike Welsh 0d91fb423e core: Goto only runs if frame is an integer 2020-01-30 15:17:01 -08:00
Mike Welsh c079cb3bca core: Don't run frame actions when seeking past end of timeline
If you goto past the final loaded frame of a timeline, for example,
with gotoAndStop(9999), this seeks to the final frame on the
timeline, but it doesn't run the actions on this frame.

MovieClip::goto_frame now will not run the final frame actions if
the target frame was not reached.
2020-01-30 15:17:01 -08:00
Mike Welsh 8aae07bbf3 core: Frame labels are case insensitive 2020-01-30 15:17:01 -08:00
Mike Welsh a835573f3c tests: Add test for global GotoFrame action 2020-01-30 15:17:01 -08:00
Mike Welsh 62467bb880 avm1: Handle invalid parameters in GotoFrame2
Use the same code path for the global GotoFrame2 action and
MovieClip.gotoAndX, which properly handles out-of-range and invalid
values like NaN.

Fixes Disorderly hanging on game start
(https://www.newgrounds.com/portal/view/121896)
2020-01-30 15:17:01 -08:00
David Wendt a57d0e12b3 Do not apply a color filter at all unless rendering a bitmap or gradient.
This significantly improves render times, as browsers appear to apply filters in the most general, inefficient way possible.
2020-01-29 14:19:18 -05:00
dependabot-preview[bot] dc8858505d build(deps): bump smallvec from 1.1.0 to 1.2.0
Bumps [smallvec](https://github.com/servo/rust-smallvec) from 1.1.0 to 1.2.0.
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.1.0...v1.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-29 18:42:28 +00:00
Mike Welsh 003cc414aa core: Create clips in execution order during a goto
The list of goto commands is now a Vec that will already be in order
of creation. This ensures that subsequent ActionScript in these clips
runs in the correct order.
2020-01-28 04:15:08 -08:00
Mike Welsh 81a1c05682 tests: Add goto_execution_order2 regression test
Tests execution order of children added during a goto.
2020-01-28 04:15:08 -08:00
Mike Welsh 7532e89aff avm1: Use `resolve_target_display_object` in `Color`
Fixes the boss damage blinking in Alien Hominid. Target was a path
string.
2020-01-27 23:35:41 -08:00
Mike Welsh 69f19f03c4 avm1: Output trace warning for invalid SetTarget (fix #332) 2020-01-27 23:35:41 -08:00
Mike Welsh a0032b9aa1 avm1: Better handling of movie clip paths strings (fix #317)
Ops and functions that take a movie clip path in String form have
a very forgiving syntax. These include:
 * `SetTarget`
 * `CloneSprite`
 * `RemoveSprite`
 * `swapDepths`

This change adds `Avm1::resolve_target_display_object` to parse
these paths correctly, along with `target_paths` test to test a
wide variety of formats.

This also applies to `GetVariable`/`SetVariable`, which accept
target paths to variables and is used by some SWF4/5 content.
(fixes #324, #337).
2020-01-27 23:35:41 -08:00
Mike Welsh 2751b89d4e avm1: Root clip should not have a name
Previously we set the name of the root clip to `_level0`. Top-level
clips should actually have no name (`_root._name` returns `""`).

However, when constructing a dot path, `_level0` still gets inserted
by `DisplayObject::path` for the top-level, so that `trace(_root)`
still correctly prints `_level0`.

TODO: When `loadMovieNum` gets merged in, the proper level # needs
to be returned by `.DisplayObject::path`.
2020-01-27 23:35:41 -08:00
Mike Welsh 0446644742 tests: Add target_path test 2020-01-27 23:35:41 -08:00
David Wendt db51ec9e3c Implement a separate `Object` impl for functions that holds an `Executable`. 2020-01-27 21:57:32 -05:00
David Wendt 8eeb9a5c60 This technically isn't a test of `toString`, so remove stuff from the test that it relies upon. 2020-01-27 21:50:11 -05:00
David Wendt d217f51c6c Don't crash if `Function.prototype.call` is called without arguments. 2020-01-27 21:50:10 -05:00
David Wendt 0470b8d0a7 Add a test for `Function.call` and `Function.apply` 2020-01-27 21:50:10 -05:00
David Wendt 2c0d892154 Implement Function.call/apply 2020-01-27 21:50:09 -05:00
Mike Welsh 4b7bac706b avm1: ActionNewMethod supports auto-boxing values
This allows `new ("FOO".bar)()`, although there is probably no
good reason to do this. :-)
2020-01-21 18:24:49 -08:00
Mike Welsh 70bec9437f tests: Boolean() returns undefined 2020-01-21 18:24:49 -08:00
Mike Welsh d9e7a6a960 avm1: Implement Boolean class 2020-01-21 18:24:49 -08:00
Mike Welsh e71099edd5 tests: Add primitive_type_globals test 2020-01-21 18:24:49 -08:00
Mike Welsh 8263d13fd0 avm1: Implement Number class 2020-01-21 18:24:49 -08:00
Mike Welsh b49357e46f avm1: Boxing a value calls the object constructor 2020-01-21 18:24:49 -08:00
Mike Welsh ccf62979a1 avm1: Implement String methods 2020-01-21 18:24:49 -08:00
Mike Welsh 5f12ce78b6 tests: Add string method tests 2020-01-21 18:24:49 -08:00
David Wendt 2f9d50cdb8 Very rudimentary/basic/not-good implementation of `String`, plus auto-boxing for primitive strings getting their methods taken. 2020-01-21 18:24:49 -08:00
David Wendt 4d1e49882b Add another object class for boxed primitive values, because the language demands it. 2020-01-21 18:24:49 -08:00
Mike Welsh 13b4cd4c1b avm1: Add Value::coerce_to_i32/u32/u16 methods
Add these methods that will explicilty coerce a value to an int,
following the wrapping behavior in the ECMAScript specs (ToInt32,
ToUInt32, ToUInt16).

This also fixed an off-by-one error for negative numbers in the
previous implementation.

These will call `valueOf` if necessary. AVM code that requires an
integer will probably use one of these (`coerce_to_i32` usually).
2020-01-20 13:28:27 -08:00
dependabot-preview[bot] 87e96212e4 build(deps): bump syn from 1.0.13 to 1.0.14
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.13 to 1.0.14.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.13...1.0.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-20 18:56:56 +00:00
Nathan Adams 4ad6ef8b83 core: Implemented Key.getCode() 2020-01-17 15:11:38 -08:00
Nathan Adams adceceed5d avm1: Removed redundant double registration of Key 2020-01-17 15:11:38 -08:00
Nathan Adams cef7d3eba2 avm1: Implement Key constants 2020-01-17 15:11:38 -08:00
Mike Welsh 8cb4278903 tests: Use pretty_assertions for nice output on test fail 2020-01-17 13:54:39 -08:00
Mike Welsh cf7a564f2c core: Fix properties not resetting in goto when rewinding
Properties of a display object would not reset when rewinding if
it existed in both the initial and final frames of the goto.
This fixes the weapons toggles in UFA.
2020-01-16 09:58:33 -08:00
Mike Welsh 8448fc80ef avm1: Don't panic when calling ActionRandom with <= 0 2020-01-14 00:05:13 -08:00
Mike Welsh 4eef8a1821 tests: Add test for ActionCall 2020-01-14 00:04:11 -08:00
Mike Welsh 2d3801dac8 avm1: Implement ActionCall opcode 2020-01-14 00:04:11 -08:00
Nathan Adams fdf1d38d21 avm1: Implement remainder of Math 2020-01-13 15:57:56 -08:00
dependabot-preview[bot] 6c2f5143b3 build(deps): bump rand from 0.7.2 to 0.7.3
Bumps [rand](https://github.com/rust-random/rand) from 0.7.2 to 0.7.3.
- [Release notes](https://github.com/rust-random/rand/releases)
- [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/rand/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-13 18:38:15 +00:00
Mike Welsh 001a931afe avm1: Avm1::pop should always succeed
Don't return a Result from `pop`. Instead, emit a warning and
return Undefined if there is an underflow.
2020-01-07 15:59:14 -08:00
Mike Welsh 170813ffbf audio: Assume little endian for PCM unknown endian sounds 2020-01-07 02:40:09 -08:00
Mike Welsh a28e97d8c3 avm1: Don't push returns from non-function stack frames 2020-01-06 20:49:05 -08:00
Mike Welsh 7e05da6147 avm1: Fix issues with traversing the scope chain in SetVariable
When setting a variable in a function-local scope, if that variable
has not been defined in the function scope, it should be defined in
the executing movieclip's scope. Previously it would get defined
in the function's scope. Changed Scope::overwrite to Scope::set,
and modified the behavior to stop traversing and define the value
when it hits a movie clip Target scope.

Also, modified With scopes to properly add onto the end of the scope
chain.
2020-01-06 20:49:05 -08:00
Mike Welsh a60fadf0bb tests: Add test for correct scope in SetVariable 2020-01-06 20:49:05 -08:00
David Wendt 0d1d0e8de7 Don't bother preserving the `Cow`ness of unescaped strings when we're going to clone them anyway. 2020-01-05 00:31:45 -05:00
David Wendt 7957434036 This is a copy type, copy it 2020-01-05 00:24:31 -05:00
David Wendt f8b5b8a032 Use `unwrap_or_default` where available 2020-01-05 00:22:36 -05:00
David Wendt ef7c5d7eb9 Move XML properties to separate functions rather than closures 2020-01-05 00:17:57 -05:00
David Wendt 14dba0d100 Log errors encountered when removing the children of a node we plan to parse XML into.
Also, remove a handful of unnecessary `#[allow(unused_must_use)]` instances.
2020-01-05 00:04:45 -05:00
David Wendt 464563a703 Change the no-double-introduction warning into a proper `assert!`. Add doc warning about the panic. 2020-01-05 00:00:29 -05:00
David Wendt 750e6e4370 Replace bare number constants for XML errors with symbolic `const` values 2020-01-04 23:56:10 -05:00
David Wendt fd541fabea Implement `status`.
I'm not entirely sure how to test this one - the list of errors that Flash kicks out for XML and the list of errors that `quick_xml` kicks out don't line up at all; so I just ensured that any error is a negative number (currently the one for OOM errors) and stuck whatever errors *did* match up together.

Consequently I don't know entirely *how* to write tests for this.
2020-01-04 19:00:49 -05:00
David Wendt fec95dd226 Add regression test for `idMap`. 2020-01-04 19:00:49 -05:00
David Wendt f3226537bf Implement `idMap`.
`idMap` is a strange property; it's only populated with nodes which had a given `id` *at the time of parsing*, and said nodes continue to be referenced even if the node is removed from the document. I have yet to find a way by which nodes can be deleted from `idMap`.

It also takes expandos, so this has to be a new retained object on the XML document. I originally considered not creating *another* `Object` impl and populating a regular `ScriptObject` with nodes, but that meant we couldn't lazy-instantiate their AVM1 side counterparts. Boo. :/
2020-01-04 19:00:48 -05:00
David Wendt 1722558d44 Add test for `XML.parseXML` 2020-01-04 19:00:47 -05:00
David Wendt 823e8602ff Impl `XML.parseXML` 2020-01-04 19:00:46 -05:00
David Wendt d00ef01965 Add a convenience method: `XMLNode.into_string` 2020-01-04 19:00:46 -05:00
David Wendt b4b722e1d6 Add another test for AVM1 XML's failure to roundtrip unsupported node types (e.g. comments). 2020-01-04 19:00:45 -05:00
David Wendt 2c790f1d41 Filter non-AS2 compatible nodes from toString output, and add non-SWF tests for XML filtering. 2020-01-04 19:00:45 -05:00
David Wendt ce1b958abb Add some more tests for XML namespace URIs. 2020-01-04 19:00:45 -05:00
David Wendt e2fa685d41 Fix tagname parsing.
There is a bug in `quick_xml` - or at least, I *think* it's a bug - where the `unescaped` method of `BytesStart` yields a bunch of attributes if you have slightly invalid crap in your tag like `xmlns:`. To work around it, I turned off unescaping; we're instead using `name` and ignoring unescaping. This will probably fail somewhere.
2020-01-04 19:00:44 -05:00
David Wendt e1034fce31 clippy compliance 2020-01-04 19:00:44 -05:00
David Wendt 7ac3204759 format prev commit 2020-01-04 19:00:43 -05:00
David Wendt d2aa3dd987 Add a test for `createElement` and `createTextNode`. 2020-01-04 19:00:43 -05:00
David Wendt db38982ffb For some reason, text nodes have an attributes object. 2020-01-04 19:00:42 -05:00
David Wendt 91155d6870 Text nodes have empty arrays for `childNodes` rather than being `undefined`. 2020-01-04 19:00:42 -05:00
David Wendt d28094a019 Implement `createElement` and `createTextNode`. 2020-01-04 19:00:42 -05:00
David Wendt 97bcb6b2dc Add an ignored test for `xmlDecl`.
Test is currently ignored because AS2 XML currently handles XML declarations in ways not compatible with our current parser. Investigating hacky ways around this.
2020-01-04 19:00:41 -05:00
David Wendt c02da74afa Expose the `<?xml ?>` declaration to ActionScript.
I can't write proper tests for this because our underlying XML parsing technology doesn't let us do what AS2 XML does: just copy the first xml tag out of the document and into a string. No, seriously, anything at the start of the parsed XML that starts with `<?xml` and ends with `?>` gets copied into Flash's moral equivalent of `xml::Document` as a string. We parse the whole thing, which is wrong, so we'll need to additionally retain the original xmldecl string in order to pass the test I wrote for this.
2020-01-04 19:00:41 -05:00
David Wendt ce0546fc2c Add test for `docTypeDecl`. 2020-01-04 19:00:40 -05:00
David Wendt a7a349b02b Expose `docTypeDecl` to ActionScript.
This also involves storing the `DocType` node on the document object and retrieving it later.
2020-01-04 19:00:40 -05:00
David Wendt a80aab1b08 Document roots can store an attributes object, even though they don't have attributes 2020-01-04 19:00:40 -05:00
David Wendt 6a472d32bb Filter incompatible nodes from the sibling and child lists. 2020-01-04 19:00:39 -05:00
David Wendt fd14d0c9df Doctype nodes should be represented as text nodes to ActionScript (if they somehow grab hold of them) 2020-01-04 19:00:38 -05:00
David Wendt 6b4bbee195 Create and store `DocType` nodes on the tree when we encounter a `<!DOCTYPE...>` tag. 2020-01-04 19:00:38 -05:00
David Wendt aa749dc1b0 Store the XML document version, encoding, and standalone flags. 2020-01-04 19:00:38 -05:00
David Wendt a869107480 The `DocumentRoot` node type should have it's own node type ID, and AS2 XML should filter it out. This also filters out comment nodes as text, which isn't technically wrong but we should do better 2020-01-04 19:00:37 -05:00
David Wendt 7965045d87 Add test for XMLNode.toString. 2020-01-04 19:00:37 -05:00
David Wendt 673f85f067 XMLNode type 1 is an element, not a text node. 2020-01-04 19:00:36 -05:00
David Wendt 88aa5f8004 Add extra whitespace to empty tags. 2020-01-04 19:00:36 -05:00
David Wendt 0c7a1fe667 Text and comment nodes are stored plain and must be escaped for XML 2020-01-04 19:00:36 -05:00
David Wendt c7e1f34a5d Print empty nodes as empty tags rather than start/end 2020-01-04 19:00:35 -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 bff851e6a4 Add test for insertBefore 2020-01-04 19:00:34 -05:00
David Wendt 34cbe2e04b insertNode rejects child nodes that already have a parent 2020-01-04 19:00:34 -05:00
David Wendt 7b4a509ebc Avoid double-borrows when moving a child within it's parent 2020-01-04 19:00:33 -05:00
David Wendt 7753e20fe3 Add a test for XML.removeNode(). 2020-01-04 19:00:33 -05:00
David Wendt 30266b2ce7 remove_child should also ensure the child disowns the parent. 2020-01-04 19:00:33 -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 1577f51730 Expose elided objects as pointers when debugging XML nodes 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 73da72db98 Add a test for `appendChild`. 2020-01-04 19:00:28 -05:00
David Wendt 7c95eff048 Flag an error if we accidentally introduce a second script object by accident. 2020-01-04 19:00:28 -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 1d1e493e0e Refactor the child adoption process to ensure the child also adopts it's siblings. 2020-01-04 19:00:23 -05:00
David Wendt 48d68bebc4 Implement `hasChildNodes()` and add test 2020-01-04 19:00:23 -05:00
David Wendt c58e866236 Add test for `cloneNode` 2020-01-04 19:00:22 -05:00
David Wendt 881dcb76ab `cloneNode` without arguments is morally equivalent to `false` 2020-01-04 19:00:21 -05:00
David Wendt 8e33566d07 Add namespacing test 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 fe7d2b5173 Extremely WIP impl of `lookup_uri_for_namespace` 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 08c0f273a6 Add sibling links to nodes. 2020-01-04 19:00:18 -05:00
David Wendt 7e45dee8cf Clippy said so. 2020-01-04 19:00:18 -05:00
David Wendt eec449422b `XMLDocument.roots` is not necessary since you can just get the children of it's node form anyway... 2020-01-04 19:00:18 -05:00
David Wendt f8f569440f Add very basic XML test 2020-01-04 19:00:17 -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 b491dd034e Don't overflow stack when debug-printing an entire document, either. 2020-01-04 19:00:16 -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 960e4dad90 Don't cause stack overflow when debug-printing XML nodes. 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 d058c83ac0 Document roots should accept children. 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 0fe0e4fe90 Separate `XMLName` into another module 2020-01-04 19:00:11 -05:00
David Wendt 3928c7cc51 Reject empty text nodes 2020-01-04 19:00:11 -05:00
David Wendt 7a9a16e598 Don't repeat yourself. 2020-01-04 19:00:11 -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 e2eb3d0bde Add a test of XMLDocument::from_str.
This test technically works, but the results were slightly surprising. If it turns out Flash works differently from `quick_xml`, we'll change this test to match Flash.
2020-01-04 19:00:10 -05:00
David Wendt 6ae5ae3038 Add Comment parsing support 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
David Wendt 89c9753520 Add rudimentary custom DOM impl on top of `quick_xml`.
`quick_xml` was chosen due to it's high performance and support for zero-copy use cases. However, we are not using `minidom`, which is the already-extant DOM impl that uses `quick_xml` as it's parsing provider. This is because `minidom` nodes are not amenable to garbage collection.

Specifically: we want to be able to construct a new `Object` variant that holds part of an XML node. However, `minidom::Element` directly owns it's children, meaning that we can't hold references to it from within `Object` while also keeping those objects to the `'gc` lifetime. Hence, we provide a GC-exclusive DOM implementation.

I ruled out solutions such as holding an entire XML tree in an `Rc` and having AVM objects that shadow them. This works for `SwfSlice` because indexing an array is cheap; but traversing a tree can get very expensive. XML is used in many places in Flash Player, so it's important that we treat it like a first-class citizen.
2020-01-04 18:48:17 -05:00
Mike Welsh 4ce67535b0 tests: Add test for Color 2020-01-03 20:31:32 -08: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 d0142f1d67 audio: Add AudioBackend::stop_sound 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
dependabot-preview[bot] a01e5b7854 build(deps): bump syn from 1.0.12 to 1.0.13
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.12 to 1.0.13.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.12...1.0.13)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-03 19:15:37 +00:00
dependabot-preview[bot] b4a47e17da build(deps): bump generational-arena from 0.2.6 to 0.2.7
Bumps [generational-arena](https://github.com/fitzgen/generational-arena) from 0.2.6 to 0.2.7.
- [Release notes](https://github.com/fitzgen/generational-arena/releases)
- [Changelog](https://github.com/fitzgen/generational-arena/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fitzgen/generational-arena/compare/0.2.6...0.2.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-03 19:14:43 +00:00
dependabot-preview[bot] 1048170235 build(deps): bump syn from 1.0.11 to 1.0.12
Bumps [syn](https://github.com/dtolnay/syn) from 1.0.11 to 1.0.12.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/1.0.11...1.0.12)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-03 08:24:29 +00:00
Mike Welsh 87158647d1 core: Implement keyPress button events 2019-12-24 03:06:03 -08:00
Mike Welsh 2f0963fa6c core: Fix button action with multiple conditions not firing (fix #195)
If a button event had both a keyPress condition and another
condition:

on(release, keyPress "A") { }

these actions would not fire on click, because it would still
check if the key was down (which doesn't apply to clicks!)

Fixes #195.
2019-12-22 15:55:03 -08:00
Nathan Adams 9000451d58 core: Implemented Mouse.show() & Mouse.hide() 2019-12-22 14:33:46 -08:00
Mike Welsh 4cdeec5b64 avm1: Fix number coercion in arithmetic ops
A lot of the arithmetic ops were still using SWFv4 style coercion
(`Value::into_number_v1`) even though they use full ECMA-262
coercion in SWF5+. This would cause `undefined` to turn into 0
isntead of NaN, for example.

Fixes disappearing player in Achievement Unlocked
(https://www.newgrounds.com/portal/view/474371)

It's possible even the older ops such as ActionAdd should do this,
too. Handcrafted bytecode will need to be used to test as you
cannot export these ops in newer SWF versions from the Flash IDE.
2019-12-22 03:01:58 -08:00
Mike Welsh c9e0bdeaf5 core: GC trace Button::object 2019-12-21 23:54:50 -08:00
Mike Welsh 1d8ae9154b tests: Add tests for AVM1 logical ops 2019-12-21 23:01:10 -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
Mike Welsh 00fdc74f1f tests: Add test for property updating in fast-forward gotos 2019-12-21 21:16:27 -08:00
Mike Welsh fd92bd5f78 core: Fix PlaceObject modifications in fast-forward gotos
When fast-forwarding with a goto, modifications were not taking
effect to objects that exist both in the starting and the final
frame.
2019-12-21 21:16:27 -08:00
Nathan Adams eedc4bbe24 core: Added Input backend, currently unimplemented, for polling user input 2019-12-21 19:08:06 -08:00
Nathan Adams 6c484fe29d core: Changed KeyCode into an enum that maps out every Flash key code 2019-12-21 19:08:06 -08:00
Mike Welsh d7df15989f core: Clear drag if object is removed while dragging 2019-12-21 16:28:41 -08:00
Mike Welsh 531e4d640d avm1: Implement StartDrag/EndDrag 2019-12-21 16:28:41 -08:00
Mike Welsh 713e959ce4 core: Implement DisplayObject::object for Button 2019-12-21 16:28:41 -08:00
Mike Welsh 4bd54cc2ea core: Fix DisplayObject::global_to_local and local_to_global 2019-12-21 16:28:41 -08:00
Mike Welsh f2d31b222b core: Implement DefineButtonCxform SWF tag
(Although nothing uses this... it was only used in SWF version 2
and below!)
2019-12-20 19:20:25 -08:00
dependabot-preview[bot] e8e0b83d23 build(deps): bump smallvec from 1.0.0 to 1.1.0
Bumps [smallvec](https://github.com/servo/rust-smallvec) from 1.0.0 to 1.1.0.
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.0.0...v1.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-20 22:36:07 +00:00
Mike Welsh 4026e22bbf core: Handle DefineButtonSound SWF tag
This plays sounds whenever a button is hovered/clicked. Fixes
gun sounds in Pico's School.
2019-12-20 01:08:28 -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 c4b446ff78 tests: Add test for functions closing over base clip 2019-12-19 17:30:50 -08:00
Mike Welsh 13c43ed171 tests: Update movieclip_hittest to verify points are in root coordinates 2019-12-19 12:35:56 -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 9079b69991 avm1: Push Undefined when trying to construct invalid object 2019-12-18 13:47:01 -08:00
Mike Welsh bb6a4c119c avm1: Warn and clear operand stack if not empty after execution
Add a check and clear the stack if it isn't empty at the end of
`run_stack_till_empty`. This is probably a bug on our side
and we a good place for breakpoints.
2019-12-18 13:47:01 -08:00
Mike Welsh 8b9aedc4c8 avm1: Fix extra stack frame in event handlers
When running an clip event handler (e.g. onEnterFrame), a stack
frame is pushed to get the property value. However, this frame
was causing an extra Undefined to be pushed on the operand stack in
`Avm1::retire_stack_frame`, which would blow out the stack.

Now this stack frame is popped after the property is resolved and
before the function is executed. The function will push its own
stack frame when it executes.
2019-12-18 13:47:01 -08:00