OLD | NEW |
1 description("Make sure prototypes are set up using the window a property came fr
om, instead of the lexical global object.") | 1 description("Make sure prototypes are set up using the window a property came fr
om, instead of the lexical global object.") |
2 | 2 |
3 var subframe = document.createElement("iframe"); | 3 var subframe = document.createElement("iframe"); |
4 document.body.appendChild(subframe); | 4 document.body.appendChild(subframe); |
5 var inner = subframe.contentWindow; // Call it "inner" to make shouldBe output s
horter | 5 var inner = subframe.contentWindow; // Call it "inner" to make shouldBe output s
horter |
6 | 6 |
7 // Stash a property on the prototypes. | 7 // Stash a property on the prototypes. |
8 window.Object.prototype.isInner = false; | 8 window.Object.prototype.isInner = false; |
9 inner.Object.prototype.isInner = true; | 9 inner.Object.prototype.isInner = true; |
10 | 10 |
11 function classNameForObject(object) | 11 function classNameForObject(object) |
12 { | 12 { |
13 // call will use the global object if passed null or undefined, so special c
ase those: | 13 // call will use the global object if passed null or undefined, so special c
ase those: |
14 if (object == null) | 14 if (object == null) |
15 return null; | 15 return null; |
16 var result = Object.prototype.toString.call(object); | 16 var result = Object.prototype.toString.call(object); |
17 // remove '[object ' and ']' | 17 // remove '[object ' and ']' |
18 return result.split(' ')[1].split(']')[0]; | 18 return result.split(' ')[1].split(']')[0]; |
19 } | 19 } |
20 | 20 |
21 function constructorPropertiesOnWindow(globalObject) | 21 function constructorPropertiesOnWindow(globalObject) |
22 { | 22 { |
23 var constructorNames = []; | 23 var constructorNames = []; |
24 for (var property in globalObject) { | 24 var propertyNames = Object.getOwnPropertyNames(window); |
25 var value = inner[property]; | 25 for (var i = 0; i < propertyNames.length; i++) { |
| 26 var value = inner[propertyNames[i]]; |
26 if (value == null) | 27 if (value == null) |
27 continue; | 28 continue; |
28 var type = classNameForObject(value); | 29 var type = classNameForObject(value); |
29 // Ignore these properties because they do not exist in all implementati
ons. They will be tested separately | 30 // Ignore these properties because they do not exist in all implementati
ons. They will be tested separately |
30 if (type == "WebGLRenderingContextConstructor" || | 31 if (type == "WebGLRenderingContextConstructor" || |
31 type == "ArrayBufferConstructor" || | 32 type == "ArrayBufferConstructor" || |
32 type =="Float32ArrayConstructor" || | 33 type =="Float32ArrayConstructor" || |
33 type =="Float64ArrayConstructor" || | 34 type =="Float64ArrayConstructor" || |
34 type =="Int8ArrayConstructor" || | 35 type =="Int8ArrayConstructor" || |
35 type =="Int16ArrayConstructor" || | 36 type =="Int16ArrayConstructor" || |
(...skipping 30 matching lines...) Expand all Loading... |
66 constructedObject = eval("new inner." + constructorName + argumentsStrin
g); | 67 constructedObject = eval("new inner." + constructorName + argumentsStrin
g); |
67 } catch(e) { | 68 } catch(e) { |
68 continue; | 69 continue; |
69 } | 70 } |
70 | 71 |
71 shouldBeTrue("(new inner." + constructorName + argumentsString + ").isInner"
); | 72 shouldBeTrue("(new inner." + constructorName + argumentsString + ").isInner"
); |
72 shouldBeTrue("(new inner." + constructorName + argumentsString + ").construc
tor.isInner"); | 73 shouldBeTrue("(new inner." + constructorName + argumentsString + ").construc
tor.isInner"); |
73 } | 74 } |
74 | 75 |
75 document.body.removeChild(subframe); | 76 document.body.removeChild(subframe); |
OLD | NEW |