Index: third_party/WebKit/LayoutTests/imported/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html b/third_party/WebKit/LayoutTests/imported/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html |
index 79440e212d599090c89cd71db0fa8723c6cc59b4..7560fcd137788199da0e39e08c6562950ea6a10d 100644 |
--- a/third_party/WebKit/LayoutTests/imported/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html |
@@ -70,16 +70,25 @@ addTest(function() { |
* Also tests for [[GetOwnProperty]] and [[HasOwnProperty]] behavior. |
*/ |
-var whitelistedWindowProps = ['location', 'postMessage', 'window', 'frames', 'self', 'top', 'parent', |
- 'opener', 'closed', 'close', 'blur', 'focus', 'length']; |
+var whitelistedWindowIndices = ['0', '1']; |
+var whitelistedWindowPropNames = ['location', 'postMessage', 'window', 'frames', 'self', 'top', 'parent', |
+ 'opener', 'closed', 'close', 'blur', 'focus', 'length']; |
+whitelistedWindowPropNames = whitelistedWindowPropNames.concat(whitelistedWindowIndices); |
+whitelistedWindowPropNames.sort(); |
+var whitelistedLocationPropNames = ['href', 'replace']; |
+whitelistedLocationPropNames.sort(); |
+var whitelistedSymbols = [Symbol.toStringTag, Symbol.hasInstance, |
+ Symbol.isConcatSpreadable]; |
+var whitelistedWindowProps = whitelistedWindowPropNames.concat(whitelistedSymbols); |
+ |
addTest(function() { |
for (var prop in window) { |
if (whitelistedWindowProps.indexOf(prop) != -1) { |
C[prop]; // Shouldn't throw. |
Object.getOwnPropertyDescriptor(C, prop); // Shouldn't throw. |
- assert_true(Object.prototype.hasOwnProperty.call(C, prop), "hasOwnProperty for " + prop); |
+ assert_true(Object.prototype.hasOwnProperty.call(C, prop), "hasOwnProperty for " + String(prop)); |
} else { |
- assert_throws(null, function() { C[prop]; }, "Should throw when accessing " + prop + " on Window"); |
+ assert_throws(null, function() { C[prop]; }, "Should throw when accessing " + String(prop) + " on Window"); |
assert_throws(null, function() { Object.getOwnPropertyDescriptor(C, prop); }, |
"Should throw when accessing property descriptor for " + prop + " on Window"); |
assert_throws(null, function() { Object.prototype.hasOwnProperty.call(C, prop); }, |
@@ -169,9 +178,18 @@ addTest(function() { |
}, "[[GetOwnProperty]] - Properties on cross-origin objects should be reported |own|"); |
function checkPropertyDescriptor(desc, propName, expectWritable) { |
+ var isSymbol = (typeof(propName) == "symbol"); |
+ propName = String(propName); |
assert_true(isObject(desc), "property descriptor for " + propName + " should exist"); |
assert_equals(desc.enumerable, false, "property descriptor for " + propName + " should be non-enumerable"); |
assert_equals(desc.configurable, true, "property descriptor for " + propName + " should be configurable"); |
+ if (isSymbol) { |
+ assert_true("value" in desc, |
+ "property descriptor for " + propName + " should be a value descriptor"); |
+ assert_equals(desc.value, undefined, |
+ "symbol-named cross-origin visible prop " + propName + |
+ " should come back as undefined"); |
+ } |
if ('value' in desc) |
assert_equals(desc.writable, expectWritable, "property descriptor for " + propName + " should have writable: " + expectWritable); |
else |
@@ -187,6 +205,10 @@ addTest(function() { |
checkPropertyDescriptor(Object.getOwnPropertyDescriptor(C.location, 'replace'), 'replace', false); |
checkPropertyDescriptor(Object.getOwnPropertyDescriptor(C.location, 'href'), 'href', true); |
assert_equals(typeof Object.getOwnPropertyDescriptor(C.location, 'href').get, 'undefined', "Cross-origin location should have no href getter"); |
+ whitelistedSymbols.forEach(function(prop) { |
+ var desc = Object.getOwnPropertyDescriptor(C.location, prop); |
+ checkPropertyDescriptor(desc, prop, false); |
+ }); |
}, "[[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly"); |
/* |
@@ -243,13 +265,44 @@ addTest(function() { |
*/ |
addTest(function() { |
- assert_array_equals(whitelistedWindowProps.sort(), Object.getOwnPropertyNames(C).sort(), |
+ assert_array_equals(Object.getOwnPropertyNames(C).sort(), |
+ whitelistedWindowPropNames, |
"Object.getOwnPropertyNames() gives the right answer for cross-origin Window"); |
- assert_array_equals(Object.getOwnPropertyNames(C.location).sort(), ['href', 'replace'], |
+ assert_array_equals(Object.getOwnPropertyNames(C.location).sort(), |
+ whitelistedLocationPropNames, |
"Object.getOwnPropertyNames() gives the right answer for cross-origin Location"); |
}, "[[OwnPropertyKeys]] should return all properties from cross-origin objects"); |
addTest(function() { |
+ assert_array_equals(Object.getOwnPropertySymbols(C), whitelistedSymbols, |
+ "Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window"); |
+ assert_array_equals(Object.getOwnPropertySymbols(C.location), |
+ whitelistedSymbols, |
+ "Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Location"); |
+}, "[[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects"); |
+ |
+addTest(function() { |
+ var allWindowProps = Reflect.ownKeys(C); |
+ indexedWindowProps = allWindowProps.slice(0, whitelistedWindowIndices.length); |
+ stringWindowProps = allWindowProps.slice(0, -1 * whitelistedSymbols.length); |
+ symbolWindowProps = allWindowProps.slice(-1 * whitelistedSymbols.length); |
+ assert_array_equals(indexedWindowProps, whitelistedWindowIndices, |
+ "Reflect.ownKeys should start with the indices exposed on the cross-origin window."); |
+ assert_array_equals(stringWindowProps.sort(), whitelistedWindowPropNames, |
+ "Reflect.ownKeys should continue with the cross-origin window properties for a cross-origin Window."); |
+ assert_array_equals(symbolWindowProps, whitelistedSymbols, |
+ "Reflect.ownKeys should end with the cross-origin symbols for a cross-origin Window."); |
+ |
+ var allLocationProps = Reflect.ownKeys(C.location); |
+ stringLocationProps = allLocationProps.slice(0, -1 * whitelistedSymbols.length); |
+ symbolLocationProps = allLocationProps.slice(-1 * whitelistedSymbols.length); |
+ assert_array_equals(stringLocationProps.sort(), whitelistedLocationPropNames, |
+ "Reflect.ownKeys should start with the cross-origin window properties for a cross-origin Location.") |
+ assert_array_equals(symbolLocationProps, whitelistedSymbols, |
+ "Reflect.ownKeys should end with the cross-origin symbols for a cross-origin Location.") |
+}, "[[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices"); |
+ |
+addTest(function() { |
assert_true(B.eval('parent.C') === C, "A and B observe the same identity for C's Window"); |
assert_true(B.eval('parent.C.location') === C.location, "A and B observe the same identity for C's Location"); |
}, "A and B jointly observe the same identity for cross-origin Window and Location"); |
@@ -312,6 +365,11 @@ addTest(function() { |
checkFunction(set_href_B, B.Function.prototype); |
}, "Same-origin observers get different accessors for cross-origin Location"); |
+addTest(function() { |
+ assert_equals({}.toString.call(C), "[object Object]"); |
+ assert_equals({}.toString.call(C.location), "[object Object]"); |
+}, "{}.toString.call() does the right thing on cross-origin objects"); |
+ |
// We do a fresh load of the subframes for each test to minimize side-effects. |
// It would be nice to reload ourselves as well, but we can't do that without |
// disrupting the test harness. |