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 000000000..60f0754a3 Binary files /dev/null and b/tests/tests/swfs/avm2/url_vars/test.swf differ