Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
michael@0 | 1 | // Basic tests for obj.{seal,freeze,preventExtensions,isSealed,isFrozen,isExtensible}. |
michael@0 | 2 | |
michael@0 | 3 | var g = newGlobal(); |
michael@0 | 4 | var dbg = new Debugger; |
michael@0 | 5 | var gw = dbg.addDebuggee(g); |
michael@0 | 6 | |
michael@0 | 7 | g.eval("function compareObjects() {\n" + |
michael@0 | 8 | " assertEq(Object.isExtensible(x), Object.isExtensible(y));\n" + |
michael@0 | 9 | " var xnames = Object.getOwnPropertyNames(x).sort();\n" + |
michael@0 | 10 | " var ynames = Object.getOwnPropertyNames(y).sort();\n" + |
michael@0 | 11 | " assertEq(xnames.length, ynames.length);\n" + |
michael@0 | 12 | " for (var i = 0; i < xnames.length; i++) {\n" + |
michael@0 | 13 | " assertEq(xnames[i], ynames[i]);\n" + |
michael@0 | 14 | " var name = xnames[i];\n" + |
michael@0 | 15 | " var xd = Object.getOwnPropertyDescriptor(x, name);\n" + |
michael@0 | 16 | " var yd = Object.getOwnPropertyDescriptor(y, name);\n" + |
michael@0 | 17 | " assertEq(xd.configurable, yd.configurable, code + '.' + name + ' .configurable');\n" + |
michael@0 | 18 | " assertEq(xd.enumerable, yd.enumerable, code + '.' + name + ' .enumerable');\n" + |
michael@0 | 19 | " assertEq(xd.writable, yd.writable, code + '.' + name + ' .writable');\n" + |
michael@0 | 20 | " }\n" + |
michael@0 | 21 | "}\n"); |
michael@0 | 22 | |
michael@0 | 23 | function test(code) { |
michael@0 | 24 | g.code = code; |
michael@0 | 25 | g.eval("x = (" + code + ");"); |
michael@0 | 26 | g.eval("y = (" + code + ");"); |
michael@0 | 27 | var xw = gw.getOwnPropertyDescriptor("x").value; |
michael@0 | 28 | |
michael@0 | 29 | function check() { |
michael@0 | 30 | // The Debugger.Object seal/freeze/preventExtensions methods |
michael@0 | 31 | // had the same effect as the corresponding ES5 Object methods. |
michael@0 | 32 | g.compareObjects(); |
michael@0 | 33 | |
michael@0 | 34 | // The Debugger.Object introspection methods agree with the ES5 Object methods. |
michael@0 | 35 | assertEq(xw.isExtensible(), g.Object.isExtensible(g.x), code + ' isExtensible'); |
michael@0 | 36 | assertEq(xw.isSealed(), g.Object.isSealed(g.x), code + ' isSealed'); |
michael@0 | 37 | assertEq(xw.isFrozen(), g.Object.isFrozen(g.x), code + ' isFrozen'); |
michael@0 | 38 | } |
michael@0 | 39 | |
michael@0 | 40 | check(); |
michael@0 | 41 | |
michael@0 | 42 | xw.preventExtensions(); |
michael@0 | 43 | assertEq(g.Object.isExtensible(g.x), false, code + ' preventExtensions'); |
michael@0 | 44 | g.Object.preventExtensions(g.y); |
michael@0 | 45 | check(); |
michael@0 | 46 | |
michael@0 | 47 | xw.seal(); |
michael@0 | 48 | assertEq(g.Object.isSealed(g.x), true, code + ' seal'); |
michael@0 | 49 | g.Object.seal(g.y); |
michael@0 | 50 | check(); |
michael@0 | 51 | |
michael@0 | 52 | xw.freeze(); |
michael@0 | 53 | assertEq(g.Object.isFrozen(g.x), true, code + ' freeze'); |
michael@0 | 54 | g.Object.freeze(g.y); |
michael@0 | 55 | check(); |
michael@0 | 56 | } |
michael@0 | 57 | |
michael@0 | 58 | test("{}"); |
michael@0 | 59 | test("{a: [1], get b() { return -1; }}"); |
michael@0 | 60 | test("Object.create(null, {x: {value: 3}, y: {get: Math.min}})"); |
michael@0 | 61 | test("[]"); |
michael@0 | 62 | test("[,,,,,]"); |
michael@0 | 63 | test("[0, 1, 2]"); |