@swf2es/player-hosts 0.0.0-stage → 0.1.0

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.
Files changed (405) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE.third-party +759 -0
  3. package/README.md +43 -2
  4. package/dist/indexeddb.d.ts +27 -0
  5. package/dist/indexeddb.d.ts.map +1 -0
  6. package/dist/indexeddb.js +170 -0
  7. package/dist/indexeddb.js.map +1 -0
  8. package/dist/node-worker.d.ts +2 -0
  9. package/dist/node-worker.d.ts.map +1 -0
  10. package/dist/node-worker.js +12 -0
  11. package/dist/node-worker.js.map +1 -0
  12. package/dist/node.d.ts +8 -0
  13. package/dist/node.d.ts.map +1 -0
  14. package/dist/node.js +43 -0
  15. package/dist/node.js.map +1 -0
  16. package/dist/precompiled.d.ts +31 -0
  17. package/dist/precompiled.d.ts.map +1 -0
  18. package/dist/precompiled.js +125 -0
  19. package/dist/precompiled.js.map +1 -0
  20. package/dist/stage3d.d.ts +13 -0
  21. package/dist/stage3d.d.ts.map +1 -0
  22. package/dist/stage3d.js +61 -0
  23. package/dist/stage3d.js.map +1 -0
  24. package/dist/thread/codegen/codegen.js +308 -0
  25. package/dist/thread/codegen/index.js +405 -0
  26. package/dist/thread/format/abc-names.js +126 -0
  27. package/dist/thread/format/actions.js +222 -0
  28. package/dist/thread/format/air-descriptor.js +63 -0
  29. package/dist/thread/format/api-versions.js +22 -0
  30. package/dist/thread/format/bitmap.js +199 -0
  31. package/dist/thread/format/button.js +60 -0
  32. package/dist/thread/format/compression.js +200 -0
  33. package/dist/thread/format/display.js +305 -0
  34. package/dist/thread/format/filters.js +136 -0
  35. package/dist/thread/format/font.js +168 -0
  36. package/dist/thread/format/index.js +26 -0
  37. package/dist/thread/format/pbj.js +484 -0
  38. package/dist/thread/format/shape.js +411 -0
  39. package/dist/thread/format/sound.js +91 -0
  40. package/dist/thread/format/swf.js +163 -0
  41. package/dist/thread/format/tags.js +58 -0
  42. package/dist/thread/format/text.js +135 -0
  43. package/dist/thread/format/zip.js +91 -0
  44. package/dist/thread/native/audio/binary.js +3 -0
  45. package/dist/thread/native/audio/index.js +72 -0
  46. package/dist/thread/native/base64.js +9 -0
  47. package/dist/thread/native/compress/binary.js +3 -0
  48. package/dist/thread/native/compress/index.js +145 -0
  49. package/dist/thread/native/instance.js +49 -0
  50. package/dist/thread/native/mp3/binary.js +3 -0
  51. package/dist/thread/native/mp3/index.js +48 -0
  52. package/dist/thread/native/render/binary.js +3 -0
  53. package/dist/thread/native/render/bitmap-kernel.js +591 -0
  54. package/dist/thread/native/render/draw-kernel.js +204 -0
  55. package/dist/thread/native/render/dxt-encoder.js +94 -0
  56. package/dist/thread/native/render/index.js +10 -0
  57. package/dist/thread/native/render/lines.js +122 -0
  58. package/dist/thread/native/render/module.js +26 -0
  59. package/dist/thread/native/render/pixel-ops.js +235 -0
  60. package/dist/thread/native/render/tessellator.js +250 -0
  61. package/dist/thread/player/avm1/amf.js +507 -0
  62. package/dist/thread/player/avm1/avm1.js +1304 -0
  63. package/dist/thread/player/avm1/bindings.js +214 -0
  64. package/dist/thread/player/avm1/classes.js +75 -0
  65. package/dist/thread/player/avm1/clips.js +229 -0
  66. package/dist/thread/player/avm1/compile.js +140 -0
  67. package/dist/thread/player/avm1/external.js +79 -0
  68. package/dist/thread/player/avm1/focus.js +278 -0
  69. package/dist/thread/player/avm1/globals/BitmapData.js +542 -0
  70. package/dist/thread/player/avm1/globals/Button.js +31 -0
  71. package/dist/thread/player/avm1/globals/Color.js +115 -0
  72. package/dist/thread/player/avm1/globals/ExternalInterface.js +310 -0
  73. package/dist/thread/player/avm1/globals/FileReference.js +217 -0
  74. package/dist/thread/player/avm1/globals/Key.js +60 -0
  75. package/dist/thread/player/avm1/globals/LoadVars.js +208 -0
  76. package/dist/thread/player/avm1/globals/LocalConnection.js +92 -0
  77. package/dist/thread/player/avm1/globals/MovieClip.js +1070 -0
  78. package/dist/thread/player/avm1/globals/MovieClipLoader.js +90 -0
  79. package/dist/thread/player/avm1/globals/NetConnection.js +261 -0
  80. package/dist/thread/player/avm1/globals/PrintJob.js +37 -0
  81. package/dist/thread/player/avm1/globals/Selection.js +62 -0
  82. package/dist/thread/player/avm1/globals/SharedObject.js +245 -0
  83. package/dist/thread/player/avm1/globals/Sound.js +238 -0
  84. package/dist/thread/player/avm1/globals/Stage.js +12 -0
  85. package/dist/thread/player/avm1/globals/StyleSheet.js +205 -0
  86. package/dist/thread/player/avm1/globals/TextField.js +396 -0
  87. package/dist/thread/player/avm1/globals/TextFormat.js +194 -0
  88. package/dist/thread/player/avm1/globals/TextSnapshot.js +88 -0
  89. package/dist/thread/player/avm1/globals/XML.js +396 -0
  90. package/dist/thread/player/avm1/globals/XMLNode.js +413 -0
  91. package/dist/thread/player/avm1/globals/XMLSocket.js +205 -0
  92. package/dist/thread/player/avm1/globals/drawing.js +202 -0
  93. package/dist/thread/player/avm1/globals/filters.js +635 -0
  94. package/dist/thread/player/avm1/globals/geom.js +600 -0
  95. package/dist/thread/player/avm1/input.js +483 -0
  96. package/dist/thread/player/avm1/keyboard.js +113 -0
  97. package/dist/thread/player/avm1/loads.js +352 -0
  98. package/dist/thread/player/avm1/net.js +219 -0
  99. package/dist/thread/player/avm1/paths.js +104 -0
  100. package/dist/thread/player/avm1/pointer.js +512 -0
  101. package/dist/thread/player/avm1/queue.js +303 -0
  102. package/dist/thread/player/avm1/sound.js +106 -0
  103. package/dist/thread/player/avm1/swf.js +141 -0
  104. package/dist/thread/player/avm1/timers.js +113 -0
  105. package/dist/thread/player/bitmap/bitmap.js +627 -0
  106. package/dist/thread/player/bitmap/draw.js +68 -0
  107. package/dist/thread/player/bitmap/dxt.js +11 -0
  108. package/dist/thread/player/bitmap/filters.js +656 -0
  109. package/dist/thread/player/bitmap/images.js +240 -0
  110. package/dist/thread/player/bitmap/kernel.js +65 -0
  111. package/dist/thread/player/bitmap/ops.js +1239 -0
  112. package/dist/thread/player/bitmap/pixel-bender.js +911 -0
  113. package/dist/thread/player/bitmap/png.js +139 -0
  114. package/dist/thread/player/bitmap/turbulence.js +89 -0
  115. package/dist/thread/player/clock.js +182 -0
  116. package/dist/thread/player/display/bitmapobject.js +25 -0
  117. package/dist/thread/player/display/bounds.js +520 -0
  118. package/dist/thread/player/display/buttonobject.js +305 -0
  119. package/dist/thread/player/display/color.js +40 -0
  120. package/dist/thread/player/display/container.js +150 -0
  121. package/dist/thread/player/display/display.js +14 -0
  122. package/dist/thread/player/display/displayobject.js +664 -0
  123. package/dist/thread/player/display/drawing.js +613 -0
  124. package/dist/thread/player/display/filters.js +285 -0
  125. package/dist/thread/player/display/geometry.js +189 -0
  126. package/dist/thread/player/display/gradients.js +117 -0
  127. package/dist/thread/player/display/graphicsdata.js +592 -0
  128. package/dist/thread/player/display/instantiate.js +71 -0
  129. package/dist/thread/player/display/matrix3d.js +373 -0
  130. package/dist/thread/player/display/morph.js +226 -0
  131. package/dist/thread/player/display/movieclip.js +680 -0
  132. package/dist/thread/player/display/perspective.js +193 -0
  133. package/dist/thread/player/display/scale9.js +236 -0
  134. package/dist/thread/player/display/shapeobject.js +131 -0
  135. package/dist/thread/player/display/shapes.js +407 -0
  136. package/dist/thread/player/display/textobjects.js +222 -0
  137. package/dist/thread/player/display/timeline.js +471 -0
  138. package/dist/thread/player/display/value-lists.js +40 -0
  139. package/dist/thread/player/display/videoobject.js +6 -0
  140. package/dist/thread/player/display/walk.js +127 -0
  141. package/dist/thread/player/files.js +334 -0
  142. package/dist/thread/player/hosts.js +207 -0
  143. package/dist/thread/player/input/avm1.js +82 -0
  144. package/dist/thread/player/input/context-menu.js +63 -0
  145. package/dist/thread/player/input/keyboard.js +458 -0
  146. package/dist/thread/player/input/pointer.js +863 -0
  147. package/dist/thread/player/input/text-editor.js +319 -0
  148. package/dist/thread/player/input/touch.js +209 -0
  149. package/dist/thread/player/localconnection.js +90 -0
  150. package/dist/thread/player/media/audio.js +376 -0
  151. package/dist/thread/player/media/dynamic-sound.js +90 -0
  152. package/dist/thread/player/media/extract.js +135 -0
  153. package/dist/thread/player/media/mp3.js +152 -0
  154. package/dist/thread/player/media/sounds.js +507 -0
  155. package/dist/thread/player/media/streaming-audio.js +133 -0
  156. package/dist/thread/player/player.js +616 -0
  157. package/dist/thread/player/playerglobal/air/net/WebSocket.js +250 -0
  158. package/dist/thread/player/playerglobal/air-library.js +8 -0
  159. package/dist/thread/player/playerglobal/flash/accessibility/Accessibility.js +21 -0
  160. package/dist/thread/player/playerglobal/flash/crypto/generateRandomBytes.js +32 -0
  161. package/dist/thread/player/playerglobal/flash/data/EncryptedLocalStore.js +61 -0
  162. package/dist/thread/player/playerglobal/flash/desktop/Clipboard.js +173 -0
  163. package/dist/thread/player/playerglobal/flash/desktop/NativeApplication.js +179 -0
  164. package/dist/thread/player/playerglobal/flash/display/AVM1Movie.js +19 -0
  165. package/dist/thread/player/playerglobal/flash/display/Bitmap.js +58 -0
  166. package/dist/thread/player/playerglobal/flash/display/BitmapData.js +633 -0
  167. package/dist/thread/player/playerglobal/flash/display/DisplayObject.js +614 -0
  168. package/dist/thread/player/playerglobal/flash/display/DisplayObjectContainer.js +224 -0
  169. package/dist/thread/player/playerglobal/flash/display/Graphics.js +345 -0
  170. package/dist/thread/player/playerglobal/flash/display/InteractiveObject.js +87 -0
  171. package/dist/thread/player/playerglobal/flash/display/Loader.js +79 -0
  172. package/dist/thread/player/playerglobal/flash/display/LoaderInfo.js +128 -0
  173. package/dist/thread/player/playerglobal/flash/display/MovieClip.js +194 -0
  174. package/dist/thread/player/playerglobal/flash/display/NativeWindow.js +245 -0
  175. package/dist/thread/player/playerglobal/flash/display/Shader.js +26 -0
  176. package/dist/thread/player/playerglobal/flash/display/ShaderData.js +85 -0
  177. package/dist/thread/player/playerglobal/flash/display/ShaderInput.js +64 -0
  178. package/dist/thread/player/playerglobal/flash/display/ShaderJob.js +181 -0
  179. package/dist/thread/player/playerglobal/flash/display/ShaderParameter.js +23 -0
  180. package/dist/thread/player/playerglobal/flash/display/Shape.js +13 -0
  181. package/dist/thread/player/playerglobal/flash/display/SimpleButton.js +103 -0
  182. package/dist/thread/player/playerglobal/flash/display/Sprite.js +84 -0
  183. package/dist/thread/player/playerglobal/flash/display/Stage.js +231 -0
  184. package/dist/thread/player/playerglobal/flash/display/Stage3D.js +54 -0
  185. package/dist/thread/player/playerglobal/flash/display/shaders.js +228 -0
  186. package/dist/thread/player/playerglobal/flash/events/Event.js +58 -0
  187. package/dist/thread/player/playerglobal/flash/events/EventDispatcher.js +103 -0
  188. package/dist/thread/player/playerglobal/flash/events/GestureEvent.js +34 -0
  189. package/dist/thread/player/playerglobal/flash/events/HTTPStatusEvent.js +8 -0
  190. package/dist/thread/player/playerglobal/flash/events/KeyboardEvent.js +51 -0
  191. package/dist/thread/player/playerglobal/flash/events/MouseEvent.js +59 -0
  192. package/dist/thread/player/playerglobal/flash/events/PressAndTapGestureEvent.js +30 -0
  193. package/dist/thread/player/playerglobal/flash/events/TimerEvent.js +16 -0
  194. package/dist/thread/player/playerglobal/flash/events/TouchEvent.js +45 -0
  195. package/dist/thread/player/playerglobal/flash/external/ExternalInterface.js +73 -0
  196. package/dist/thread/player/playerglobal/flash/filesystem/File.js +340 -0
  197. package/dist/thread/player/playerglobal/flash/filesystem/FileStream.js +453 -0
  198. package/dist/thread/player/playerglobal/flash/filesystem/paths.js +156 -0
  199. package/dist/thread/player/playerglobal/flash/filesystem/writes.js +143 -0
  200. package/dist/thread/player/playerglobal/flash/filters/BevelFilter.js +4 -0
  201. package/dist/thread/player/playerglobal/flash/filters/BitmapFilter.js +205 -0
  202. package/dist/thread/player/playerglobal/flash/filters/BlurFilter.js +4 -0
  203. package/dist/thread/player/playerglobal/flash/filters/ColorMatrixFilter.js +11 -0
  204. package/dist/thread/player/playerglobal/flash/filters/ConvolutionFilter.js +26 -0
  205. package/dist/thread/player/playerglobal/flash/filters/DisplacementMapFilter.js +51 -0
  206. package/dist/thread/player/playerglobal/flash/filters/DropShadowFilter.js +4 -0
  207. package/dist/thread/player/playerglobal/flash/filters/GlowFilter.js +4 -0
  208. package/dist/thread/player/playerglobal/flash/filters/GradientBevelFilter.js +4 -0
  209. package/dist/thread/player/playerglobal/flash/filters/GradientGlowFilter.js +4 -0
  210. package/dist/thread/player/playerglobal/flash/filters/ShaderFilter.js +53 -0
  211. package/dist/thread/player/playerglobal/flash/geom/Matrix3D.js +361 -0
  212. package/dist/thread/player/playerglobal/flash/geom/PerspectiveProjection.js +122 -0
  213. package/dist/thread/player/playerglobal/flash/geom/Transform.js +245 -0
  214. package/dist/thread/player/playerglobal/flash/geom/Utils3D.js +85 -0
  215. package/dist/thread/player/playerglobal/flash/globalization/Collator.js +149 -0
  216. package/dist/thread/player/playerglobal/flash/globalization/CurrencyFormatter.js +272 -0
  217. package/dist/thread/player/playerglobal/flash/globalization/CurrencyParseResult.js +21 -0
  218. package/dist/thread/player/playerglobal/flash/globalization/DateTimeFormatter.js +463 -0
  219. package/dist/thread/player/playerglobal/flash/globalization/LocaleID.js +144 -0
  220. package/dist/thread/player/playerglobal/flash/globalization/NumberFormatter.js +444 -0
  221. package/dist/thread/player/playerglobal/flash/globalization/NumberParseResult.js +22 -0
  222. package/dist/thread/player/playerglobal/flash/globalization/StringTools.js +59 -0
  223. package/dist/thread/player/playerglobal/flash/globalization/locale.js +190 -0
  224. package/dist/thread/player/playerglobal/flash/media/Camera.js +89 -0
  225. package/dist/thread/player/playerglobal/flash/media/Microphone.js +126 -0
  226. package/dist/thread/player/playerglobal/flash/media/Sound.js +543 -0
  227. package/dist/thread/player/playerglobal/flash/media/SoundMixer.js +74 -0
  228. package/dist/thread/player/playerglobal/flash/media/SoundTransform.js +40 -0
  229. package/dist/thread/player/playerglobal/flash/media/Video.js +43 -0
  230. package/dist/thread/player/playerglobal/flash/net/FileFilter.js +27 -0
  231. package/dist/thread/player/playerglobal/flash/net/FileReference.js +197 -0
  232. package/dist/thread/player/playerglobal/flash/net/LocalConnection.js +167 -0
  233. package/dist/thread/player/playerglobal/flash/net/NetConnection.js +155 -0
  234. package/dist/thread/player/playerglobal/flash/net/SharedObject.js +299 -0
  235. package/dist/thread/player/playerglobal/flash/net/Socket.js +282 -0
  236. package/dist/thread/player/playerglobal/flash/net/URLRequest.js +93 -0
  237. package/dist/thread/player/playerglobal/flash/net/URLStream.js +146 -0
  238. package/dist/thread/player/playerglobal/flash/net/XMLSocket.js +14 -0
  239. package/dist/thread/player/playerglobal/flash/net/local-modern.js +142 -0
  240. package/dist/thread/player/playerglobal/flash/net/local-values.js +217 -0
  241. package/dist/thread/player/playerglobal/flash/net/navigateToURL.js +29 -0
  242. package/dist/thread/player/playerglobal/flash/profiler/Telemetry.js +25 -0
  243. package/dist/thread/player/playerglobal/flash/sensors/Accelerometer.js +12 -0
  244. package/dist/thread/player/playerglobal/flash/system/ApplicationDomain.js +69 -0
  245. package/dist/thread/player/playerglobal/flash/system/Capabilities.js +163 -0
  246. package/dist/thread/player/playerglobal/flash/system/FSCommandHost.js +17 -0
  247. package/dist/thread/player/playerglobal/flash/system/Security.js +46 -0
  248. package/dist/thread/player/playerglobal/flash/system/SecurityDomain.js +21 -0
  249. package/dist/thread/player/playerglobal/flash/system/System.js +73 -0
  250. package/dist/thread/player/playerglobal/flash/system/Worker.js +112 -0
  251. package/dist/thread/player/playerglobal/flash/text/Font.js +95 -0
  252. package/dist/thread/player/playerglobal/flash/text/StaticText.js +16 -0
  253. package/dist/thread/player/playerglobal/flash/text/StyleSheet.js +65 -0
  254. package/dist/thread/player/playerglobal/flash/text/TextField.js +707 -0
  255. package/dist/thread/player/playerglobal/flash/text/TextRenderer.js +77 -0
  256. package/dist/thread/player/playerglobal/flash/text/engine/FontDescription.js +141 -0
  257. package/dist/thread/player/playerglobal/flash/text/engine/TabStop.js +46 -0
  258. package/dist/thread/player/playerglobal/flash/trace/Trace.js +17 -0
  259. package/dist/thread/player/playerglobal/flash/ui/ContextMenu.js +17 -0
  260. package/dist/thread/player/playerglobal/flash/ui/GameInput.js +19 -0
  261. package/dist/thread/player/playerglobal/flash/ui/Keyboard.js +27 -0
  262. package/dist/thread/player/playerglobal/flash/ui/Mouse.js +127 -0
  263. package/dist/thread/player/playerglobal/flash/ui/Multitouch.js +46 -0
  264. package/dist/thread/player/playerglobal/flash/utils/ByteArray.js +155 -0
  265. package/dist/thread/player/playerglobal/flash/utils/Timer.js +25 -0
  266. package/dist/thread/player/playerglobal/flash/xml/XMLDocument.js +74 -0
  267. package/dist/thread/player/playerglobal/index.js +224 -0
  268. package/dist/thread/player/playerglobal/libraries.js +10 -0
  269. package/dist/thread/player/playerglobal/playerglobal-library.js +22 -0
  270. package/dist/thread/player/playerglobal/toplevel.js +122 -0
  271. package/dist/thread/player/scripting/clipboard.js +146 -0
  272. package/dist/thread/player/scripting/code.js +900 -0
  273. package/dist/thread/player/scripting/evaluate.js +144 -0
  274. package/dist/thread/player/scripting/events.js +172 -0
  275. package/dist/thread/player/scripting/handover.js +182 -0
  276. package/dist/thread/player/scripting/lazy.js +38 -0
  277. package/dist/thread/player/scripting/lifecycle.js +272 -0
  278. package/dist/thread/player/scripting/loads.js +860 -0
  279. package/dist/thread/player/scripting/sha256.js +95 -0
  280. package/dist/thread/player/scripting/symbols.js +348 -0
  281. package/dist/thread/player/scripting/timers.js +434 -0
  282. package/dist/thread/player/scripting/workers.js +923 -0
  283. package/dist/thread/player/scripting.js +1018 -0
  284. package/dist/thread/player/stage.js +4 -0
  285. package/dist/thread/player/text/csm.js +113 -0
  286. package/dist/thread/player/text/css.js +167 -0
  287. package/dist/thread/player/text/fonts.js +97 -0
  288. package/dist/thread/player/text/layout.js +393 -0
  289. package/dist/thread/player/text/static.js +109 -0
  290. package/dist/thread/player/text/text.js +431 -0
  291. package/dist/thread/player/workers/thread.js +159 -0
  292. package/dist/thread/player/workers/wire.js +198 -0
  293. package/dist/thread/player-hosts/web-worker.js +19 -0
  294. package/dist/thread/runtime/avm1/activation.js +89 -0
  295. package/dist/thread/runtime/avm1/case.js +249 -0
  296. package/dist/thread/runtime/avm1/clips.js +334 -0
  297. package/dist/thread/runtime/avm1/control.js +280 -0
  298. package/dist/thread/runtime/avm1/errors.js +50 -0
  299. package/dist/thread/runtime/avm1/functions.js +249 -0
  300. package/dist/thread/runtime/avm1/globals/array.js +549 -0
  301. package/dist/thread/runtime/avm1/globals/broadcaster.js +131 -0
  302. package/dist/thread/runtime/avm1/globals/date.js +436 -0
  303. package/dist/thread/runtime/avm1/globals/global.js +344 -0
  304. package/dist/thread/runtime/avm1/globals/math.js +139 -0
  305. package/dist/thread/runtime/avm1/globals/number.js +93 -0
  306. package/dist/thread/runtime/avm1/globals/string.js +201 -0
  307. package/dist/thread/runtime/avm1/globals/timers.js +129 -0
  308. package/dist/thread/runtime/avm1/host.js +5 -0
  309. package/dist/thread/runtime/avm1/index.js +14 -0
  310. package/dist/thread/runtime/avm1/inheritance.js +132 -0
  311. package/dist/thread/runtime/avm1/numbers.js +298 -0
  312. package/dist/thread/runtime/avm1/objects.js +896 -0
  313. package/dist/thread/runtime/avm1/operators.js +170 -0
  314. package/dist/thread/runtime/avm1/realm.js +529 -0
  315. package/dist/thread/runtime/avm1/runtime.js +882 -0
  316. package/dist/thread/runtime/avm1/scope.js +385 -0
  317. package/dist/thread/runtime/avm1/urls.js +180 -0
  318. package/dist/thread/runtime/avm1/values.js +97 -0
  319. package/dist/thread/runtime/avm2/amf-classes.js +66 -0
  320. package/dist/thread/runtime/avm2/amf.js +801 -0
  321. package/dist/thread/runtime/avm2/array-conversion.js +100 -0
  322. package/dist/thread/runtime/avm2/builtin-library.js +21 -0
  323. package/dist/thread/runtime/avm2/cache-fill.js +86 -0
  324. package/dist/thread/runtime/avm2/classes.js +211 -0
  325. package/dist/thread/runtime/avm2/definitions.js +69 -0
  326. package/dist/thread/runtime/avm2/descriptors.js +5 -0
  327. package/dist/thread/runtime/avm2/dictionary-keys.js +295 -0
  328. package/dist/thread/runtime/avm2/domain-memory.js +75 -0
  329. package/dist/thread/runtime/avm2/domain.js +280 -0
  330. package/dist/thread/runtime/avm2/dynamic-properties.js +182 -0
  331. package/dist/thread/runtime/avm2/enumeration.js +393 -0
  332. package/dist/thread/runtime/avm2/errors.js +45 -0
  333. package/dist/thread/runtime/avm2/float-library.js +66 -0
  334. package/dist/thread/runtime/avm2/float.js +26 -0
  335. package/dist/thread/runtime/avm2/hooks.js +19 -0
  336. package/dist/thread/runtime/avm2/index.js +38 -0
  337. package/dist/thread/runtime/avm2/messages.js +177 -0
  338. package/dist/thread/runtime/avm2/method-factories.js +95 -0
  339. package/dist/thread/runtime/avm2/modules.js +105 -0
  340. package/dist/thread/runtime/avm2/names.js +248 -0
  341. package/dist/thread/runtime/avm2/natives/aliases.js +47 -0
  342. package/dist/thread/runtime/avm2/natives/array.js +390 -0
  343. package/dist/thread/runtime/avm2/natives/bytearray.js +1227 -0
  344. package/dist/thread/runtime/avm2/natives/case.js +88 -0
  345. package/dist/thread/runtime/avm2/natives/concurrent.js +199 -0
  346. package/dist/thread/runtime/avm2/natives/date.js +581 -0
  347. package/dist/thread/runtime/avm2/natives/define.js +130 -0
  348. package/dist/thread/runtime/avm2/natives/describe.js +351 -0
  349. package/dist/thread/runtime/avm2/natives/dictionary.js +12 -0
  350. package/dist/thread/runtime/avm2/natives/float-vector.js +81 -0
  351. package/dist/thread/runtime/avm2/natives/float.js +96 -0
  352. package/dist/thread/runtime/avm2/natives/index.js +64 -0
  353. package/dist/thread/runtime/avm2/natives/json.js +514 -0
  354. package/dist/thread/runtime/avm2/natives/number.js +162 -0
  355. package/dist/thread/runtime/avm2/natives/object.js +237 -0
  356. package/dist/thread/runtime/avm2/natives/proxy.js +75 -0
  357. package/dist/thread/runtime/avm2/natives/regexp.js +485 -0
  358. package/dist/thread/runtime/avm2/natives/shell-workers.js +404 -0
  359. package/dist/thread/runtime/avm2/natives/shell.js +557 -0
  360. package/dist/thread/runtime/avm2/natives/sort.js +377 -0
  361. package/dist/thread/runtime/avm2/natives/string.js +132 -0
  362. package/dist/thread/runtime/avm2/natives/sync.js +821 -0
  363. package/dist/thread/runtime/avm2/natives/toplevel.js +139 -0
  364. package/dist/thread/runtime/avm2/natives/vector-elements.js +46 -0
  365. package/dist/thread/runtime/avm2/natives/vector.js +406 -0
  366. package/dist/thread/runtime/avm2/natives/xml/access.js +633 -0
  367. package/dist/thread/runtime/avm2/natives/xml/build.js +291 -0
  368. package/dist/thread/runtime/avm2/natives/xml/chars.js +112 -0
  369. package/dist/thread/runtime/avm2/natives/xml/escape.js +38 -0
  370. package/dist/thread/runtime/avm2/natives/xml/names.js +204 -0
  371. package/dist/thread/runtime/avm2/natives/xml/node.js +272 -0
  372. package/dist/thread/runtime/avm2/natives/xml/operators.js +69 -0
  373. package/dist/thread/runtime/avm2/natives/xml/parser.js +356 -0
  374. package/dist/thread/runtime/avm2/natives/xml/strings.js +191 -0
  375. package/dist/thread/runtime/avm2/natives/xml/values.js +122 -0
  376. package/dist/thread/runtime/avm2/natives/xml/xml.js +645 -0
  377. package/dist/thread/runtime/avm2/number-strings.js +110 -0
  378. package/dist/thread/runtime/avm2/numbers.js +558 -0
  379. package/dist/thread/runtime/avm2/options.js +16 -0
  380. package/dist/thread/runtime/avm2/player-messages.js +550 -0
  381. package/dist/thread/runtime/avm2/property-cache.js +135 -0
  382. package/dist/thread/runtime/avm2/runtime.js +2644 -0
  383. package/dist/thread/runtime/avm2/traits.js +509 -0
  384. package/dist/thread/runtime/index.js +7 -0
  385. package/dist/web-worker.d.ts +2 -0
  386. package/dist/web-worker.d.ts.map +1 -0
  387. package/dist/web-worker.js +20 -0
  388. package/dist/web-worker.js.map +1 -0
  389. package/dist/websocket.d.ts +4 -0
  390. package/dist/websocket.d.ts.map +1 -0
  391. package/dist/websocket.js +27 -0
  392. package/dist/websocket.js.map +1 -0
  393. package/dist/workers.d.ts +35 -0
  394. package/dist/workers.d.ts.map +1 -0
  395. package/dist/workers.js +171 -0
  396. package/dist/workers.js.map +1 -0
  397. package/package.json +62 -3
  398. package/src/indexeddb.ts +227 -0
  399. package/src/node-worker.ts +13 -0
  400. package/src/node.ts +49 -0
  401. package/src/precompiled.ts +166 -0
  402. package/src/stage3d.ts +76 -0
  403. package/src/web-worker.ts +24 -0
  404. package/src/websocket.ts +32 -0
  405. package/src/workers.ts +255 -0
