JSC incorrectly interpreting script, sets Global Property instead of Global Lexical...
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Jan 2018 10:18:28 +0000 (10:18 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Jan 2018 10:18:28 +0000 (10:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=182074
<rdar://problem/36846261>

Reviewed by Mark Lam.

JSTests:

* stress/jsonp-program-evaluate-path-must-consider-global-lexical-environment.js: Added.
(assert):
(let.func):
(let.o.foo):
(varFunc):

LayoutTests/imported/w3c:

* web-platform-tests/service-workers/service-worker/import-scripts-updated-flag.https-expected.txt:

Source/JavaScriptCore:

This patch teaches the JSONP evaluator about the global lexical environment.
Before, it was using the global object as the global scope, but that's wrong.
The global lexical environment is the first node in the global scope chain.

* interpreter/Interpreter.cpp:
(JSC::Interpreter::executeProgram):
* jsc.cpp:
(GlobalObject::finishCreation):
(shellSupportsRichSourceInfo):
(functionDisableRichSourceInfo):
* runtime/LiteralParser.cpp:
(JSC::LiteralParser<CharType>::tryJSONPParse):
* runtime/LiteralParser.h:

LayoutTests:

* http/tests/security/regress-52192-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@227898 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/stress/jsonp-program-evaluate-path-must-consider-global-lexical-environment.js [new file with mode: 0644]
LayoutTests/ChangeLog
LayoutTests/http/tests/security/regress-52192-expected.txt
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-updated-flag.https-expected.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/interpreter/Interpreter.cpp
Source/JavaScriptCore/jsc.cpp
Source/JavaScriptCore/runtime/LiteralParser.cpp
Source/JavaScriptCore/runtime/LiteralParser.h

index a8e453c..8bec480 100644 (file)
@@ -1,3 +1,17 @@
+2018-01-31  Saam Barati  <sbarati@apple.com>
+
+        JSC incorrectly interpreting script, sets Global Property instead of Global Lexical variable (LiteralParser / JSONP path)
+        https://bugs.webkit.org/show_bug.cgi?id=182074
+        <rdar://problem/36846261>
+
+        Reviewed by Mark Lam.
+
+        * stress/jsonp-program-evaluate-path-must-consider-global-lexical-environment.js: Added.
+        (assert):
+        (let.func):
+        (let.o.foo):
+        (varFunc):
+
 2018-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Unreviewed, update test262 expects
diff --git a/JSTests/stress/jsonp-program-evaluate-path-must-consider-global-lexical-environment.js b/JSTests/stress/jsonp-program-evaluate-path-must-consider-global-lexical-environment.js
new file mode 100644 (file)
index 0000000..dd94bf3
--- /dev/null
@@ -0,0 +1,53 @@
+function assert(b) {
+    if (!b)
+        throw new Error("Bad");
+}
+
+disableRichSourceInfo(); // This is needed for the JSONP path to be taken for calls.
+
+let a = 22;
+loadString("a = 42");
+assert(a === 42);
+
+let b = {f: 22};
+loadString("b.f = 42");
+assert(b.f === 42);
+
+let foo = null;
+let bar = 42;
+loadString("foo = 'root'; bar = 5")
+assert(foo === "root");
+assert(bar === 5);
+
+let called = false;
+let func = (a) => {
+    assert(a.foo === 20);
+    called = true;
+};
+
+loadString("func({foo:20})");
+assert(called);
+
+called = false;
+let o = {
+    foo(arg) {
+        assert(arg.foo === 20);
+        called = true;
+    }
+};
+
+loadString("o.foo({foo:20})");
+assert(called);
+
+var theVar = 20;
+loadString("theVar = 42");
+assert(theVar === 42);
+assert(this.theVar === 42);
+
+called = false;
+var varFunc = (a) => {
+    assert(a.foo === 20);
+    called = true;
+};
+loadString("varFunc({foo:20})");
+assert(called);
index 92402bb..76d68f5 100644 (file)
@@ -1,3 +1,13 @@
+2018-01-31  Saam Barati  <sbarati@apple.com>
+
+        JSC incorrectly interpreting script, sets Global Property instead of Global Lexical variable (LiteralParser / JSONP path)
+        https://bugs.webkit.org/show_bug.cgi?id=182074
+        <rdar://problem/36846261>
+
+        Reviewed by Mark Lam.
+
+        * http/tests/security/regress-52192-expected.txt:
+
 2018-01-30  John Wilander  <wilander@apple.com>
 
         Add callbacks to testRunner.statisticsSetShouldPartitionCookiesForHost() and testRunner.statisticsUpdateCookiePartitioning()
index df30f9c..bbba474 100644 (file)
@@ -871,15 +871,15 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 33] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 33] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 17:       [Error] e = 'OtherScriptError: Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'OtherScriptError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 43: Test thrown EvalError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 33] var e = new EvalError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 33] e.name = 'OtherScriptEvalError'
+CONSOLE MESSAGE: line 17:       [EvalError] e = 'OtherScriptEvalError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [EvalError] e.name = 'OtherScriptEvalError'
+CONSOLE MESSAGE: line 19:       [EvalError] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [EvalError] e.toString() = 'OtherScriptEvalError: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 33] throw e;
-CONSOLE MESSAGE: line 31:    [case 33] Caught: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 31:    [case 33] Caught: OtherScriptEvalError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 32:    [case 33]    re-throw e;
 CONSOLE MESSAGE: line 47:    [case 33] in window.onerror: err = Script error.
 CONSOLE MESSAGE: line 48:    [case 33] in window.onerror: err.name = undefined
