Commit Graph

514 Commits

Author SHA1 Message Date
Mike Welsh d2702464a5 avm1: TextField properties are emumerable and deletable 2020-06-24 11:02:21 -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 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 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 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
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 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 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 fa2da492a7 Allow ActionScript to control text field borders. 2020-06-20 19:55:58 -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 7a62a8e9ce Programmatically created text fields get a biased depth. 2020-06-20 19:53:34 -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
David Wendt 467fd9db80 Implement `TextField.length` in AVM1. 2020-06-20 19:26:44 -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 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 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 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 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 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
Mike Welsh 62cfeb3754 core: Assign default name to unnamed clips (fix #66) 2020-06-18 16:26:36 -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 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
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
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 0d53f0a952 chore: Fix new clippy lint about short variable names - fixes #668 2020-06-01 10:31:46 -07:00
Nathan Adams ddf2aa3ec1 avm1: Implement all of flash.geom.Point (#304) 2020-05-27 00:23:45 -07:00
CUB3D 590321133f core: Fix incorrect String.charCodeAt bounds check (close #633) 2020-05-25 13:35:41 -07: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
Mike Welsh 031f5d6501 core: Avoid undefined behavior in f64_to_wrapping functions 2020-05-13 02:41:50 -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 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
Nathan Adams 84f6b4d06e core: Set init_object values after prototype but before constructor 2020-05-03 12:46:55 -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 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 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
Nathan Adams b43d0c2430 core: Pass SwfMovies along to empty movie clips 2020-04-21 05:49:25 -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 6b48e77b61 avm1: Add TObject::set_proto 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
Mike Welsh b7d464f367 chore: Bump enumset to 1.0.0 2020-04-13 04:14:29 -07:00
Mike Welsh bd0d2031bc avm1: Implement Array.sort and constants 2020-04-01 18:46:12 -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 f7375c3700 avm1: Use `PropertyMap::get_index` for stage object properties 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