From 5ac4f4358d01724da72d46ab29014b9a51a411cb Mon Sep 17 00:00:00 2001 From: dowgird Date: Tue, 6 Sep 2022 21:50:41 +0200 Subject: [PATCH] avm2: Added flash.net.URLVariables --- .../avm2/globals/flash/net/URLVariables.as | 33 ++++++++++++++++++ core/src/avm2/globals/globals.as | 1 + tests/tests/regression_tests.rs | 1 + tests/tests/swfs/avm2/url_vars/Test.as | 25 +++++++++++++ tests/tests/swfs/avm2/url_vars/output.txt | 3 ++ tests/tests/swfs/avm2/url_vars/test.swf | Bin 0 -> 749 bytes 6 files changed, 63 insertions(+) create mode 100644 core/src/avm2/globals/flash/net/URLVariables.as create mode 100644 tests/tests/swfs/avm2/url_vars/Test.as create mode 100644 tests/tests/swfs/avm2/url_vars/output.txt create mode 100644 tests/tests/swfs/avm2/url_vars/test.swf diff --git a/core/src/avm2/globals/flash/net/URLVariables.as b/core/src/avm2/globals/flash/net/URLVariables.as new file mode 100644 index 000000000..a9d72b7ee --- /dev/null +++ b/core/src/avm2/globals/flash/net/URLVariables.as @@ -0,0 +1,33 @@ +package flash.net { + import flash.utils.escapeMultiByte; + public dynamic class URLVariables { + // TODO: construct from String + // TODO: implement decode() + public function URLVariables() {} + + public function toString(): String { + var acc : String = "" + var sep :String = "" + for (p in this) { + var pe : String = escapeMultiByte(p); + var val = this[p]; + if (val is Array) { + for (i in val) { + acc += sep; + acc += pe; + acc += "="; + acc += escapeMultiByte(val[i]); + sep = "&"; + } + continue; + } + acc += sep; + acc += pe; + acc += "="; + acc += escapeMultiByte(val); + sep="&"; + } + return acc; + } + } +} diff --git a/core/src/avm2/globals/globals.as b/core/src/avm2/globals/globals.as index 8b5a3a3a4..9489e9f43 100644 --- a/core/src/avm2/globals/globals.as +++ b/core/src/avm2/globals/globals.as @@ -167,6 +167,7 @@ include "flash/net/URLLoaderDataFormat.as" include "flash/net/URLRequest.as" include "flash/net/URLRequestHeader.as" include "flash/net/URLRequestMethod.as" +include "flash/net/URLVariables.as" include "flash/printing/PrintJobOrientation.as" include "flash/security/CertificateStatus.as" diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 08fc9217c..d78b7d245 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -537,6 +537,7 @@ swf_tests! { (as3_uint_tostring, "avm2/uint_tostring", 1), (as3_unchecked_function, "avm2/unchecked_function", 1), (as3_url_loader, "avm2/url_loader", 1), + (as3_url_vars, "avm2/url_vars", 1), (as3_urshift, "avm2/urshift", 1), (as3_vector_coercion, "avm2/vector_coercion", 1), (as3_vector_concat, "avm2/vector_concat", 1), diff --git a/tests/tests/swfs/avm2/url_vars/Test.as b/tests/tests/swfs/avm2/url_vars/Test.as new file mode 100644 index 000000000..de6d9fb60 --- /dev/null +++ b/tests/tests/swfs/avm2/url_vars/Test.as @@ -0,0 +1,25 @@ +package { + import flash.display.MovieClip; + public class Test extends MovieClip { + public function Test() { + + } + } +} + +import flash.net.URLVariables; + +var variables:URLVariables = new URLVariables(); + +variables.foo = "a"; +trace(variables); + +variables = new URLVariables(); +variables.foo = [0,1,2]; +trace(variables); + +variables = new URLVariables(); +variables["😭"] = [0,"😭",2]; +trace(variables); + + diff --git a/tests/tests/swfs/avm2/url_vars/output.txt b/tests/tests/swfs/avm2/url_vars/output.txt new file mode 100644 index 000000000..963630929 --- /dev/null +++ b/tests/tests/swfs/avm2/url_vars/output.txt @@ -0,0 +1,3 @@ +foo=a +foo=0&foo=1&foo=2 +%F0%9F%98%AD=0&%F0%9F%98%AD=%F0%9F%98%AD&%F0%9F%98%AD=2 diff --git a/tests/tests/swfs/avm2/url_vars/test.swf b/tests/tests/swfs/avm2/url_vars/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..60f0754a3ebcef494c879483b2556e9277890b3c GIT binary patch literal 749 zcmVby_>X63vHnk3W(0s*cX*1X;2&r6gyNL90i6d z`l8J?+0tm5WU@;OPkw>#zWL^x-{3Fs4LOu)pS+Y%bZcBXD-91WtZNQYZFDjB9#WAW?=h_>yOkd^IFV537kmE zGF9S`9&s5}D@sKkQ868JU8-QqYZJxvdMXE0U90G$Oi?z=taiMhhgl8#zGIs>%&DH1 zY1cD94RD{7I}WDZ4RuV6%8VX!!73N_ZHEL!7x&1fTsK33W>kG~dxXhjvvfrZ?P{Oc zjuTuWjlXkGqYyW>2HV2rpZO8UA(PtFProMyE=3A{}uf@EUMLM=?hlRJg z#PLPnqr&RS?JL-1Uhp5MQqfa=9N4(+5IVENEjS45K4xUESq-zM-yFU?y24Y#ye?rG zl?LYeddN^PP3*Tn5|d3m>+>cycvYC0T@s{+bP`5sCXDlHht%Az%SeE^%Y8D86#l`t zJw8viOM*nx4{Syd7CWAIcQl9NS*SNx_$+9vYS;;8yK%-vN$ld=*B??rD8%BEg-jur zTo6PNC9)Dik|0XrgcM6lXiADtOTvsKXp^|VUMx6XLXYK~4 fuzafoe21(ISDKGlysA__9I$Ahp7O(Ab1NP2ZWUrx literal 0 HcmV?d00001