@@ -0,0 +1,194 @@
1
+ // TextFormat, AS2's, as Ruffle's (https://github.com/ruffle-rs/ruffle)
2
+ // core/src/avm1/globals/text_format.rs has it: MIT OR Apache-2.0,
3
+ // Copyright (c) 2018-2022 Ruffle LLC and Ruffle contributors. A TextFormat
4
+ // holds a PartialFormat (text/text.ts) natively, null for each value it
5
+ // does not set, which its properties read and write as Flash converts them.
6
+ import { avm1 } from "../../../runtime/index.js";
7
+ import { TextObject } from "../../display/display.js";
8
+ import { applied, emptyFormat } from "../../text/text.js";
9
+ const formats = new WeakMap();
10
+ /** The format a TextFormat holds; null for any other object. */
11
+ export function formatOf(value) {
12
+ return value instanceof avm1.Avm1Object ? (formats.get(value) ?? null) : null;
13
+ }
14
+ /** A number as Ruffle's round_to_even makes it an int: a half to even, what does not fit -2^31. */
15
+ function roundToEven(n) {
16
+ const r = Math.round(n);
17
+ const even = Math.abs(n % 1) === 0.5 && r % 2 !== 0 ? r - 1 : r;
18
+ return Number.isFinite(even) && even <= 0x7fffffff && even >= -0x80000000 ? even : -0x80000000;
19
+ }
20
+ const unset = (v) => v === undefined || v === null;
21
+ /** The most tab stops a TextFormat reads of an object. */
22
+ const MAX_TAB_STOPS = 0x10000;
23
+ /** A value of the integer kind as a SWF of `version` keeps it: to an int, wrapping, before 8; rounded from 8. */
24
+ function integer(v, version, min) {
25
+ const n = avm1.toNumber(v, version);
26
+ if (version < 8) {
27
+ const i = n | 0;
28
+ return min === null ? i : Math.max(min, i);
29
+ }
30
+ // Rust's max, which takes the other for NaN.
31
+ return roundToEven(min === null ? n : Number.isNaN(n) ? min : Math.max(min, n));
32
+ }
33
+ /** Each property, and what it stores of a value set: undefined to leave it as it is. */
34
+ const PROPERTIES = [
35
+ // Up to 64 characters of the name.
36
+ ["font", (v, version) => (unset(v) ? null : avm1.stringOf(v, version).slice(0, 64))],
37
+ ["size", (v, version) => (unset(v) ? null : integer(v, version, null))],
38
+ ["color", (v, version) => (unset(v) ? null : avm1.toNumber(v, version) >>> 0)],
39
+ ["url", (v, version) => (unset(v) ? null : avm1.stringOf(v, version))],
40
+ ["target", (v, version) => (unset(v) ? null : avm1.stringOf(v, version))],
41
+ ["bold", (v, version) => (unset(v) ? null : avm1.toBoolean(v, version))],
42
+ ["italic", (v, version) => (unset(v) ? null : avm1.toBoolean(v, version))],
43
+ ["underline", (v, version) => (unset(v) ? null : avm1.toBoolean(v, version))],
44
+ // Neither nothing nor an unknown alignment changes it.
45
+ [
46
+ "align",
47
+ (v, version) => {
48
+ if (unset(v)) {
49
+ return undefined;
50
+ }
51
+ const align = avm1.stringOf(v, version).toLowerCase();
52
+ return ["left", "center", "right", "justify"].includes(align) ? align : undefined;
53
+ },
54
+ ],
55
+ ["leftMargin", (v, version) => (unset(v) ? null : integer(v, version, 0))],
56
+ ["rightMargin", (v, version) => (unset(v) ? null : integer(v, version, 0))],
57
+ [
58
+ "indent",
59
+ (v, version) => unset(v) ? null : version < 8 ? integer(v, version, 0) : integer(v, version, null),
60
+ ],
61
+ [
62
+ "leading",
63
+ (v, version) => unset(v) ? null : version < 8 ? integer(v, version, 0) : integer(v, version, null),
64
+ ],
65
+ [
66
+ "blockIndent",
67
+ (v, version) => unset(v) ? null : version < 8 ? integer(v, version, 0) : integer(v, version, null),
68
+ ],
69
+ // Any object's elements, by its length, at most 2^16 of them: a length a
70
+ // script made up must not keep a native loop from the script timeout.
71
+ [
72
+ "tabStops",
73
+ (v, version) => {
74
+ if (!(v instanceof avm1.Avm1Object)) {
75
+ return null;
76
+ }
77
+ const length = Math.min(avm1.toNumber(avm1.get(v, "length", version), version) | 0, MAX_TAB_STOPS);
78
+ const stops = [];
79
+ for (let i = 0; i < length; i++) {
80
+ stops.push(roundToEven(avm1.toNumber(avm1.get(v, String(i), version), version)));
81
+ }
82
+ return stops;
83
+ },
84
+ ],
85
+ ["bullet", (v, version) => (unset(v) ? null : avm1.toBoolean(v, version))],
86
+ // Nothing, or anything unknown, is a block.
87
+ [
88
+ "display",
89
+ (v, version) => {
90
+ const display = unset(v) ? "block" : avm1.stringOf(v, version);
91
+ return display === "inline" || display === "none" ? display : "block";
92
+ },
93
+ ],
94
+ ["kerning", (v, version) => (unset(v) ? null : avm1.toBoolean(v, version))],
95
+ ["letterSpacing", (v, version) => (unset(v) ? null : avm1.toNumber(v, version))],
96
+ ];
97
+ const STORES = new Map(PROPERTIES);
98
+ /** The constructor's parameters, in order: from size, the numbers are ints whatever the version. */
99
+ const PARAMETERS = [
100
+ "font",
101
+ "size",
102
+ "color",
103
+ "bold",
104
+ "italic",
105
+ "underline",
106
+ "url",
107
+ "target",
108
+ "align",
109
+ "leftMargin",
110
+ "rightMargin",
111
+ "indent",
112
+ "leading",
113
+ ];
114
+ /** A value of a format as a property gives it: null where it sets none, an array of tab stops. */
115
+ function propertyValue(format, key, realm, version) {
116
+ const v = format[key];
117
+ if (v === null) {
118
+ return null;
119
+ }
120
+ return Array.isArray(v) ? realm.newArray([...v], version) : v;
121
+ }
122
+ /** `_global.TextFormat`, and how to make one of a format. */
123
+ export function textFormatClass(host) {
124
+ const realm = host.realm;
125
+ const proto = new avm1.Avm1Object(realm.objectProto);
126
+ const constr = realm.classOf(proto, (self, args, version) => {
127
+ const format = emptyFormat();
128
+ for (const [i, key] of PARAMETERS.entries()) {
129
+ const v = args[i];
130
+ const integral = i === 1 || i >= 9;
131
+ const asInt = unset(v) ? null : avm1.toNumber(v, version) | 0;
132
+ const stored = integral ? asInt : STORES.get(key)?.(v, version);
133
+ if (stored !== undefined) {
134
+ format[key] = stored;
135
+ }
136
+ }
137
+ formats.set(self, format);
138
+ return self;
139
+ }, () => undefined);
140
+ for (const [key, store] of PROPERTIES) {
141
+ const p = proto.add(key, undefined, 0);
142
+ p.get = realm.method((self, _, version) => {
143
+ const format = formats.get(self);
144
+ return format === undefined ? undefined : propertyValue(format, key, realm, version);
145
+ });
146
+ p.set = realm.method((self, args, version) => {
147
+ const format = formats.get(self);
148
+ if (format !== undefined) {
149
+ const stored = store(args[0], version);
150
+ if (stored !== undefined) {
151
+ format[key] = stored;
152
+ }
153
+ }
154
+ return undefined;
155
+ });
156
+ }
157
+ proto.define("getTextExtent", realm.method((self, args, version) => {
158
+ const format = formats.get(self);
159
+ return format === undefined ? undefined : textExtent(format, args, version);
160
+ }), avm1.DONT_ENUM | avm1.DONT_DELETE);
161
+ return { constr, proto };
162
+ }
163
+ /** A TextFormat of `format`, of prototype `proto`, as a field's methods make one. */
164
+ export function newTextFormat(proto, format) {
165
+ const o = new avm1.Avm1Object(proto);
166
+ formats.set(o, { ...format, tabStops: format.tabStops === null ? null : [...format.tabStops] });
167
+ return o;
168
+ }
169
+ /**
170
+ * getTextExtent: `text` laid out in the format, in a field that fits it,
171
+ * wrapped at a width where one is given: its first line's ascent and
172
+ * descent, the text's width and height, and the field's.
173
+ */
174
+ function textExtent(format, args, version) {
175
+ const text = avm1.stringOf(args[0], version);
176
+ const width = args.length > 1 && args[1] !== undefined ? avm1.toNumber(args[1], version) : null;
177
+ const field = new TextObject(null);
178
+ field.width = width ?? 0;
179
+ field.wordWrap = width !== null;
180
+ field.autoSize = "left";
181
+ field.model.defaultFormat = applied(field.model.defaultFormat, format);
182
+ field.model.setText(text);
183
+ field.fit();
184
+ const layout = field.layout;
185
+ const first = layout.lines[0];
186
+ const out = new avm1.Avm1Object();
187
+ avm1.set(out, "ascent", (first?.ascent ?? 0) / 20, version);
188
+ avm1.set(out, "descent", (first?.descent ?? 0) / 20, version);
189
+ avm1.set(out, "width", layout.width / 20, version);
190
+ avm1.set(out, "height", layout.height / 20, version);
191
+ avm1.set(out, "textFieldHeight", field.height, version);
192
+ avm1.set(out, "textFieldWidth", field.width, version);
193
+ return out;
194
+ }
@@ -0,0 +1,88 @@
1
+ // TextSnapshot's AS2 face, as Ruffle's (https://github.com/ruffle-rs/ruffle)
2
+ // core/src/avm1/globals/text_snapshot.rs and display_object/text.rs's
3
+ // TextSnapshot have it: MIT OR Apache-2.0, Copyright (c) 2018-2022 Ruffle
4
+ // LLC and Ruffle contributors. A snapshot is a clip's static texts' text,
5
+ // its direct children's in the order they are drawn, as it was when made:
6
+ // dynamic and input fields are not in it, nor the clip's grandchildren.
7
+ // Selection, hit tests, the select colour and the run info do nothing yet,
8
+ // as in Ruffle.
9
+ import { avm1 } from "../../../runtime/index.js";
10
+ import { MovieClip, StaticTextObject } from "../../display/display.js";
11
+ import { asciiLower } from "../paths.js";
12
+ /** A clip's static texts' text, as they were when the snapshot was made. */
13
+ class Snapshot {
14
+ chunks = [];
15
+ count;
16
+ constructor(clip) {
17
+ let start = 0;
18
+ for (const child of clip.children) {
19
+ const text = child instanceof StaticTextObject ? child.glyphs.text : null;
20
+ if (text !== null && text !== "") {
21
+ this.chunks.push({ text, start });
22
+ start += text.length;
23
+ }
24
+ }
25
+ this.count = start;
26
+ }
27
+ /** Each chunk's part from `from` to `to`, the indices the whole's. */
28
+ parts(from, to) {
29
+ return this.chunks
30
+ .filter((c) => c.start < to && c.start + c.text.length > from)
31
+ .map((c) => c.text.slice(Math.max(0, from - c.start), Math.max(0, to - c.start)));
32
+ }
33
+ /**
34
+ * The text from `from` to `to`, at least one character, both clamped to
35
+ * the text, a negative index 0; with `newlines`, a "\n" between texts.
36
+ */
37
+ getText(from, to, newlines) {
38
+ if (this.count === 0) {
39
+ return "";
40
+ }
41
+ const start = Math.min(Math.max(0, from), this.count - 1);
42
+ const end = Math.max(Math.min(Math.max(0, to), this.count), start + 1);
43
+ return this.parts(start, end).join(newlines ? "\n" : "");
44
+ }
45
+ /** Where `text` is first found from `from` on, ASCII's case aside unless `caseSensitive`; -1 for none. */
46
+ findText(from, text, caseSensitive) {
47
+ if (text === "" || from < 0) {
48
+ return -1;
49
+ }
50
+ const whole = this.parts(from, this.count).join("");
51
+ const index = caseSensitive ? whole.indexOf(text) : asciiLower(whole).indexOf(asciiLower(text));
52
+ return index < 0 ? -1 : from + index;
53
+ }
54
+ }
55
+ /** `TextSnapshot`. */
56
+ export function textSnapshotClass(realm) {
57
+ const snapshots = new WeakMap();
58
+ const proto = new avm1.Avm1Object(realm.objectProto);
59
+ const constr = realm.classOf(proto,
60
+ // Of a clip given alone; anything else makes a snapshot of nothing, whose methods give undefined.
61
+ (self, args) => {
62
+ const target = args.length === 1 ? args[0] : undefined;
63
+ const clip = target instanceof avm1.Avm1Object ? target.display?.target : undefined;
64
+ if (clip instanceof MovieClip) {
65
+ snapshots.set(self, new Snapshot(clip));
66
+ }
67
+ return self;
68
+ }, () => undefined);
69
+ const method = (name, f) => proto.define(name, realm.method((self, args, v) => {
70
+ const s = snapshots.get(self);
71
+ return s === undefined ? undefined : f(s, args, v);
72
+ }), avm1.VERSION_6);
73
+ const none = () => undefined;
74
+ method("getCount", (s, args) => (args.length === 0 ? s.count : undefined));
75
+ method("setSelected", none);
76
+ method("getSelected", none);
77
+ method("getText", (s, args, v) => args.length < 2 || args.length > 3
78
+ ? undefined
79
+ : s.getText(avm1.toNumber(args[0], v) | 0, avm1.toNumber(args[1], v) | 0, avm1.toBoolean(args[2], v)));
80
+ method("getSelectedText", none);
81
+ method("hitTestTextNearPos", none);
82
+ method("findText", (s, args, v) => args.length !== 3
83
+ ? undefined
84
+ : s.findText(avm1.toNumber(args[0], v) | 0, avm1.stringOf(args[1], v), avm1.toBoolean(args[2], v)));
85
+ method("setSelectColor", none);
86
+ method("getTextRunInfo", none);
87
+ return constr;
88
+ }
@@ -0,0 +1,396 @@
1
+ // XML, AS1 and AS2's document, as Ruffle's (https://github.com/ruffle-rs/
2
+ // ruffle) core/src/avm1/globals/xml.rs has it: MIT OR Apache-2.0, Copyright
3
+ // (c) 2018-2022 Ruffle LLC and Ruffle contributors; where adl parts from
4
+ // Ruffle, as adl has it. An XML is an XMLNode, its document's root, with no
5
+ // name; parseXML replaces the root's children with what it reads, and on
6
+ // an error keeps what it read before, `status` the error's number. load
7
+ // and sendAndLoad go as LoadVars' do.
8
+ import { avm1 } from "../../../runtime/index.js";
9
+ import { bytesFor } from "../net.js";
10
+ import { addRequestHeader, headersOf, startLoad } from "./LoadVars.js";
11
+ import { ELEMENT_NODE, serialize, TEXT_NODE, XmlNode, } from "./XMLNode.js";
12
+ // parseXML's statuses, as Flash 8 lists them.
13
+ const OK = 0;
14
+ const CDATA_NOT_TERMINATED = -2;
15
+ const DECL_NOT_TERMINATED = -3;
16
+ const DOCTYPE_NOT_TERMINATED = -4;
17
+ const COMMENT_NOT_TERMINATED = -5;
18
+ const ELEMENT_MALFORMED = -6;
19
+ const ATTRIBUTE_NOT_TERMINATED = -8;
20
+ const MISMATCHED_START = -9;
21
+ const MISMATCHED_END = -10;
22
+ /** The entities Flash knows by name, nbsp among them (adl). */
23
+ const NAMED = {
24
+ lt: "<",
25
+ gt: ">",
26
+ amp: "&",
27
+ apos: "'",
28
+ quot: '"',
29
+ nbsp: " ",
30
+ };
31
+ /** An entity, `&...;`, decoded; null for one that is none, which is kept as it is. */
32
+ function entity(text) {
33
+ const body = text.slice(1, -1);
34
+ if (Object.hasOwn(NAMED, body)) {
35
+ return NAMED[body];
36
+ }
37
+ let digits;
38
+ let radix;
39
+ if (body.startsWith("#x")) {
40
+ digits = body.slice(2);
41
+ radix = 16;
42
+ }
43
+ else if (body.startsWith("#")) {
44
+ digits = body.slice(1);
45
+ radix = 10;
46
+ }
47
+ else {
48
+ return null;
49
+ }
50
+ if (!(radix === 16 ? /^[0-9a-fA-F]+$/ : /^[0-9]+$/).test(digits)) {
51
+ return null;
52
+ }
53
+ // &#0; is nothing (adl).
54
+ const code = Number.parseInt(digits, radix);
55
+ if (code === 0) {
56
+ return "";
57
+ }
58
+ return code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff) ? null : String.fromCodePoint(code);
59
+ }
60
+ /**
61
+ * Text or an attribute's value with its entities decoded, each alone: a
62
+ * bare `&` before one is kept, and `&&amp;` is `&&`, as Flash has them
63
+ * (Ruffle's avm1_unescape); `&#X41;`, an unknown name, are kept as written.
64
+ */
65
+ function unescapeXml(text) {
66
+ return text.includes("&") ? text.replace(/&[^;&]*;/g, (e) => entity(e) ?? e) : text;
67
+ }
68
+ const isWhite = (c) => c === " " || c === "\t" || c === "\n" || c === "\r";
69
+ const allWhite = (text) => /^[ \t\n\r]*$/.test(text);
70
+ /**
71
+ * `text` read into `root`'s children as Flash reads it (adl): elements,
72
+ * text, and CDATA as text; the XML declaration and DOCTYPE, in any case,
73
+ * kept aside; comments dropped; whitespace-only text too where
74
+ * `ignoreWhite`. Any other `<?` is malformed, and any other `<!` an
75
+ * element whose name starts with `!`. Attributes need no space between
76
+ * them, and a name's first value is kept. An end tag of an element further
77
+ * up closes those within it as unmatched starts; one of none is an error.
78
+ * It stops at the first error, what it read before kept. `id` gets each
79
+ * element with an `id` attribute.
80
+ */
81
+ function parseXml(text, root, ignoreWhite, id, version) {
82
+ const parsed = { status: OK, xmlDecl: null, docTypeDecl: null };
83
+ const open = [root];
84
+ const top = () => open[open.length - 1];
85
+ const addText = (value) => {
86
+ if (value !== "" && !(ignoreWhite && allWhite(value))) {
87
+ top().adopt(new XmlNode(TEXT_NODE, value), version);
88
+ }
89
+ };
90
+ const fail = (status) => {
91
+ parsed.status = status;
92
+ return parsed;
93
+ };
94
+ const startsCaseless = (s, at) => text.slice(at, at + s.length).toLowerCase() === s.toLowerCase();
95
+ let i = 0;
96
+ while (i < text.length) {
97
+ if (text[i] !== "<") {
98
+ let next = text.indexOf("<", i);
99
+ if (next < 0) {
100
+ next = text.length;
101
+ }
102
+ addText(unescapeXml(text.slice(i, next)));
103
+ i = next;
104
+ continue;
105
+ }
106
+ if (text.startsWith("<!--", i)) {
107
+ const end = text.indexOf("-->", i + 4);
108
+ if (end < 0) {
109
+ return fail(COMMENT_NOT_TERMINATED);
110
+ }
111
+ i = end + 3;
112
+ continue;
113
+ }
114
+ if (text.startsWith("<![CDATA[", i)) {
115
+ const end = text.indexOf("]]>", i + 9);
116
+ if (end < 0) {
117
+ return fail(CDATA_NOT_TERMINATED);
118
+ }
119
+ addText(text.slice(i + 9, end));
120
+ i = end + 3;
121
+ continue;
122
+ }
123
+ if (startsCaseless("<!DOCTYPE", i)) {
124
+ // Up to its >, past any <...> within it.
125
+ let depth = 0;
126
+ let end = -1;
127
+ for (let j = i + 9; j < text.length && end < 0; j++) {
128
+ if (text[j] === "<") {
129
+ depth++;
130
+ }
131
+ else if (text[j] === ">") {
132
+ if (depth === 0) {
133
+ end = j;
134
+ }
135
+ depth--;
136
+ }
137
+ }
138
+ if (end < 0) {
139
+ return fail(DOCTYPE_NOT_TERMINATED);
140
+ }
141
+ parsed.docTypeDecl = text.slice(i, end + 1);
142
+ i = end + 1;
143
+ continue;
144
+ }
145
+ if (text.startsWith("<?", i)) {
146
+ if (!startsCaseless("<?xml", i) || !isWhite(text[i + 5])) {
147
+ return fail(ELEMENT_MALFORMED);
148
+ }
149
+ const end = text.indexOf("?>", i + 5);
150
+ if (end < 0) {
151
+ return fail(DECL_NOT_TERMINATED);
152
+ }
153
+ parsed.xmlDecl = text.slice(i, end + 2);
154
+ i = end + 2;
155
+ continue;
156
+ }
157
+ if (text.startsWith("</", i)) {
158
+ const end = text.indexOf(">", i + 2);
159
+ if (end < 0) {
160
+ return fail(ELEMENT_MALFORMED);
161
+ }
162
+ const name = text.slice(i + 2, end).replace(/[ \t\n\r]+$/, "");
163
+ let at = open.length - 1;
164
+ while (at > 0 && open[at].value !== name) {
165
+ at--;
166
+ }
167
+ if (at === 0) {
168
+ return fail(MISMATCHED_END);
169
+ }
170
+ if (at < open.length - 1) {
171
+ parsed.status = MISMATCHED_START;
172
+ }
173
+ open.length = at;
174
+ i = end + 1;
175
+ continue;
176
+ }
177
+ // An element: its name, up to whitespace, > or />, then its attributes.
178
+ let j = i + 1;
179
+ while (j < text.length && !isWhite(text[j]) && text[j] !== ">" && !text.startsWith("/>", j)) {
180
+ j++;
181
+ }
182
+ if (j === i + 1 || j >= text.length) {
183
+ return fail(ELEMENT_MALFORMED);
184
+ }
185
+ const element = new XmlNode(ELEMENT_NODE, text.slice(i + 1, j));
186
+ const names = [];
187
+ const seen = new Set();
188
+ const values = [];
189
+ let empty = false;
190
+ for (;;) {
191
+ while (isWhite(text[j])) {
192
+ j++;
193
+ }
194
+ if (j >= text.length) {
195
+ return fail(ELEMENT_MALFORMED);
196
+ }
197
+ if (text[j] === ">") {
198
+ j++;
199
+ break;
200
+ }
201
+ if (text.startsWith("/>", j)) {
202
+ empty = true;
203
+ j += 2;
204
+ break;
205
+ }
206
+ const start = j;
207
+ while (j < text.length && !isWhite(text[j]) && text[j] !== "=" && text[j] !== ">") {
208
+ j++;
209
+ }
210
+ const name = text.slice(start, j);
211
+ while (isWhite(text[j])) {
212
+ j++;
213
+ }
214
+ if (name === "" || text[j] !== "=") {
215
+ return fail(ELEMENT_MALFORMED);
216
+ }
217
+ j++;
218
+ while (isWhite(text[j])) {
219
+ j++;
220
+ }
221
+ const quote = text[j];
222
+ if (quote !== '"' && quote !== "'") {
223
+ return fail(ELEMENT_MALFORMED);
224
+ }
225
+ const close = text.indexOf(quote, j + 1);
226
+ if (close < 0) {
227
+ return fail(ATTRIBUTE_NOT_TERMINATED);
228
+ }
229
+ if (!seen.has(name)) {
230
+ seen.add(name);
231
+ names.push(name);
232
+ values.push(unescapeXml(text.slice(j + 1, close)));
233
+ }
234
+ j = close + 1;
235
+ }
236
+ // Added last first, so that for..in, which lists the newest first, has them as written.
237
+ for (let a = names.length - 1; a >= 0; a--) {
238
+ element.attributes.define(names[a], values[a], 0);
239
+ }
240
+ for (let a = 0; a < names.length; a++) {
241
+ if (names[a] === "id") {
242
+ id(values[a], element);
243
+ }
244
+ }
245
+ top().adopt(element, version);
246
+ if (!empty) {
247
+ open.push(element);
248
+ }
249
+ i = j;
250
+ }
251
+ return open.length > 1 ? fail(MISMATCHED_START) : parsed;
252
+ }
253
+ /** `_global.XML`, given XMLNode's class, and its native side. */
254
+ export function xmlClass(host, nodes) {
255
+ const realm = host.realm;
256
+ const documents = new WeakMap();
257
+ const proto = new avm1.Avm1Object(nodes.proto);
258
+ /** `text` read into the document of `self`, by its ignoreWhite. */
259
+ const parse = (self, doc, text, v) => {
260
+ const ignoreWhite = avm1.toBoolean(avm1.get(self, "ignoreWhite", v), v);
261
+ const parsed = parseXml(text, doc.root, ignoreWhite, (value, node) => doc.idMap.define(value, nodes.objectOf(node, v), 0), v);
262
+ doc.status = parsed.status;
263
+ if (parsed.xmlDecl !== null) {
264
+ doc.root.xmlDecl = parsed.xmlDecl;
265
+ }
266
+ if (parsed.docTypeDecl !== null) {
267
+ doc.root.docTypeDecl = parsed.docTypeDecl;
268
+ }
269
+ };
270
+ const constr = realm.classOf(proto, (self, args, v) => {
271
+ const doc = {
272
+ root: new XmlNode(ELEMENT_NODE, null),
273
+ idMap: new avm1.Avm1Object(),
274
+ status: OK,
275
+ };
276
+ nodes.bind(self, doc.root);
277
+ documents.set(self, doc);
278
+ // No text, undefined or null, is no parse (adl: new XML(undefined) is empty).
279
+ if (args[0] !== undefined && args[0] !== null) {
280
+ parse(self, doc, avm1.stringOf(args[0], v), v);
281
+ }
282
+ return self;
283
+ }, () => undefined);
284
+ // In Flash's order, which for..in lists reversed (adl).
285
+ const method = (name, fn) => proto.define(name, realm.method(fn), 0);
286
+ const property = (name, get, set, flags = 0) => {
287
+ const p = proto.add(name, undefined, flags);
288
+ p.get = realm.method((self) => {
289
+ const doc = documents.get(self);
290
+ return doc === undefined ? undefined : get(doc);
291
+ });
292
+ if (set !== null) {
293
+ p.set = realm.method((self, args, v) => {
294
+ const doc = documents.get(self);
295
+ if (doc !== undefined) {
296
+ set(doc, args[0], v);
297
+ }
298
+ return undefined;
299
+ });
300
+ }
301
+ };
302
+ /** A declaration as set: none for undefined or null. */
303
+ const declaration = (value, v) => value === undefined || value === null ? null : avm1.stringOf(value, v);
304
+ method("createElement", (self, args, v) => {
305
+ if (!documents.has(self) || args.length === 0) {
306
+ return undefined;
307
+ }
308
+ return nodes.objectOf(new XmlNode(ELEMENT_NODE, avm1.stringOf(args[0], v)), v);
309
+ });
310
+ method("createTextNode", (self, args, v) => {
311
+ if (!documents.has(self) || args.length === 0) {
312
+ return undefined;
313
+ }
314
+ return nodes.objectOf(new XmlNode(TEXT_NODE, avm1.stringOf(args[0], v)), v);
315
+ });
316
+ method("parseXML", (self, args, v) => {
317
+ const doc = documents.get(self);
318
+ if (doc === undefined) {
319
+ return undefined;
320
+ }
321
+ doc.root.clear(v);
322
+ if (args.length > 0) {
323
+ parse(self, doc, avm1.stringOf(args[0], v), v);
324
+ }
325
+ return undefined;
326
+ });
327
+ method("load", (self, args, v) => {
328
+ if (args[0] === null || !documents.has(self)) {
329
+ return false;
330
+ }
331
+ const url = avm1.stringOf(args[0], v);
332
+ startLoad(host, self, { url, method: "GET", headers: [], body: null }, v);
333
+ return true;
334
+ });
335
+ // Flash 8's send: the document posted, its answer dropped; no window shows it.
336
+ method("send", (self, args, v) => {
337
+ const doc = documents.get(self);
338
+ if (args.length === 0 || doc === undefined) {
339
+ return false;
340
+ }
341
+ return host.net.send(postOf(self, args[0], doc.root, v));
342
+ });
343
+ method("sendAndLoad", (self, args, v) => {
344
+ const doc = documents.get(self);
345
+ const target = args[1];
346
+ if (args[0] === null || doc === undefined || !(target instanceof avm1.Avm1Object)) {
347
+ return undefined;
348
+ }
349
+ startLoad(host, target, postOf(self, args[0], doc.root, v), v);
350
+ return undefined;
351
+ });
352
+ method("onLoad", () => undefined);
353
+ method("onData", (self, args, v) => {
354
+ const src = args[0];
355
+ if (src === undefined) {
356
+ call(self, "onLoad", [false], v);
357
+ }
358
+ else {
359
+ call(self, "parseXML", [avm1.stringOf(src, v)], v);
360
+ avm1.set(self, "loaded", true, v);
361
+ call(self, "onLoad", [true], v);
362
+ }
363
+ return undefined;
364
+ });
365
+ method("getBytesLoaded", (self, _, v) => avm1.get(self, "_bytesLoaded", v));
366
+ method("getBytesTotal", (self, _, v) => avm1.get(self, "_bytesTotal", v));
367
+ method("addRequestHeader", (self, args, v) => addRequestHeader(self, args, v));
368
+ proto.define("contentType", "application/x-www-form-urlencoded", 0);
369
+ property("docTypeDecl", (doc) => doc.root.docTypeDecl ?? undefined, (doc, value, v) => {
370
+ doc.root.docTypeDecl = declaration(value, v);
371
+ });
372
+ proto.define("ignoreWhite", false, 0);
373
+ proto.define("loaded", undefined, 0);
374
+ property("status", (doc) => doc.status, (doc, value) => {
375
+ doc.status = value;
376
+ });
377
+ property("xmlDecl", (doc) => doc.root.xmlDecl ?? undefined, (doc, value, v) => {
378
+ doc.root.xmlDecl = declaration(value, v);
379
+ });
380
+ property("idMap", (doc) => doc.idMap, null, avm1.DONT_ENUM | avm1.DONT_DELETE);
381
+ /** `self`'s document posted to `url` as its contentType, with its request headers. */
382
+ const postOf = (self, url, root, v) => {
383
+ const type = avm1.stringOf(avm1.get(self, "contentType", v), v);
384
+ return {
385
+ url: avm1.stringOf(url, v),
386
+ method: "POST",
387
+ headers: [...headersOf(self), ["Content-Type", type]],
388
+ body: bytesFor(serialize(root, v), v),
389
+ };
390
+ };
391
+ return constr;
392
+ }
393
+ /** `self[name](...args)` where it is a function. */
394
+ function call(self, name, args, v) {
395
+ return avm1.invoke(avm1.get(self, name, v), self, args, v);
396
+ }