@@ -889,17 +889,17 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptEvalError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 34] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 34] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 17:       [Error] e = 'OtherScriptError: Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'OtherScriptError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 43: Test thrown RangeError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 34] var e = new RangeError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 34] e.name = 'OtherScriptRangeError'
+CONSOLE MESSAGE: line 17:       [RangeError] e = 'OtherScriptRangeError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [RangeError] e.name = 'OtherScriptRangeError'
+CONSOLE MESSAGE: line 19:       [RangeError] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [RangeError] e.toString() = 'OtherScriptRangeError: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 34] throw e;
-CONSOLE MESSAGE: line 31:    [case 34] Caught: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 31:    [case 34] Caught: OtherScriptRangeError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 32:    [case 34]    re-throw e;
 CONSOLE MESSAGE: line 47:    [case 34] in window.onerror: err = Script error.
 CONSOLE MESSAGE: line 48:    [case 34] in window.onerror: err.name = undefined
@@ -909,17 +909,17 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptRangeError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 35] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 35] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 17:       [Error] e = 'OtherScriptError: Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'OtherScriptError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 43: Test thrown ReferenceError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 35] var e = new ReferenceError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 35] e.name = 'OtherScriptReferenceError'
+CONSOLE MESSAGE: line 17:       [ReferenceError] e = 'OtherScriptReferenceError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [ReferenceError] e.name = 'OtherScriptReferenceError'
+CONSOLE MESSAGE: line 19:       [ReferenceError] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [ReferenceError] e.toString() = 'OtherScriptReferenceError: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 35] throw e;
-CONSOLE MESSAGE: line 31:    [case 35] Caught: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 31:    [case 35] Caught: OtherScriptReferenceError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 32:    [case 35]    re-throw e;
 CONSOLE MESSAGE: line 47:    [case 35] in window.onerror: err = Script error.
 CONSOLE MESSAGE: line 48:    [case 35] in window.onerror: err.name = undefined
@@ -929,17 +929,17 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptReferenceError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 36] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 36] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 17:       [Error] e = 'OtherScriptError: Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'OtherScriptError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 43: Test thrown SyntaxError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 36] var e = new SyntaxError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 36] e.name = 'OtherScriptSyntaxError'
+CONSOLE MESSAGE: line 17:       [SyntaxError] e = 'OtherScriptSyntaxError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [SyntaxError] e.name = 'OtherScriptSyntaxError'
+CONSOLE MESSAGE: line 19:       [SyntaxError] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [SyntaxError] e.toString() = 'OtherScriptSyntaxError: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 36] throw e;
-CONSOLE MESSAGE: line 31:    [case 36] Caught: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 31:    [case 36] Caught: OtherScriptSyntaxError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 32:    [case 36]    re-throw e;
 CONSOLE MESSAGE: line 47:    [case 36] in window.onerror: err = Script error.
 CONSOLE MESSAGE: line 48:    [case 36] in window.onerror: err.name = undefined
