Andy Li 10 years ago
parent
commit
8b0ddd4f61
3 changed files with 46 additions and 5 deletions
  1. 2 5
      std/js/Boot.hx
  2. 7 0
      tests/unit/compile-js.hxml
  3. 37 0
      tests/unit/src/unit/issues/Issue4138.hx

+ 2 - 5
std/js/Boot.hx

@@ -242,12 +242,9 @@ class Boot {
 		return __nativeClassName(o) != null;
 	}
 
-	// resolve native JS class (with window or global):
+	// resolve native JS class in the global scope:
 	static function __resolveNativeClass(name:String) untyped {
-		if (__js__("typeof window") != "undefined")
-			return window[name];
-		else
-			return global[name];
+		return untyped Function('return typeof $name != "undefined" ? $name : null')();
 	}
 
 }

+ 7 - 0
tests/unit/compile-js.hxml

@@ -1,3 +1,10 @@
+-cp src
+-main unit.issues.Issue4138
+-js bin/Issue4138_Worker.js
+-D worker
+
+--next
+
 compile-each.hxml
 unit.Test
 -js bin/unit.js

+ 37 - 0
tests/unit/src/unit/issues/Issue4138.hx

@@ -0,0 +1,37 @@
+package unit.issues;
+
+#if worker
+import js.html.compat.ArrayBuffer;
+
+@:keep class Issue4138 {
+	static function main():Void {
+		var b = new js.html.ArrayBuffer(1);
+		// `Type.getClassName` uses `js.Boot.__resolveNativeClass`, thus will test for #4183 too.
+		(untyped postMessage)(Type.getClassName(Type.getClass(b)));
+	}
+}
+#else
+class Issue4138 extends unit.Test
+{
+	#if js
+	public function test()
+	{
+		var NativeArrayBuffer = untyped Function("return typeof ArrayBuffer != 'undefined' ? ArrayBuffer : null")();
+		if (js.Browser.supported && untyped js.Browser.window.Worker && NativeArrayBuffer != null){
+			async(function(_, cb){
+				var myWorker = new js.html.Worker("bin/Issue4138_Worker.js");
+				myWorker.onmessage = function(e:Dynamic){
+					var className:String = e.data;
+					f(className == Type.getClassName(js.html.compat.ArrayBuffer));
+					cb(true);
+				}
+				myWorker.onerror = function(e){
+					log('${e.message} (${e.filename}:${e.lineno})');
+					t(false);
+				}
+			}, null, true);
+		}
+	}
+	#end
+}
+#end