@swf2es/runtime 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/LICENSE.third-party +422 -0
- package/README.md +29 -2
- package/dist/avm1/activation.d.ts +108 -0
- package/dist/avm1/activation.d.ts.map +1 -0
- package/dist/avm1/activation.js +90 -0
- package/dist/avm1/activation.js.map +1 -0
- package/dist/avm1/case.d.ts +3 -0
- package/dist/avm1/case.d.ts.map +1 -0
- package/dist/avm1/case.js +250 -0
- package/dist/avm1/case.js.map +1 -0
- package/dist/avm1/clips.d.ts +68 -0
- package/dist/avm1/clips.d.ts.map +1 -0
- package/dist/avm1/clips.js +335 -0
- package/dist/avm1/clips.js.map +1 -0
- package/dist/avm1/control.d.ts +54 -0
- package/dist/avm1/control.d.ts.map +1 -0
- package/dist/avm1/control.js +281 -0
- package/dist/avm1/control.js.map +1 -0
- package/dist/avm1/errors.d.ts +49 -0
- package/dist/avm1/errors.d.ts.map +1 -0
- package/dist/avm1/errors.js +51 -0
- package/dist/avm1/errors.js.map +1 -0
- package/dist/avm1/functions.d.ts +94 -0
- package/dist/avm1/functions.d.ts.map +1 -0
- package/dist/avm1/functions.js +250 -0
- package/dist/avm1/functions.js.map +1 -0
- package/dist/avm1/globals/array.d.ts +8 -0
- package/dist/avm1/globals/array.d.ts.map +1 -0
- package/dist/avm1/globals/array.js +550 -0
- package/dist/avm1/globals/array.js.map +1 -0
- package/dist/avm1/globals/broadcaster.d.ts +22 -0
- package/dist/avm1/globals/broadcaster.d.ts.map +1 -0
- package/dist/avm1/globals/broadcaster.js +132 -0
- package/dist/avm1/globals/broadcaster.js.map +1 -0
- package/dist/avm1/globals/date.d.ts +10 -0
- package/dist/avm1/globals/date.d.ts.map +1 -0
- package/dist/avm1/globals/date.js +437 -0
- package/dist/avm1/globals/date.js.map +1 -0
- package/dist/avm1/globals/global.d.ts +23 -0
- package/dist/avm1/globals/global.d.ts.map +1 -0
- package/dist/avm1/globals/global.js +345 -0
- package/dist/avm1/globals/global.js.map +1 -0
- package/dist/avm1/globals/math.d.ts +7 -0
- package/dist/avm1/globals/math.d.ts.map +1 -0
- package/dist/avm1/globals/math.js +140 -0
- package/dist/avm1/globals/math.js.map +1 -0
- package/dist/avm1/globals/number.d.ts +11 -0
- package/dist/avm1/globals/number.d.ts.map +1 -0
- package/dist/avm1/globals/number.js +94 -0
- package/dist/avm1/globals/number.js.map +1 -0
- package/dist/avm1/globals/string.d.ts +8 -0
- package/dist/avm1/globals/string.d.ts.map +1 -0
- package/dist/avm1/globals/string.js +202 -0
- package/dist/avm1/globals/string.js.map +1 -0
- package/dist/avm1/globals/timers.d.ts +49 -0
- package/dist/avm1/globals/timers.d.ts.map +1 -0
- package/dist/avm1/globals/timers.js +130 -0
- package/dist/avm1/globals/timers.js.map +1 -0
- package/dist/avm1/host.d.ts +146 -0
- package/dist/avm1/host.d.ts.map +1 -0
- package/dist/avm1/host.js +6 -0
- package/dist/avm1/host.js.map +1 -0
- package/dist/avm1/index.d.ts +15 -0
- package/dist/avm1/index.d.ts.map +1 -0
- package/dist/avm1/index.js +15 -0
- package/dist/avm1/index.js.map +1 -0
- package/dist/avm1/inheritance.d.ts +25 -0
- package/dist/avm1/inheritance.d.ts.map +1 -0
- package/dist/avm1/inheritance.js +133 -0
- package/dist/avm1/inheritance.js.map +1 -0
- package/dist/avm1/numbers.d.ts +21 -0
- package/dist/avm1/numbers.d.ts.map +1 -0
- package/dist/avm1/numbers.js +299 -0
- package/dist/avm1/numbers.js.map +1 -0
- package/dist/avm1/objects.d.ts +245 -0
- package/dist/avm1/objects.d.ts.map +1 -0
- package/dist/avm1/objects.js +897 -0
- package/dist/avm1/objects.js.map +1 -0
- package/dist/avm1/operators.d.ts +45 -0
- package/dist/avm1/operators.d.ts.map +1 -0
- package/dist/avm1/operators.js +171 -0
- package/dist/avm1/operators.js.map +1 -0
- package/dist/avm1/realm.d.ts +126 -0
- package/dist/avm1/realm.d.ts.map +1 -0
- package/dist/avm1/realm.js +530 -0
- package/dist/avm1/realm.js.map +1 -0
- package/dist/avm1/runtime.d.ts +294 -0
- package/dist/avm1/runtime.d.ts.map +1 -0
- package/dist/avm1/runtime.js +883 -0
- package/dist/avm1/runtime.js.map +1 -0
- package/dist/avm1/scope.d.ts +77 -0
- package/dist/avm1/scope.d.ts.map +1 -0
- package/dist/avm1/scope.js +386 -0
- package/dist/avm1/scope.js.map +1 -0
- package/dist/avm1/urls.d.ts +25 -0
- package/dist/avm1/urls.d.ts.map +1 -0
- package/dist/avm1/urls.js +181 -0
- package/dist/avm1/urls.js.map +1 -0
- package/dist/avm1/values.d.ts +52 -0
- package/dist/avm1/values.d.ts.map +1 -0
- package/dist/avm1/values.js +98 -0
- package/dist/avm1/values.js.map +1 -0
- package/dist/avm2/amf-classes.d.ts +28 -0
- package/dist/avm2/amf-classes.d.ts.map +1 -0
- package/dist/avm2/amf-classes.js +67 -0
- package/dist/avm2/amf-classes.js.map +1 -0
- package/dist/avm2/amf.d.ts +96 -0
- package/dist/avm2/amf.d.ts.map +1 -0
- package/dist/avm2/amf.js +802 -0
- package/dist/avm2/amf.js.map +1 -0
- package/dist/avm2/array-conversion.d.ts +31 -0
- package/dist/avm2/array-conversion.d.ts.map +1 -0
- package/dist/avm2/array-conversion.js +101 -0
- package/dist/avm2/array-conversion.js.map +1 -0
- package/dist/avm2/builtin-library.d.ts +2 -0
- package/dist/avm2/builtin-library.d.ts.map +1 -0
- package/dist/avm2/builtin-library.js +22 -0
- package/dist/avm2/builtin-library.js.map +1 -0
- package/dist/avm2/cache-fill.d.ts +14 -0
- package/dist/avm2/cache-fill.d.ts.map +1 -0
- package/dist/avm2/cache-fill.js +87 -0
- package/dist/avm2/cache-fill.js.map +1 -0
- package/dist/avm2/classes.d.ts +17 -0
- package/dist/avm2/classes.d.ts.map +1 -0
- package/dist/avm2/classes.js +212 -0
- package/dist/avm2/classes.js.map +1 -0
- package/dist/avm2/definitions.d.ts +28 -0
- package/dist/avm2/definitions.d.ts.map +1 -0
- package/dist/avm2/definitions.js +70 -0
- package/dist/avm2/definitions.js.map +1 -0
- package/dist/avm2/descriptors.d.ts +118 -0
- package/dist/avm2/descriptors.d.ts.map +1 -0
- package/dist/avm2/descriptors.js +6 -0
- package/dist/avm2/descriptors.js.map +1 -0
- package/dist/avm2/dictionary-keys.d.ts +73 -0
- package/dist/avm2/dictionary-keys.d.ts.map +1 -0
- package/dist/avm2/dictionary-keys.js +296 -0
- package/dist/avm2/dictionary-keys.js.map +1 -0
- package/dist/avm2/domain-memory.d.ts +23 -0
- package/dist/avm2/domain-memory.d.ts.map +1 -0
- package/dist/avm2/domain-memory.js +76 -0
- package/dist/avm2/domain-memory.js.map +1 -0
- package/dist/avm2/domain.d.ts +108 -0
- package/dist/avm2/domain.d.ts.map +1 -0
- package/dist/avm2/domain.js +281 -0
- package/dist/avm2/domain.js.map +1 -0
- package/dist/avm2/dynamic-properties.d.ts +62 -0
- package/dist/avm2/dynamic-properties.d.ts.map +1 -0
- package/dist/avm2/dynamic-properties.js +183 -0
- package/dist/avm2/dynamic-properties.js.map +1 -0
- package/dist/avm2/enumeration.d.ts +75 -0
- package/dist/avm2/enumeration.d.ts.map +1 -0
- package/dist/avm2/enumeration.js +394 -0
- package/dist/avm2/enumeration.js.map +1 -0
- package/dist/avm2/errors.d.ts +20 -0
- package/dist/avm2/errors.d.ts.map +1 -0
- package/dist/avm2/errors.js +46 -0
- package/dist/avm2/errors.js.map +1 -0
- package/dist/avm2/float-library.d.ts +2 -0
- package/dist/avm2/float-library.d.ts.map +1 -0
- package/dist/avm2/float-library.js +67 -0
- package/dist/avm2/float-library.js.map +1 -0
- package/dist/avm2/float.d.ts +9 -0
- package/dist/avm2/float.d.ts.map +1 -0
- package/dist/avm2/float.js +27 -0
- package/dist/avm2/float.js.map +1 -0
- package/dist/avm2/hooks.d.ts +77 -0
- package/dist/avm2/hooks.d.ts.map +1 -0
- package/dist/avm2/hooks.js +20 -0
- package/dist/avm2/hooks.js.map +1 -0
- package/dist/avm2/index.d.ts +32 -0
- package/dist/avm2/index.d.ts.map +1 -0
- package/dist/avm2/index.js +39 -0
- package/dist/avm2/index.js.map +1 -0
- package/dist/avm2/messages.d.ts +2 -0
- package/dist/avm2/messages.d.ts.map +1 -0
- package/dist/avm2/messages.js +178 -0
- package/dist/avm2/messages.js.map +1 -0
- package/dist/avm2/method-factories.d.ts +35 -0
- package/dist/avm2/method-factories.d.ts.map +1 -0
- package/dist/avm2/method-factories.js +96 -0
- package/dist/avm2/method-factories.js.map +1 -0
- package/dist/avm2/modules.d.ts +40 -0
- package/dist/avm2/modules.d.ts.map +1 -0
- package/dist/avm2/modules.js +106 -0
- package/dist/avm2/modules.js.map +1 -0
- package/dist/avm2/names.d.ts +143 -0
- package/dist/avm2/names.d.ts.map +1 -0
- package/dist/avm2/names.js +249 -0
- package/dist/avm2/names.js.map +1 -0
- package/dist/avm2/natives/aliases.d.ts +3 -0
- package/dist/avm2/natives/aliases.d.ts.map +1 -0
- package/dist/avm2/natives/aliases.js +48 -0
- package/dist/avm2/natives/aliases.js.map +1 -0
- package/dist/avm2/natives/array.d.ts +5 -0
- package/dist/avm2/natives/array.d.ts.map +1 -0
- package/dist/avm2/natives/array.js +391 -0
- package/dist/avm2/natives/array.js.map +1 -0
- package/dist/avm2/natives/bytearray.d.ts +180 -0
- package/dist/avm2/natives/bytearray.d.ts.map +1 -0
- package/dist/avm2/natives/bytearray.js +1228 -0
- package/dist/avm2/natives/bytearray.js.map +1 -0
- package/dist/avm2/natives/case.d.ts +5 -0
- package/dist/avm2/natives/case.d.ts.map +1 -0
- package/dist/avm2/natives/case.js +89 -0
- package/dist/avm2/natives/case.js.map +1 -0
- package/dist/avm2/natives/concurrent.d.ts +24 -0
- package/dist/avm2/natives/concurrent.d.ts.map +1 -0
- package/dist/avm2/natives/concurrent.js +200 -0
- package/dist/avm2/natives/concurrent.js.map +1 -0
- package/dist/avm2/natives/date.d.ts +5 -0
- package/dist/avm2/natives/date.d.ts.map +1 -0
- package/dist/avm2/natives/date.js +582 -0
- package/dist/avm2/natives/date.js.map +1 -0
- package/dist/avm2/natives/define.d.ts +58 -0
- package/dist/avm2/natives/define.d.ts.map +1 -0
- package/dist/avm2/natives/define.js +131 -0
- package/dist/avm2/natives/define.js.map +1 -0
- package/dist/avm2/natives/describe.d.ts +3 -0
- package/dist/avm2/natives/describe.d.ts.map +1 -0
- package/dist/avm2/natives/describe.js +352 -0
- package/dist/avm2/natives/describe.js.map +1 -0
- package/dist/avm2/natives/dictionary.d.ts +3 -0
- package/dist/avm2/natives/dictionary.d.ts.map +1 -0
- package/dist/avm2/natives/dictionary.js +13 -0
- package/dist/avm2/natives/dictionary.js.map +1 -0
- package/dist/avm2/natives/float-vector.d.ts +20 -0
- package/dist/avm2/natives/float-vector.d.ts.map +1 -0
- package/dist/avm2/natives/float-vector.js +82 -0
- package/dist/avm2/natives/float-vector.js.map +1 -0
- package/dist/avm2/natives/float.d.ts +5 -0
- package/dist/avm2/natives/float.d.ts.map +1 -0
- package/dist/avm2/natives/float.js +97 -0
- package/dist/avm2/natives/float.js.map +1 -0
- package/dist/avm2/natives/index.d.ts +7 -0
- package/dist/avm2/natives/index.d.ts.map +1 -0
- package/dist/avm2/natives/index.js +65 -0
- package/dist/avm2/natives/index.js.map +1 -0
- package/dist/avm2/natives/json.d.ts +3 -0
- package/dist/avm2/natives/json.d.ts.map +1 -0
- package/dist/avm2/natives/json.js +515 -0
- package/dist/avm2/natives/json.js.map +1 -0
- package/dist/avm2/natives/number.d.ts +15 -0
- package/dist/avm2/natives/number.d.ts.map +1 -0
- package/dist/avm2/natives/number.js +163 -0
- package/dist/avm2/natives/number.js.map +1 -0
- package/dist/avm2/natives/object.d.ts +8 -0
- package/dist/avm2/natives/object.d.ts.map +1 -0
- package/dist/avm2/natives/object.js +238 -0
- package/dist/avm2/natives/object.js.map +1 -0
- package/dist/avm2/natives/proxy.d.ts +5 -0
- package/dist/avm2/natives/proxy.d.ts.map +1 -0
- package/dist/avm2/natives/proxy.js +76 -0
- package/dist/avm2/natives/proxy.js.map +1 -0
- package/dist/avm2/natives/regexp.d.ts +21 -0
- package/dist/avm2/natives/regexp.d.ts.map +1 -0
- package/dist/avm2/natives/regexp.js +486 -0
- package/dist/avm2/natives/regexp.js.map +1 -0
- package/dist/avm2/natives/shell-workers.d.ts +140 -0
- package/dist/avm2/natives/shell-workers.d.ts.map +1 -0
- package/dist/avm2/natives/shell-workers.js +405 -0
- package/dist/avm2/natives/shell-workers.js.map +1 -0
- package/dist/avm2/natives/shell.d.ts +12 -0
- package/dist/avm2/natives/shell.d.ts.map +1 -0
- package/dist/avm2/natives/shell.js +558 -0
- package/dist/avm2/natives/shell.js.map +1 -0
- package/dist/avm2/natives/sort.d.ts +7 -0
- package/dist/avm2/natives/sort.d.ts.map +1 -0
- package/dist/avm2/natives/sort.js +378 -0
- package/dist/avm2/natives/sort.js.map +1 -0
- package/dist/avm2/natives/string.d.ts +5 -0
- package/dist/avm2/natives/string.d.ts.map +1 -0
- package/dist/avm2/natives/string.js +133 -0
- package/dist/avm2/natives/string.js.map +1 -0
- package/dist/avm2/natives/sync.d.ts +215 -0
- package/dist/avm2/natives/sync.d.ts.map +1 -0
- package/dist/avm2/natives/sync.js +822 -0
- package/dist/avm2/natives/sync.js.map +1 -0
- package/dist/avm2/natives/toplevel.d.ts +5 -0
- package/dist/avm2/natives/toplevel.d.ts.map +1 -0
- package/dist/avm2/natives/toplevel.js +140 -0
- package/dist/avm2/natives/toplevel.js.map +1 -0
- package/dist/avm2/natives/vector-elements.d.ts +10 -0
- package/dist/avm2/natives/vector-elements.d.ts.map +1 -0
- package/dist/avm2/natives/vector-elements.js +47 -0
- package/dist/avm2/natives/vector-elements.js.map +1 -0
- package/dist/avm2/natives/vector.d.ts +5 -0
- package/dist/avm2/natives/vector.d.ts.map +1 -0
- package/dist/avm2/natives/vector.js +407 -0
- package/dist/avm2/natives/vector.js.map +1 -0
- package/dist/avm2/natives/xml/access.d.ts +34 -0
- package/dist/avm2/natives/xml/access.d.ts.map +1 -0
- package/dist/avm2/natives/xml/access.js +634 -0
- package/dist/avm2/natives/xml/access.js.map +1 -0
- package/dist/avm2/natives/xml/build.d.ts +11 -0
- package/dist/avm2/natives/xml/build.d.ts.map +1 -0
- package/dist/avm2/natives/xml/build.js +292 -0
- package/dist/avm2/natives/xml/build.js.map +1 -0
- package/dist/avm2/natives/xml/chars.d.ts +9 -0
- package/dist/avm2/natives/xml/chars.d.ts.map +1 -0
- package/dist/avm2/natives/xml/chars.js +113 -0
- package/dist/avm2/natives/xml/chars.js.map +1 -0
- package/dist/avm2/natives/xml/escape.d.ts +5 -0
- package/dist/avm2/natives/xml/escape.d.ts.map +1 -0
- package/dist/avm2/natives/xml/escape.js +39 -0
- package/dist/avm2/natives/xml/escape.js.map +1 -0
- package/dist/avm2/natives/xml/names.d.ts +46 -0
- package/dist/avm2/natives/xml/names.d.ts.map +1 -0
- package/dist/avm2/natives/xml/names.js +205 -0
- package/dist/avm2/natives/xml/names.js.map +1 -0
- package/dist/avm2/natives/xml/node.d.ts +94 -0
- package/dist/avm2/natives/xml/node.d.ts.map +1 -0
- package/dist/avm2/natives/xml/node.js +273 -0
- package/dist/avm2/natives/xml/node.js.map +1 -0
- package/dist/avm2/natives/xml/operators.d.ts +7 -0
- package/dist/avm2/natives/xml/operators.d.ts.map +1 -0
- package/dist/avm2/natives/xml/operators.js +70 -0
- package/dist/avm2/natives/xml/operators.js.map +1 -0
- package/dist/avm2/natives/xml/parser.d.ts +51 -0
- package/dist/avm2/natives/xml/parser.d.ts.map +1 -0
- package/dist/avm2/natives/xml/parser.js +357 -0
- package/dist/avm2/natives/xml/parser.js.map +1 -0
- package/dist/avm2/natives/xml/strings.d.ts +10 -0
- package/dist/avm2/natives/xml/strings.d.ts.map +1 -0
- package/dist/avm2/natives/xml/strings.js +192 -0
- package/dist/avm2/natives/xml/strings.js.map +1 -0
- package/dist/avm2/natives/xml/values.d.ts +48 -0
- package/dist/avm2/natives/xml/values.d.ts.map +1 -0
- package/dist/avm2/natives/xml/values.js +123 -0
- package/dist/avm2/natives/xml/values.js.map +1 -0
- package/dist/avm2/natives/xml/xml.d.ts +5 -0
- package/dist/avm2/natives/xml/xml.d.ts.map +1 -0
- package/dist/avm2/natives/xml/xml.js +646 -0
- package/dist/avm2/natives/xml/xml.js.map +1 -0
- package/dist/avm2/number-strings.d.ts +28 -0
- package/dist/avm2/number-strings.d.ts.map +1 -0
- package/dist/avm2/number-strings.js +111 -0
- package/dist/avm2/number-strings.js.map +1 -0
- package/dist/avm2/numbers.d.ts +12 -0
- package/dist/avm2/numbers.d.ts.map +1 -0
- package/dist/avm2/numbers.js +559 -0
- package/dist/avm2/numbers.js.map +1 -0
- package/dist/avm2/options.d.ts +105 -0
- package/dist/avm2/options.d.ts.map +1 -0
- package/dist/avm2/options.js +17 -0
- package/dist/avm2/options.js.map +1 -0
- package/dist/avm2/player-messages.d.ts +3 -0
- package/dist/avm2/player-messages.d.ts.map +1 -0
- package/dist/avm2/player-messages.js +551 -0
- package/dist/avm2/player-messages.js.map +1 -0
- package/dist/avm2/property-cache.d.ts +61 -0
- package/dist/avm2/property-cache.d.ts.map +1 -0
- package/dist/avm2/property-cache.js +136 -0
- package/dist/avm2/property-cache.js.map +1 -0
- package/dist/avm2/runtime.d.ts +588 -0
- package/dist/avm2/runtime.d.ts.map +1 -0
- package/dist/avm2/runtime.js +2645 -0
- package/dist/avm2/runtime.js.map +1 -0
- package/dist/avm2/traits.d.ts +233 -0
- package/dist/avm2/traits.d.ts.map +1 -0
- package/dist/avm2/traits.js +510 -0
- package/dist/avm2/traits.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -3
- package/src/avm1/activation.ts +114 -0
- package/src/avm1/case.ts +257 -0
- package/src/avm1/clips.ts +440 -0
- package/src/avm1/control.ts +339 -0
- package/src/avm1/errors.ts +60 -0
- package/src/avm1/functions.ts +271 -0
- package/src/avm1/globals/array.ts +676 -0
- package/src/avm1/globals/broadcaster.ts +185 -0
- package/src/avm1/globals/date.ts +548 -0
- package/src/avm1/globals/global.ts +420 -0
- package/src/avm1/globals/math.ts +152 -0
- package/src/avm1/globals/number.ts +122 -0
- package/src/avm1/globals/string.ts +254 -0
- package/src/avm1/globals/timers.ts +144 -0
- package/src/avm1/host.ts +155 -0
- package/src/avm1/index.ts +69 -0
- package/src/avm1/inheritance.ts +159 -0
- package/src/avm1/numbers.ts +348 -0
- package/src/avm1/objects.ts +1080 -0
- package/src/avm1/operators.ts +229 -0
- package/src/avm1/realm.ts +704 -0
- package/src/avm1/runtime.ts +1291 -0
- package/src/avm1/scope.ts +482 -0
- package/src/avm1/urls.ts +226 -0
- package/src/avm1/values.ts +145 -0
- package/src/avm2/amf-classes.ts +80 -0
- package/src/avm2/amf.ts +913 -0
- package/src/avm2/array-conversion.ts +117 -0
- package/src/avm2/builtin-library.ts +28 -0
- package/src/avm2/cache-fill.ts +124 -0
- package/src/avm2/classes.ts +235 -0
- package/src/avm2/definitions.ts +93 -0
- package/src/avm2/descriptors.ts +137 -0
- package/src/avm2/dictionary-keys.ts +345 -0
- package/src/avm2/domain-memory.ts +95 -0
- package/src/avm2/domain.ts +335 -0
- package/src/avm2/dynamic-properties.ts +209 -0
- package/src/avm2/enumeration.ts +506 -0
- package/src/avm2/errors.ts +54 -0
- package/src/avm2/float-library.ts +66 -0
- package/src/avm2/float.ts +31 -0
- package/src/avm2/hooks.ts +97 -0
- package/src/avm2/index.ts +84 -0
- package/src/avm2/messages.ts +178 -0
- package/src/avm2/method-factories.ts +130 -0
- package/src/avm2/modules.ts +120 -0
- package/src/avm2/names.ts +292 -0
- package/src/avm2/natives/aliases.ts +59 -0
- package/src/avm2/natives/array.ts +482 -0
- package/src/avm2/natives/bytearray.ts +1474 -0
- package/src/avm2/natives/case.ts +98 -0
- package/src/avm2/natives/concurrent.ts +268 -0
- package/src/avm2/natives/date.ts +678 -0
- package/src/avm2/natives/define.ts +176 -0
- package/src/avm2/natives/describe.ts +426 -0
- package/src/avm2/natives/dictionary.ts +18 -0
- package/src/avm2/natives/float-vector.ts +99 -0
- package/src/avm2/natives/float.ts +116 -0
- package/src/avm2/natives/index.ts +70 -0
- package/src/avm2/natives/json.ts +600 -0
- package/src/avm2/natives/number.ts +194 -0
- package/src/avm2/natives/object.ts +272 -0
- package/src/avm2/natives/proxy.ts +98 -0
- package/src/avm2/natives/regexp.ts +580 -0
- package/src/avm2/natives/shell-workers.ts +474 -0
- package/src/avm2/natives/shell.ts +707 -0
- package/src/avm2/natives/sort.ts +438 -0
- package/src/avm2/natives/string.ts +158 -0
- package/src/avm2/natives/sync.ts +964 -0
- package/src/avm2/natives/toplevel.ts +163 -0
- package/src/avm2/natives/vector-elements.ts +61 -0
- package/src/avm2/natives/vector.ts +511 -0
- package/src/avm2/natives/xml/access.ts +767 -0
- package/src/avm2/natives/xml/build.ts +381 -0
- package/src/avm2/natives/xml/chars.ts +127 -0
- package/src/avm2/natives/xml/escape.ts +46 -0
- package/src/avm2/natives/xml/names.ts +256 -0
- package/src/avm2/natives/xml/node.ts +339 -0
- package/src/avm2/natives/xml/operators.ts +90 -0
- package/src/avm2/natives/xml/parser.ts +414 -0
- package/src/avm2/natives/xml/strings.ts +241 -0
- package/src/avm2/natives/xml/values.ts +162 -0
- package/src/avm2/natives/xml/xml.ts +829 -0
- package/src/avm2/number-strings.ts +127 -0
- package/src/avm2/numbers.ts +605 -0
- package/src/avm2/options.ts +125 -0
- package/src/avm2/player-messages.ts +552 -0
- package/src/avm2/property-cache.ts +160 -0
- package/src/avm2/runtime.ts +3274 -0
- package/src/avm2/traits.ts +584 -0
- package/src/index.ts +8 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
// E4X's names: property names coerced to XML names, and the Namespaces
|
|
2
|
+
// and QNames E4X makes and compares.
|
|
3
|
+
//
|
|
4
|
+
// Translated from avmplus' core/XMLObject.cpp, XMLListObject.cpp and E4X's
|
|
5
|
+
// parts of Toplevel.cpp and AvmCore.cpp, this file is subject to the
|
|
6
|
+
// Mozilla Public License, v. 2.0: http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
import type { AsObject, Value } from "../../descriptors.js";
|
|
9
|
+
import {
|
|
10
|
+
CONSTANT_Qname,
|
|
11
|
+
CONSTANT_QnameA,
|
|
12
|
+
type Multiname,
|
|
13
|
+
Namespace,
|
|
14
|
+
NS_Public,
|
|
15
|
+
namespace,
|
|
16
|
+
prefixedNamespace,
|
|
17
|
+
prefixOf,
|
|
18
|
+
publicNs,
|
|
19
|
+
} from "../../names.js";
|
|
20
|
+
import type { Runtime } from "../../runtime.js";
|
|
21
|
+
import { isXMLName } from "./chars.js";
|
|
22
|
+
import { ATTRIBUTE, ELEMENT, matches, type XMLNode, type XName } from "./node.js";
|
|
23
|
+
import { ANY, e4x, NAMESPACE_WITH_PREFIX_AND_NO_URI } from "./values.js";
|
|
24
|
+
|
|
25
|
+
// Names.
|
|
26
|
+
|
|
27
|
+
/** As String::parseIndex: a name's index, or -1. */
|
|
28
|
+
export function parseIndex(name: string): number {
|
|
29
|
+
const c = name.charCodeAt(0);
|
|
30
|
+
if (!(c >= 0x30 && c <= 0x39)) {
|
|
31
|
+
return -1;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const i = Number(name);
|
|
35
|
+
return i >>> 0 === i && i !== 0xffffffff && String(i) === name ? i : -1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** An index name: not any name, nor an attribute's. */
|
|
39
|
+
export const indexOf = (n: XName): number =>
|
|
40
|
+
n.attribute || n.local === null ? -1 : parseIndex(n.local);
|
|
41
|
+
|
|
42
|
+
/** Whether `ns` is `other`, prefix, URI and kind, as CoerceE4XMultiname compares them. */
|
|
43
|
+
const sameNamespace = (ns: Namespace | null, other: Namespace): boolean =>
|
|
44
|
+
ns !== null && ns.uri === other.uri && ns.kind === other.kind && prefixOf(ns) === prefixOf(other);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* As CoerceE4XMultiname: an unqualified name in the default XML namespace
|
|
48
|
+
* too, and a name of "*" or starting with "@" as any name or an
|
|
49
|
+
* attribute's.
|
|
50
|
+
*/
|
|
51
|
+
export function coerce(rt: Runtime, n: XName): XName {
|
|
52
|
+
let namespaces = n.namespaces;
|
|
53
|
+
if (!n.qualified && namespaces !== null) {
|
|
54
|
+
const dxns = rt.defaultXmlNamespace;
|
|
55
|
+
if (!namespaces.some((ns) => sameNamespace(ns, dxns))) {
|
|
56
|
+
namespaces = [...namespaces, dxns];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let local = n.local;
|
|
61
|
+
let attribute = n.attribute;
|
|
62
|
+
if (local === "*") {
|
|
63
|
+
local = null;
|
|
64
|
+
} else if (local !== null && local.charCodeAt(0) === 0x40 && !attribute) {
|
|
65
|
+
local = local === "@*" ? null : local.slice(1);
|
|
66
|
+
attribute = true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (namespaces === n.namespaces && local === n.local && attribute === n.attribute) {
|
|
70
|
+
return n;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return { local, namespaces, attribute, qualified: n.qualified };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** A property's multiname as E4X names: a Qname is qualified, its namespace null for any. */
|
|
77
|
+
export function fromMultiname(mn: Multiname): XName {
|
|
78
|
+
const qualified = mn.kind === CONSTANT_Qname || mn.kind === CONSTANT_QnameA;
|
|
79
|
+
const all = mn.namespaces;
|
|
80
|
+
let namespaces: Namespace[] | null;
|
|
81
|
+
if (qualified) {
|
|
82
|
+
namespaces = all[0] ? [all[0]] : null;
|
|
83
|
+
} else {
|
|
84
|
+
namespaces = all.some((ns) => ns === null) ? null : (all as Namespace[]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return { local: mn.name, namespaces, attribute: mn.attribute, qualified };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* As ToXMLName: a name for a method's argument, as XML's child() takes
|
|
92
|
+
* one. A QName is its local name, in a namespace of its URI; anything else
|
|
93
|
+
* is its string, in the public namespace: "@name" an attribute's, "*" any.
|
|
94
|
+
*/
|
|
95
|
+
export function toXMLName(rt: Runtime, p: Value): XName {
|
|
96
|
+
if (p === null || p === undefined) {
|
|
97
|
+
throw rt.error("TypeError", 1010);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let s: string;
|
|
101
|
+
if (p instanceof Namespace) {
|
|
102
|
+
s = p.uri ?? "";
|
|
103
|
+
} else if (p.$local !== undefined) {
|
|
104
|
+
// avmplus makes the namespace of the URI's string: "null" for any.
|
|
105
|
+
return {
|
|
106
|
+
local: p.$local,
|
|
107
|
+
namespaces: [namespace(NS_Public, p.$ns ? p.$ns.uri : "null")],
|
|
108
|
+
attribute: p.$attr === true,
|
|
109
|
+
qualified: false,
|
|
110
|
+
};
|
|
111
|
+
} else {
|
|
112
|
+
s = rt.toString(p);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let local: string | null = s;
|
|
116
|
+
let attribute = false;
|
|
117
|
+
if (s.charCodeAt(0) === 0x40) {
|
|
118
|
+
local = s.slice(1);
|
|
119
|
+
attribute = true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (local === "*") {
|
|
123
|
+
local = null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return { local, namespaces: [publicNs], attribute, qualified: false };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** As ToAttributeName and then ToXMLName: an attribute's name for XML's attribute(). */
|
|
130
|
+
export function toAttributeName(rt: Runtime, v: Value): XName {
|
|
131
|
+
if (v === null || v === undefined || typeof v === "number" || typeof v === "boolean") {
|
|
132
|
+
throw rt.error("TypeError", 1010);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (typeof v === "object" && !(v instanceof Namespace) && v.$local !== undefined) {
|
|
136
|
+
return { ...toXMLName(rt, v), attribute: true };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const s = v instanceof Namespace ? (v.uri ?? "") : rt.toString(v);
|
|
140
|
+
const uri = s === "*" ? "null" : rt.defaultXmlNamespace.uri;
|
|
141
|
+
return {
|
|
142
|
+
local: s === "*" ? null : s,
|
|
143
|
+
namespaces: [namespace(NS_Public, uri)],
|
|
144
|
+
attribute: true,
|
|
145
|
+
qualified: false,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Whether `n` names child `child`: only an element has a name to match. */
|
|
150
|
+
export const matchesChild = (n: XName, child: XMLNode) =>
|
|
151
|
+
matches(n, child.kind === ELEMENT ? child : null);
|
|
152
|
+
|
|
153
|
+
// Namespaces and QNames.
|
|
154
|
+
|
|
155
|
+
/** As AvmCore::newNamespace(uri): a Namespace's own, a QName's URI's, or of a string. */
|
|
156
|
+
export function newNamespace(rt: Runtime, uri: Value): Namespace {
|
|
157
|
+
if (uri instanceof Namespace) {
|
|
158
|
+
return uri;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (typeof uri === "object" && uri !== null && uri.$local !== undefined && uri.$ns) {
|
|
162
|
+
return namespace(NS_Public, uri.$ns.uri);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return namespace(NS_Public, rt.toString(uri));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* As AvmCore::newNamespace(prefix, uri): a namespace with a prefix, none
|
|
170
|
+
* if it is not an XML name, or null for a prefix of the empty URI.
|
|
171
|
+
*/
|
|
172
|
+
export function newPrefixedNamespace(rt: Runtime, prefix: Value, uri: Value): Namespace | null {
|
|
173
|
+
const u =
|
|
174
|
+
typeof uri === "object" && uri !== null && uri.$local !== undefined && uri.$ns
|
|
175
|
+
? (uri.$ns.uri as string)
|
|
176
|
+
: rt.toString(uri);
|
|
177
|
+
if (u === "") {
|
|
178
|
+
return prefix === undefined || rt.toString(prefix) === "" ? publicNs : null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (prefix === undefined) {
|
|
182
|
+
return namespace(NS_Public, u);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const p = rt.toString(prefix);
|
|
186
|
+
if (p !== "" && !isXMLName(p)) {
|
|
187
|
+
return namespace(NS_Public, u);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return prefixedNamespace(p, u);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** As NamespaceClass::construct: Namespace(), Namespace(uri) or Namespace(prefix, uri). */
|
|
194
|
+
export function constructNamespace(rt: Runtime, args: Value[]): Namespace {
|
|
195
|
+
if (args.length === 0) {
|
|
196
|
+
return publicNs;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (args.length === 1) {
|
|
200
|
+
return newNamespace(rt, args[0]);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const p = rt.toString(args[0]);
|
|
204
|
+
if (p.length && !rt.toString(args[1]).length) {
|
|
205
|
+
throw rt.error("TypeError", NAMESPACE_WITH_PREFIX_AND_NO_URI, p);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return newPrefixedNamespace(rt, args[0], args[1]) ?? publicNs;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** A QName object of a node's name, as XML's name() gives it. */
|
|
212
|
+
export function qnameOf(rt: Runtime, node: XMLNode): AsObject {
|
|
213
|
+
const q = e4x(rt).qname.instance();
|
|
214
|
+
q.$ns = node.ns;
|
|
215
|
+
q.$local = node.name;
|
|
216
|
+
q.$attr = node.kind === ATTRIBUTE;
|
|
217
|
+
return q;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* As QNameObject(name), with no namespace: a QName's name, else any name
|
|
222
|
+
* in any namespace for "*", or the name in the default XML namespace.
|
|
223
|
+
*/
|
|
224
|
+
export function qnameName(rt: Runtime, name: Value): XName {
|
|
225
|
+
if (typeof name === "object" && name !== null && name.$local !== undefined) {
|
|
226
|
+
return {
|
|
227
|
+
local: name.$local,
|
|
228
|
+
namespaces: name.$ns ? [name.$ns] : null,
|
|
229
|
+
attribute: name.$attr === true,
|
|
230
|
+
qualified: name.$ns !== null,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const s = name === undefined ? "" : rt.toString(name);
|
|
235
|
+
if (s === "*") {
|
|
236
|
+
return ANY;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return { local: s, namespaces: [rt.defaultXmlNamespace], attribute: false, qualified: true };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** As GetNamespace: the namespace of `ns`'s URI among `list`, else one of its URI. */
|
|
243
|
+
export function getNamespace(ns: Namespace, list: Namespace[]): Namespace {
|
|
244
|
+
for (const ns2 of list) {
|
|
245
|
+
if (ns2.uri === ns.uri) {
|
|
246
|
+
return ns2;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return namespace(NS_Public, ns.uri);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export const hasPrefix = (ns: Namespace) => {
|
|
254
|
+
const p = prefixOf(ns);
|
|
255
|
+
return p !== undefined && p !== "";
|
|
256
|
+
};
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
// E4X's tree, as avmplus' E4XNode: elements with their attributes, the
|
|
2
|
+
// namespaces they declare and their children; text, CDATA, comments,
|
|
3
|
+
// processing instructions and attributes with their values. Each node has
|
|
4
|
+
// its parent, and one XML object stands for it (see values.ts), so that XML
|
|
5
|
+
// values compare by the node they are.
|
|
6
|
+
//
|
|
7
|
+
// Translated from avmplus' core/E4XNode.cpp, this file is subject to the
|
|
8
|
+
// Mozilla Public License, v. 2.0: http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
import type { AsObject, Value } from "../../descriptors.js";
|
|
11
|
+
import { type Namespace, NS_Public, prefixedNamespace, prefixOf, publicNs } from "../../names.js";
|
|
12
|
+
|
|
13
|
+
// The node kinds, as E4XNode's NodeTypes: bits, so a set of them is a mask.
|
|
14
|
+
export const ATTRIBUTE = 0x02;
|
|
15
|
+
export const TEXT = 0x04;
|
|
16
|
+
/** Text, written back as CDATA. */
|
|
17
|
+
export const CDATA = 0x08;
|
|
18
|
+
export const COMMENT = 0x10;
|
|
19
|
+
export const PROCESSING_INSTRUCTION = 0x20;
|
|
20
|
+
export const ELEMENT = 0x40;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A name as E4X matches one against a node's, as avmplus' Multiname: its
|
|
24
|
+
* local name, null for any; its namespaces, null for any; whether it names
|
|
25
|
+
* attributes; and whether it is qualified, one namespace given, as ns::*,
|
|
26
|
+
* not a set of them, as a plain *.
|
|
27
|
+
*/
|
|
28
|
+
export interface XName {
|
|
29
|
+
local: string | null;
|
|
30
|
+
namespaces: Namespace[] | null;
|
|
31
|
+
attribute: boolean;
|
|
32
|
+
qualified: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class XMLNode {
|
|
36
|
+
parent: XMLNode | null = null;
|
|
37
|
+
/** Its local name; null for a node without one (text, CDATA, a comment). */
|
|
38
|
+
name: string | null = null;
|
|
39
|
+
/** Its name's namespace, when it has a name: public for none. */
|
|
40
|
+
ns: Namespace = publicNs;
|
|
41
|
+
/** The value of a node that is not an element. */
|
|
42
|
+
value = "";
|
|
43
|
+
/** An element's attributes, in order. */
|
|
44
|
+
readonly attributes: XMLNode[] = [];
|
|
45
|
+
/** The namespaces an element declares. */
|
|
46
|
+
readonly namespaces: Namespace[] = [];
|
|
47
|
+
/** An element's children. */
|
|
48
|
+
readonly children: XMLNode[] = [];
|
|
49
|
+
/** A function called on changes to an element, as setNotification sets it. */
|
|
50
|
+
notification: Value = null;
|
|
51
|
+
/** The XML object that stands for this node, once made. */
|
|
52
|
+
object: AsObject | null = null;
|
|
53
|
+
|
|
54
|
+
constructor(
|
|
55
|
+
readonly kind: number,
|
|
56
|
+
value = "",
|
|
57
|
+
) {
|
|
58
|
+
this.value = value;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** As setQName: a name in no namespace, or the public one, is kept as public. */
|
|
62
|
+
setName(name: string | null, ns: Namespace | null): void {
|
|
63
|
+
this.name = name;
|
|
64
|
+
if (!ns || (ns.kind === NS_Public && ns.uri === "")) {
|
|
65
|
+
this.ns = publicNs;
|
|
66
|
+
} else {
|
|
67
|
+
this.ns = ns;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* As getQName: its name, if it has one; qualified unless public, which
|
|
73
|
+
* E4X then looks up in the default namespace too.
|
|
74
|
+
*/
|
|
75
|
+
xname(): XName | null {
|
|
76
|
+
if (this.name === null) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
local: this.name,
|
|
82
|
+
namespaces: [this.ns],
|
|
83
|
+
attribute: this.kind === ATTRIBUTE,
|
|
84
|
+
qualified: this.ns !== publicNs,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** As _append: `child` its last child. */
|
|
89
|
+
append(child: XMLNode): void {
|
|
90
|
+
child.parent = this;
|
|
91
|
+
this.children.push(child);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* As ElementE4XNode::_addInScopeNamespace: declare `ns` here, replacing
|
|
96
|
+
* one with its prefix but another URI; the name, and attributes', in a
|
|
97
|
+
* namespace with its prefix lose the prefix.
|
|
98
|
+
*/
|
|
99
|
+
addInScopeNamespace(ns: Namespace | null): void {
|
|
100
|
+
if (this.kind !== ELEMENT || !ns || prefixOf(ns) === undefined) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const prefix = prefixOf(ns);
|
|
105
|
+
if (prefix === "" && this.name !== null && this.ns.uri === "") {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let index = -1;
|
|
110
|
+
for (let i = 0; i < this.namespaces.length; i++) {
|
|
111
|
+
if (prefixOf(this.namespaces[i]) === prefix) {
|
|
112
|
+
index = i;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (index !== -1 && this.namespaces[index].uri !== ns.uri) {
|
|
117
|
+
this.namespaces.splice(index, 1);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.namespaces.push(ns);
|
|
121
|
+
if (this.name !== null && prefixOf(this.ns) === prefix) {
|
|
122
|
+
this.setName(this.name, prefixedNamespace(undefined, this.ns.uri ?? ""));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
for (const attribute of this.attributes) {
|
|
126
|
+
if (attribute.name !== null && prefixOf(attribute.ns) === prefix) {
|
|
127
|
+
attribute.setName(attribute.name, prefixedNamespace(undefined, attribute.ns.uri ?? ""));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* As FindMatchingNamespace: the index of a declared namespace with `ns`'s
|
|
134
|
+
* URI and, if it has one, its prefix; -1 if none, or if one with its URI
|
|
135
|
+
* has the empty prefix.
|
|
136
|
+
*/
|
|
137
|
+
findMatchingNamespace(ns: Namespace): number {
|
|
138
|
+
for (let i = 0; i < this.namespaces.length; i++) {
|
|
139
|
+
const ns2 = this.namespaces[i];
|
|
140
|
+
if (ns2.uri === ns.uri) {
|
|
141
|
+
if (prefixOf(ns) === undefined) {
|
|
142
|
+
return i;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (prefixOf(ns2) === "") {
|
|
146
|
+
return -1;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (prefixOf(ns2) === prefixOf(ns)) {
|
|
150
|
+
return i;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return -1;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* As BuildInScopeNamespaceList: the namespaces declared here and up the
|
|
160
|
+
* ancestors, the nearest first, each prefix (or, without one, URI) once.
|
|
161
|
+
*/
|
|
162
|
+
inScopeNamespaces(): Namespace[] {
|
|
163
|
+
const list: Namespace[] = [];
|
|
164
|
+
for (let y: XMLNode | null = this; y; y = y.parent) {
|
|
165
|
+
for (const ns1 of y.namespaces) {
|
|
166
|
+
const p1 = prefixOf(ns1);
|
|
167
|
+
const seen = list.some((ns2) =>
|
|
168
|
+
p1 === undefined ? ns1.uri === ns2.uri : p1 === prefixOf(ns2),
|
|
169
|
+
);
|
|
170
|
+
if (!seen) {
|
|
171
|
+
list.push(ns1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return list;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
hasSimpleContent(): boolean {
|
|
180
|
+
if (this.kind & (COMMENT | PROCESSING_INSTRUCTION)) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return !this.children.some((c) => c.kind === ELEMENT);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
hasComplexContent(): boolean {
|
|
188
|
+
if (this.kind & (TEXT | COMMENT | PROCESSING_INSTRUCTION | ATTRIBUTE | CDATA)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return this.children.some((c) => c.kind === ELEMENT);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** Its index among its parent's children, or -1 for none or an attribute. */
|
|
196
|
+
childIndex(): number {
|
|
197
|
+
if (!this.parent || this.kind === ATTRIBUTE) {
|
|
198
|
+
return -1;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return this.parent.children.indexOf(this);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
nodeKind(): string {
|
|
205
|
+
switch (this.kind) {
|
|
206
|
+
case ATTRIBUTE:
|
|
207
|
+
return "attribute";
|
|
208
|
+
case TEXT:
|
|
209
|
+
case CDATA:
|
|
210
|
+
return "text";
|
|
211
|
+
case COMMENT:
|
|
212
|
+
return "comment";
|
|
213
|
+
case PROCESSING_INSTRUCTION:
|
|
214
|
+
return "processing-instruction";
|
|
215
|
+
default:
|
|
216
|
+
return "element";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** As _deleteByIndex: child i removed, no longer its child. */
|
|
221
|
+
deleteByIndex(i: number): void {
|
|
222
|
+
if (i >= 0 && i < this.children.length) {
|
|
223
|
+
const child = this.children[i];
|
|
224
|
+
if (child) {
|
|
225
|
+
child.parent = null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
this.children.splice(i, 1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* As _deepCopy: a copy of this node and all below it, with no parent;
|
|
234
|
+
* comments and processing instructions the settings ignore left out.
|
|
235
|
+
*/
|
|
236
|
+
deepCopy(ignoreComments: boolean, ignoreProcessingInstructions: boolean): XMLNode {
|
|
237
|
+
const x = new XMLNode(this.kind, this.value);
|
|
238
|
+
if (this.name !== null) {
|
|
239
|
+
x.setName(this.name, this.ns);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (this.kind === ELEMENT) {
|
|
243
|
+
x.namespaces.push(...this.namespaces);
|
|
244
|
+
for (const a of this.attributes) {
|
|
245
|
+
const b = a.deepCopy(ignoreComments, ignoreProcessingInstructions);
|
|
246
|
+
b.parent = x;
|
|
247
|
+
x.attributes.push(b);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
for (const child of this.children) {
|
|
251
|
+
if (
|
|
252
|
+
(child.kind === COMMENT && ignoreComments) ||
|
|
253
|
+
(child.kind === PROCESSING_INSTRUCTION && ignoreProcessingInstructions)
|
|
254
|
+
) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const c = child.deepCopy(ignoreComments, ignoreProcessingInstructions);
|
|
259
|
+
c.parent = x;
|
|
260
|
+
x.children.push(c);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return x;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* As _equals: the same kind, name, attributes, value and children. The
|
|
269
|
+
* namespaces declared are not compared: those that matter are in names.
|
|
270
|
+
*/
|
|
271
|
+
equals(v: XMLNode): boolean {
|
|
272
|
+
if (this === v) {
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (this.kind !== v.kind) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const name = this.xname();
|
|
281
|
+
if (name ? v.name === null || !matches(name, v) : v.name !== null) {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (
|
|
286
|
+
this.attributes.length !== v.attributes.length ||
|
|
287
|
+
this.children.length !== v.children.length ||
|
|
288
|
+
this.value !== v.value
|
|
289
|
+
) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
for (const a1 of this.attributes) {
|
|
294
|
+
if (!v.attributes.some((a2) => a1.equals(a2))) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
for (let i = 0; i < this.children.length; i++) {
|
|
300
|
+
if (!this.children[i].equals(v.children[i])) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* As Multiname::matches: whether `name` names `node`. With a name, the
|
|
311
|
+
* node is an attribute if the name names attributes; an unqualified any
|
|
312
|
+
* name matches every node, one without a name too; otherwise the local
|
|
313
|
+
* names are the same, and the node's namespace is one of the name's, by
|
|
314
|
+
* URI and kind, if the name is not in any namespace.
|
|
315
|
+
*/
|
|
316
|
+
export function matches(name: XName, node: XMLNode | null): boolean {
|
|
317
|
+
const named = node !== null && node.name !== null;
|
|
318
|
+
if (named && name.attribute !== (node.kind === ATTRIBUTE)) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (name.local === null && !name.qualified) {
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (!named) {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (name.local !== null && name.local !== node.name) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (name.namespaces === null) {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return name.namespaces.some((ns) => ns.uri === node.ns.uri && ns.kind === node.ns.kind);
|
|
339
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// E4X's operators on XML and XMLList: == and +.
|
|
2
|
+
//
|
|
3
|
+
// Translated from avmplus' core/XMLObject.cpp, XMLListObject.cpp and E4X's
|
|
4
|
+
// parts of AvmCore.cpp, this file is subject to the Mozilla Public License,
|
|
5
|
+
// v. 2.0: http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
import type { AsObject, Value } from "../../descriptors.js";
|
|
8
|
+
import type { Runtime } from "../../runtime.js";
|
|
9
|
+
import { ATTRIBUTE, CDATA, TEXT, type XMLNode } from "./node.js";
|
|
10
|
+
import { xmlToString } from "./strings.js";
|
|
11
|
+
import { append, isList, isXML, newList, xmlOf } from "./values.js";
|
|
12
|
+
|
|
13
|
+
// Equality and +.
|
|
14
|
+
|
|
15
|
+
/** As XMLListObject::_equals. */
|
|
16
|
+
function listEquals(rt: Runtime, list: AsObject, v: Value): boolean {
|
|
17
|
+
const nodes: XMLNode[] = list.$nodes;
|
|
18
|
+
if (v === undefined && nodes.length === 0) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (isList(v)) {
|
|
23
|
+
const other: XMLNode[] = v.$nodes;
|
|
24
|
+
if (nodes.length !== other.length) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
29
|
+
if (nodes[i] !== other[i] && !rt.equals(xmlOf(rt, nodes[i]), xmlOf(rt, other[i]))) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (nodes.length === 1) {
|
|
38
|
+
return rt.equals(xmlOf(rt, nodes[0]), v);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** E4X's == (11.5.1) where either side is XML or an XMLList, else undefined. */
|
|
45
|
+
export function equals(rt: Runtime, a: Value, b: Value): boolean | undefined {
|
|
46
|
+
if (isList(a)) {
|
|
47
|
+
return listEquals(rt, a, b);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (isList(b)) {
|
|
51
|
+
return listEquals(rt, b, a);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (isXML(a) && isXML(b)) {
|
|
55
|
+
const x: XMLNode = a.$node;
|
|
56
|
+
const y: XMLNode = b.$node;
|
|
57
|
+
if (
|
|
58
|
+
(x.kind & (TEXT | CDATA | ATTRIBUTE) && y.hasSimpleContent()) ||
|
|
59
|
+
(y.kind & (TEXT | CDATA | ATTRIBUTE) && x.hasSimpleContent())
|
|
60
|
+
) {
|
|
61
|
+
return xmlToString(rt, x) === xmlToString(rt, y);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return x.equals(y);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const xml = isXML(a) ? a : b;
|
|
68
|
+
const other = xml === a ? b : a;
|
|
69
|
+
if (other === null || other === undefined) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (xml.$node.hasSimpleContent() && !(typeof other === "object" && other.$traits?.properties)) {
|
|
74
|
+
return xmlToString(rt, xml.$node) === rt.toString(other);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** E4X's + (11.4.1): XML and XMLLists into one XMLList. */
|
|
81
|
+
export function add(rt: Runtime, a: Value, b: Value): Value {
|
|
82
|
+
if ((isXML(a) || isList(a)) && (isXML(b) || isList(b))) {
|
|
83
|
+
const list = newList(rt);
|
|
84
|
+
append(list, a);
|
|
85
|
+
append(list, b);
|
|
86
|
+
return list;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|