@@ -949,17 +949,17 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptSyntaxError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 37] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 37] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 17:       [Error] e = 'OtherScriptError: Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'OtherScriptError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 43: Test thrown TypeError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 37] var e = new TypeError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 37] e.name = 'OtherScriptTypeError'
+CONSOLE MESSAGE: line 17:       [TypeError] e = 'OtherScriptTypeError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [TypeError] e.name = 'OtherScriptTypeError'
+CONSOLE MESSAGE: line 19:       [TypeError] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [TypeError] e.toString() = 'OtherScriptTypeError: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 37] throw e;
-CONSOLE MESSAGE: line 31:    [case 37] Caught: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 31:    [case 37] Caught: OtherScriptTypeError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 32:    [case 37]    re-throw e;
 CONSOLE MESSAGE: line 47:    [case 37] in window.onerror: err = Script error.
 CONSOLE MESSAGE: line 48:    [case 37] in window.onerror: err.name = undefined
@@ -969,17 +969,17 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptTypeError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 38] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 38] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 17:       [Error] e = 'OtherScriptError: Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'OtherScriptError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 43: Test thrown URIError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 38] var e = new URIError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 38] e.name = 'OtherScriptURIError'
+CONSOLE MESSAGE: line 17:       [URIError] e = 'OtherScriptURIError: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [URIError] e.name = 'OtherScriptURIError'
+CONSOLE MESSAGE: line 19:       [URIError] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [URIError] e.toString() = 'OtherScriptURIError: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 38] throw e;
-CONSOLE MESSAGE: line 31:    [case 38] Caught: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 31:    [case 38] Caught: OtherScriptURIError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 32:    [case 38]    re-throw e;
 CONSOLE MESSAGE: line 47:    [case 38] in window.onerror: err = Script error.
 CONSOLE MESSAGE: line 48:    [case 38] in window.onerror: err.name = undefined
@@ -989,7 +989,7 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptURIError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
 CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
 CONSOLE MESSAGE: line 9:    [case 39] var e = new Error('Error thrown from other script with Secret');
@@ -1019,19 +1019,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: Error: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 40] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 40] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown EvalError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 40] var e = new EvalError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 40] e.name = 'OtherScriptEvalError'
 CONSOLE MESSAGE: line 67:    [case 40] in 'name' getter[8]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorName: getter[8] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [EvalError] e = 'GetterErrorName: getter[8] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 40] in 'name' getter[9]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'GetterErrorName: getter[9] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [EvalError] e.name = 'GetterErrorName: getter[9] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 19:       [EvalError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 40] in 'name' getter[10]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorName: getter[10] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [EvalError] e.toString() = 'GetterErrorName: getter[10] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 40] throw e;
 CONSOLE MESSAGE: line 67:    [case 40] in 'name' getter[11]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1047,19 +1047,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: Error: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 41] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 41] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown RangeError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 41] var e = new RangeError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 41] e.name = 'OtherScriptRangeError'
 CONSOLE MESSAGE: line 67:    [case 41] in 'name' getter[12]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorName: getter[12] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [RangeError] e = 'GetterErrorName: getter[12] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 41] in 'name' getter[13]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'GetterErrorName: getter[13] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [RangeError] e.name = 'GetterErrorName: getter[13] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 19:       [RangeError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 41] in 'name' getter[14]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorName: getter[14] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [RangeError] e.toString() = 'GetterErrorName: getter[14] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 41] throw e;
 CONSOLE MESSAGE: line 67:    [case 41] in 'name' getter[15]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1075,19 +1075,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: Error: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 42] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 42] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown ReferenceError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 42] var e = new ReferenceError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 42] e.name = 'OtherScriptReferenceError'
 CONSOLE MESSAGE: line 67:    [case 42] in 'name' getter[16]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorName: getter[16] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [ReferenceError] e = 'GetterErrorName: getter[16] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 42] in 'name' getter[17]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'GetterErrorName: getter[17] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [ReferenceError] e.name = 'GetterErrorName: getter[17] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 19:       [ReferenceError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 42] in 'name' getter[18]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorName: getter[18] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [ReferenceError] e.toString() = 'GetterErrorName: getter[18] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 42] throw e;
 CONSOLE MESSAGE: line 67:    [case 42] in 'name' getter[19]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1103,19 +1103,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: Error: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 43] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 43] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown SyntaxError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 43] var e = new SyntaxError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 43] e.name = 'OtherScriptSyntaxError'
 CONSOLE MESSAGE: line 67:    [case 43] in 'name' getter[20]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorName: getter[20] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [SyntaxError] e = 'GetterErrorName: getter[20] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 43] in 'name' getter[21]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'GetterErrorName: getter[21] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [SyntaxError] e.name = 'GetterErrorName: getter[21] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 19:       [SyntaxError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 43] in 'name' getter[22]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorName: getter[22] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [SyntaxError] e.toString() = 'GetterErrorName: getter[22] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 43] throw e;
 CONSOLE MESSAGE: line 67:    [case 43] in 'name' getter[23]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1131,19 +1131,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: Error: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 44] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 44] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown TypeError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 44] var e = new TypeError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 44] e.name = 'OtherScriptTypeError'
 CONSOLE MESSAGE: line 67:    [case 44] in 'name' getter[24]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorName: getter[24] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [TypeError] e = 'GetterErrorName: getter[24] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 44] in 'name' getter[25]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'GetterErrorName: getter[25] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [TypeError] e.name = 'GetterErrorName: getter[25] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 19:       [TypeError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 44] in 'name' getter[26]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorName: getter[26] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [TypeError] e.toString() = 'GetterErrorName: getter[26] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 44] throw e;
 CONSOLE MESSAGE: line 67:    [case 44] in 'name' getter[27]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1159,19 +1159,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: Error: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 45] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 45] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown URIError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 45] var e = new URIError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 45] e.name = 'OtherScriptURIError'
 CONSOLE MESSAGE: line 67:    [case 45] in 'name' getter[28]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorName: getter[28] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [URIError] e = 'GetterErrorName: getter[28] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 45] in 'name' getter[29]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'GetterErrorName: getter[29] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [URIError] e.name = 'GetterErrorName: getter[29] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 19:       [URIError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 67:    [case 45] in 'name' getter[30]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorName: getter[30] Error thrown from other script with Secret: Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [URIError] e.toString() = 'GetterErrorName: getter[30] Error thrown from other script with Secret: Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 45] throw e;
 CONSOLE MESSAGE: line 67:    [case 45] in 'name' getter[31]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1213,17 +1213,17 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 47] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 47] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown EvalError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 47] var e = new EvalError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 47] e.name = 'OtherScriptEvalError'
 CONSOLE MESSAGE: line 95:    [case 47] in 'toString' getter[35]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorToString: getter[35] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [EvalError] e = 'GetterErrorToString: getter[35] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [EvalError] e.name = 'OtherScriptEvalError'
+CONSOLE MESSAGE: line 19:       [EvalError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 95:    [case 47] in 'toString' getter[36]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorToString: getter[36] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [EvalError] e.toString() = 'GetterErrorToString: getter[36] Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 47] throw e;
 CONSOLE MESSAGE: line 95:    [case 47] in 'toString' getter[37]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1237,19 +1237,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptEvalError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 48] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 48] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown RangeError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 48] var e = new RangeError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 48] e.name = 'OtherScriptRangeError'
 CONSOLE MESSAGE: line 95:    [case 48] in 'toString' getter[38]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorToString: getter[38] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [RangeError] e = 'GetterErrorToString: getter[38] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [RangeError] e.name = 'OtherScriptRangeError'
+CONSOLE MESSAGE: line 19:       [RangeError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 95:    [case 48] in 'toString' getter[39]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorToString: getter[39] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [RangeError] e.toString() = 'GetterErrorToString: getter[39] Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 48] throw e;
 CONSOLE MESSAGE: line 95:    [case 48] in 'toString' getter[40]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1263,19 +1263,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptRangeError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 49] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 49] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown ReferenceError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 49] var e = new ReferenceError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 49] e.name = 'OtherScriptReferenceError'
 CONSOLE MESSAGE: line 95:    [case 49] in 'toString' getter[41]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorToString: getter[41] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [ReferenceError] e = 'GetterErrorToString: getter[41] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [ReferenceError] e.name = 'OtherScriptReferenceError'
+CONSOLE MESSAGE: line 19:       [ReferenceError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 95:    [case 49] in 'toString' getter[42]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorToString: getter[42] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [ReferenceError] e.toString() = 'GetterErrorToString: getter[42] Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 49] throw e;
 CONSOLE MESSAGE: line 95:    [case 49] in 'toString' getter[43]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1289,19 +1289,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptReferenceError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 50] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 50] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown SyntaxError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 50] var e = new SyntaxError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 50] e.name = 'OtherScriptSyntaxError'
 CONSOLE MESSAGE: line 95:    [case 50] in 'toString' getter[44]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorToString: getter[44] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [SyntaxError] e = 'GetterErrorToString: getter[44] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [SyntaxError] e.name = 'OtherScriptSyntaxError'
+CONSOLE MESSAGE: line 19:       [SyntaxError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 95:    [case 50] in 'toString' getter[45]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorToString: getter[45] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [SyntaxError] e.toString() = 'GetterErrorToString: getter[45] Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 50] throw e;
 CONSOLE MESSAGE: line 95:    [case 50] in 'toString' getter[46]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1315,19 +1315,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptSyntaxError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 51] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 51] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown TypeError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 51] var e = new TypeError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 51] e.name = 'OtherScriptTypeError'
 CONSOLE MESSAGE: line 95:    [case 51] in 'toString' getter[47]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorToString: getter[47] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [TypeError] e = 'GetterErrorToString: getter[47] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [TypeError] e.name = 'OtherScriptTypeError'
+CONSOLE MESSAGE: line 19:       [TypeError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 95:    [case 51] in 'toString' getter[48]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorToString: getter[48] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [TypeError] e.toString() = 'GetterErrorToString: getter[48] Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 51] throw e;
 CONSOLE MESSAGE: line 95:    [case 51] in 'toString' getter[49]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1341,19 +1341,19 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptTypeError: Error thrown from other script with Secret
 CONSOLE MESSAGE: line 42: 
-CONSOLE MESSAGE: line 43: Test thrown Error from a script from another domain
-CONSOLE MESSAGE: line 9:    [case 52] var e = new Error('Error thrown from other script with Secret');
-CONSOLE MESSAGE: line 11:    [case 52] e.name = 'OtherScriptError'
+CONSOLE MESSAGE: line 43: Test thrown URIError from a script from another domain
+CONSOLE MESSAGE: line 9:    [case 52] var e = new URIError('Error thrown from other script with Secret');
+CONSOLE MESSAGE: line 11:    [case 52] e.name = 'OtherScriptURIError'
 CONSOLE MESSAGE: line 95:    [case 52] in 'toString' getter[50]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 17:       [Error] e = 'GetterErrorToString: getter[50] Error thrown from other script with Secret'
-CONSOLE MESSAGE: line 18:       [Error] e.name = 'OtherScriptError'
-CONSOLE MESSAGE: line 19:       [Error] e.message = 'Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 17:       [URIError] e = 'GetterErrorToString: getter[50] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 18:       [URIError] e.name = 'OtherScriptURIError'
+CONSOLE MESSAGE: line 19:       [URIError] e.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 95:    [case 52] in 'toString' getter[51]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 20:       [Error] e.toString() = 'GetterErrorToString: getter[51] Error thrown from other script with Secret'
+CONSOLE MESSAGE: line 20:       [URIError] e.toString() = 'GetterErrorToString: getter[51] Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 24:    [case 52] throw e;
 CONSOLE MESSAGE: line 95:    [case 52] in 'toString' getter[52]: error.message = 'Error thrown from other script with Secret'
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
@@ -1367,5 +1367,5 @@ CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
 CONSOLE MESSAGE: line 38: PASSED: Did not see any Secret from another domain
-CONSOLE MESSAGE: line 36: OtherScriptError: Error thrown from other script with Secret
+CONSOLE MESSAGE: line 36: OtherScriptURIError: Error thrown from other script with Secret
 Should not be able to read the secret text from another site.
index f97c4ee..782137c 100644 (file)
@@ -1,3 +1,13 @@
+2018-01-31  Saam Barati  <sbarati@apple.com>
+
+        JSC incorrectly interpreting script, sets Global Property instead of Global Lexical variable (LiteralParser / JSONP path)
+        https://bugs.webkit.org/show_bug.cgi?id=182074
+        <rdar://problem/36846261>
+
+        Reviewed by Mark Lam.
+
+        * web-platform-tests/service-workers/service-worker/import-scripts-updated-flag.https-expected.txt:
+
 2018-01-30  Youenn Fablet  <youenn@apple.com> and Oleksandr Skachkov  <gskachkov@gmail.com>
 
         FetchResponse should support ConsumeData callback on chunk data is received
index 4903e7b..b829fec 100644 (file)
@@ -1,7 +1,7 @@
-CONSOLE MESSAGE: line 30: Unhandled Promise Rejection: TypeError: undefined is not an object (evaluating 'registration.unregister')
 
-FAIL initialize global state assert_unreached: unregister and register should not fail: Error: assert_equals: expected (string) "root" but got (object) null Reached unreachable code
-FAIL import script previously imported at worker evaluation time promise_test: Unhandled rejection with value: object "TypeError: undefined is not an object (evaluating 'registration.installing')"
-FAIL import script previously imported at worker install time promise_test: Unhandled rejection with value: object "TypeError: undefined is not an object (evaluating 'registration.installing')"
-FAIL import script not previously imported promise_test: Unhandled rejection with value: object "TypeError: undefined is not an object (evaluating 'registration.installing')"
+PASS initialize global state 
+PASS import script previously imported at worker evaluation time 
+PASS import script previously imported at worker install time 
+FAIL import script not previously imported assert_equals: expected (string) "TypeError" but got (object) null
+PASS Tests for importScripts: import scripts updated flag 
 
index d700886..28c1743 100644 (file)
@@ -1,5 +1,27 @@
 2018-01-31  Saam Barati  <sbarati@apple.com>
 
+        JSC incorrectly interpreting script, sets Global Property instead of Global Lexical variable (LiteralParser / JSONP path)
+        https://bugs.webkit.org/show_bug.cgi?id=182074
+        <rdar://problem/36846261>
+
+        Reviewed by Mark Lam.
+
+        This patch teaches the JSONP evaluator about the global lexical environment.
+        Before, it was using the global object as the global scope, but that's wrong.
+        The global lexical environment is the first node in the global scope chain.
+
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::executeProgram):
+        * jsc.cpp:
+        (GlobalObject::finishCreation):
+        (shellSupportsRichSourceInfo):
+        (functionDisableRichSourceInfo):
+        * runtime/LiteralParser.cpp:
+        (JSC::LiteralParser<CharType>::tryJSONPParse):
+        * runtime/LiteralParser.h:
+
+2018-01-31  Saam Barati  <sbarati@apple.com>
+
         clean up pushToSaveImmediateWithoutTouchingRegisters a bit
         https://bugs.webkit.org/show_bug.cgi?id=181774
 
index dc294f1..cdc0f72 100644 (file)
@@ -827,7 +827,7 @@ JSValue Interpreter::executeProgram(const SourceCode& source, CallFrame* callFra
             Vector<JSONPPathEntry> JSONPPath;
             JSONPPath.swap(JSONPData[entry].m_path);
             JSValue JSONPValue = JSONPData[entry].m_value.get();
-            if (JSONPPath.size() == 1 && JSONPPath[0].m_type == JSONPPathEntryTypeDeclare) {
+            if (JSONPPath.size() == 1 && JSONPPath[0].m_type == JSONPPathEntryTypeDeclareVar) {
                 globalObject->addVar(callFrame, JSONPPath[0].m_pathEntryName);
                 RETURN_IF_EXCEPTION(throwScope, { });
                 PutPropertySlot slot(globalObject);
@@ -838,20 +838,39 @@ JSValue Interpreter::executeProgram(const SourceCode& source, CallFrame* callFra
             }
             JSValue baseObject(globalObject);
             for (unsigned i = 0; i < JSONPPath.size() - 1; i++) {
-                ASSERT(JSONPPath[i].m_type != JSONPPathEntryTypeDeclare);
+                ASSERT(JSONPPath[i].m_type != JSONPPathEntryTypeDeclareVar);
                 switch (JSONPPath[i].m_type) {
                 case JSONPPathEntryTypeDot: {
                     if (i == 0) {
-                        PropertySlot slot(globalObject, PropertySlot::InternalMethodType::Get);
-                        if (!globalObject->getPropertySlot(callFrame, JSONPPath[i].m_pathEntryName, slot)) {
-                            RETURN_IF_EXCEPTION(throwScope, JSValue());
-                            if (entry)
-                                return throwException(callFrame, throwScope, createUndefinedVariableError(callFrame, JSONPPath[i].m_pathEntryName));
-                            goto failedJSONP;
+                        RELEASE_ASSERT(baseObject == globalObject);
+
+                        auto doGet = [&] (JSSegmentedVariableObject* scope) {
+                            PropertySlot slot(scope, PropertySlot::InternalMethodType::Get);
+                            if (scope->getPropertySlot(callFrame, JSONPPath[i].m_pathEntryName, slot))
+                                return slot.getValue(callFrame, JSONPPath[i].m_pathEntryName);
+                            return JSValue();
+                        };
+
+                        JSValue result = doGet(globalObject->globalLexicalEnvironment());
+                        RETURN_IF_EXCEPTION(throwScope, JSValue());
+                        if (result) {
+                            baseObject = result;
+                            continue;
                         }
-                        baseObject = slot.getValue(callFrame, JSONPPath[i].m_pathEntryName);
-                    } else
-                        baseObject = baseObject.get(callFrame, JSONPPath[i].m_pathEntryName);
+
+                        result = doGet(globalObject);
+                        RETURN_IF_EXCEPTION(throwScope, JSValue());
+                        if (result) {
+                            baseObject = result;
+                            continue;
+                        }
+
+                        if (entry)
+                            return throwException(callFrame, throwScope, createUndefinedVariableError(callFrame, JSONPPath[i].m_pathEntryName));
+                        goto failedJSONP;
+                    }
+
+                    baseObject = baseObject.get(callFrame, JSONPPath[i].m_pathEntryName);
                     RETURN_IF_EXCEPTION(throwScope, JSValue());
                     continue;
                 }
@@ -865,6 +884,15 @@ JSValue Interpreter::executeProgram(const SourceCode& source, CallFrame* callFra
                     return jsUndefined();
                 }
             }
+
+            if (JSONPPath.size() == 1 && JSONPPath.last().m_type != JSONPPathEntryTypeLookup) {
+                RELEASE_ASSERT(baseObject == globalObject);
+                JSGlobalLexicalEnvironment* scope = globalObject->globalLexicalEnvironment();
+                if (scope->hasProperty(callFrame, JSONPPath.last().m_pathEntryName))
+                    baseObject = scope;
+                RETURN_IF_EXCEPTION(throwScope, JSValue());
+            }
+
             PutPropertySlot slot(baseObject);
             switch (JSONPPath.last().m_type) {
             case JSONPPathEntryTypeCall: {
@@ -877,7 +905,7 @@ JSValue Interpreter::executeProgram(const SourceCode& source, CallFrame* callFra
                 MarkedArgumentBuffer jsonArg;
                 jsonArg.append(JSONPValue);
                 ASSERT(!jsonArg.hasOverflowed());
-                JSValue thisValue = JSONPPath.size() == 1 ? jsUndefined(): baseObject;
+                JSValue thisValue = JSONPPath.size() == 1 ? jsUndefined() : baseObject;
                 JSONPValue = JSC::call(callFrame, function, callType, callData, thisValue, jsonArg);
                 RETURN_IF_EXCEPTION(throwScope, JSValue());
                 break;
@@ -894,7 +922,7 @@ JSValue Interpreter::executeProgram(const SourceCode& source, CallFrame* callFra
             }
             default:
                 RELEASE_ASSERT_NOT_REACHED();
-                    return jsUndefined();
+                return jsUndefined();
             }
             result = JSONPValue;
         }
index 3a96806..22f7dc7 100644 (file)
@@ -341,6 +341,7 @@ static EncodedJSValue JSC_HOST_CALL functionDollarAgentLeaving(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionWaitForReport(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionHeapCapacity(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionFlashHeapAccess(ExecState*);
+static EncodedJSValue JSC_HOST_CALL functionDisableRichSourceInfo(ExecState*);
 
 struct Script {
     enum class StrictMode {
@@ -596,6 +597,8 @@ protected:
 
         addFunction(vm, "heapCapacity", functionHeapCapacity, 0);
         addFunction(vm, "flashHeapAccess", functionFlashHeapAccess, 0);
+
+        addFunction(vm, "disableRichSourceInfo", functionDisableRichSourceInfo, 0);
     }
     
     void addFunction(VM& vm, JSObject* object, const char* name, NativeFunction function, unsigned arguments)
@@ -615,9 +618,15 @@ protected:
     static JSObject* moduleLoaderCreateImportMetaProperties(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSModuleRecord*, JSValue);
 };
 
+static bool supportsRichSourceInfo = true;
+static bool shellSupportsRichSourceInfo(const JSGlobalObject*)
+{
+    return supportsRichSourceInfo;
+}
+
 const ClassInfo GlobalObject::s_info = { "global", &JSGlobalObject::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(GlobalObject) };
 const GlobalObjectMethodTable GlobalObject::s_globalObjectMethodTable = {
-    &supportsRichSourceInfo,
+    &shellSupportsRichSourceInfo,
     &shouldInterruptScript,
     &javaScriptRuntimeFlags,
     nullptr, // queueTaskToEventLoop
@@ -1733,6 +1742,12 @@ EncodedJSValue JSC_HOST_CALL functionFlashHeapAccess(ExecState* exec)
     return JSValue::encode(jsUndefined());
 }
 
+EncodedJSValue JSC_HOST_CALL functionDisableRichSourceInfo(ExecState*)
+{
+    supportsRichSourceInfo = false;
+    return JSValue::encode(jsUndefined());
+}
+
 template<typename ValueType>
 typename std::enable_if<!std::is_fundamental<ValueType>::value>::type addOption(VM&, JSObject*, Identifier, ValueType) { }
 
index c43aefc..f00fe07 100644 (file)
@@ -63,7 +63,7 @@ bool LiteralParser<CharType>::tryJSONPParse(Vector<JSONPData>& results, bool nee
         if (name == vm.propertyNames->varKeyword) {
             if (m_lexer.next() != TokIdentifier)
                 return false;
-            entry.m_type = JSONPPathEntryTypeDeclare;
+            entry.m_type = JSONPPathEntryTypeDeclareVar;
             entry.m_pathEntryName = Identifier::fromString(&vm, m_lexer.currentToken()->start, m_lexer.currentToken()->end - m_lexer.currentToken()->start);
             path.append(entry);
         } else {
@@ -74,7 +74,7 @@ bool LiteralParser<CharType>::tryJSONPParse(Vector<JSONPData>& results, bool nee
         if (isLexerKeyword(entry.m_pathEntryName))
             return false;
         TokenType tokenType = m_lexer.next();
-        if (entry.m_type == JSONPPathEntryTypeDeclare && tokenType != TokAssign)
+        if (entry.m_type == JSONPPathEntryTypeDeclareVar && tokenType != TokAssign)
             return false;
         while (tokenType != TokAssign) {
             switch (tokenType) {
index 8e9b09b..bcb9f28 100644 (file)
@@ -36,7 +36,7 @@ namespace JSC {
 typedef enum { StrictJSON, NonStrictJSON, JSONP } ParserMode;
 
 enum JSONPPathEntryType {
-    JSONPPathEntryTypeDeclare, // var pathEntryName = JSON
+    JSONPPathEntryTypeDeclareVar, // var pathEntryName = JSON
     JSONPPathEntryTypeDot, // <prior entries>.pathEntryName = JSON
     JSONPPathEntryTypeLookup, // <prior entries>[pathIndex] = JSON
     JSONPPathEntryTypeCall // <prior entries>(JSON)