|
1 function run_test() { |
|
2 var Cu = Components.utils; |
|
3 var epsb = new Cu.Sandbox(["http://example.com", "http://example.org"], { wantExportHelpers: true }); |
|
4 var subsb = new Cu.Sandbox("http://example.com", { wantGlobalProperties: ["XMLHttpRequest"] }); |
|
5 var subsb2 = new Cu.Sandbox("http://example.com", { wantGlobalProperties: ["XMLHttpRequest"] }); |
|
6 var xorigsb = new Cu.Sandbox("http://test.com"); |
|
7 |
|
8 epsb.subsb = subsb; |
|
9 epsb.xorigsb = xorigsb; |
|
10 epsb.do_check_true = do_check_true; |
|
11 epsb.do_check_eq = do_check_eq; |
|
12 epsb.do_check_neq = do_check_neq; |
|
13 |
|
14 // Exporting should work if prinicipal of the source sandbox |
|
15 // subsumes the principal of the target sandbox. |
|
16 Cu.evalInSandbox("(" + function() { |
|
17 Object.prototype.protoProp = "common"; |
|
18 var wasCalled = false; |
|
19 var _this = this; |
|
20 this.funToExport = function(a, obj, native, mixed) { |
|
21 do_check_eq(a, 42); |
|
22 do_check_neq(obj, subsb.tobecloned); |
|
23 do_check_eq(obj.cloned, "cloned"); |
|
24 do_check_eq(obj.protoProp, "common"); |
|
25 do_check_eq(native, subsb.native); |
|
26 do_check_eq(_this, this); |
|
27 do_check_eq(mixed.xrayed, subsb.xrayed); |
|
28 do_check_eq(mixed.xrayed2, subsb.xrayed2); |
|
29 wasCalled = true; |
|
30 }; |
|
31 this.checkIfCalled = function() { |
|
32 do_check_true(wasCalled); |
|
33 wasCalled = false; |
|
34 } |
|
35 exportFunction(funToExport, subsb, { defineAs: "imported" }); |
|
36 }.toSource() + ")()", epsb); |
|
37 |
|
38 subsb.xrayed = Cu.evalInSandbox("(" + function () { |
|
39 return new XMLHttpRequest(); |
|
40 }.toSource() + ")()", subsb2); |
|
41 |
|
42 // Exported function should be able to be call from the |
|
43 // target sandbox. Native arguments should be just wrapped |
|
44 // every other argument should be cloned. |
|
45 Cu.evalInSandbox("(" + function () { |
|
46 native = new XMLHttpRequest(); |
|
47 xrayed2 = XPCNativeWrapper(new XMLHttpRequest()); |
|
48 mixed = { xrayed: xrayed, xrayed2: xrayed2 }; |
|
49 tobecloned = { cloned: "cloned" }; |
|
50 imported(42,tobecloned, native, mixed); |
|
51 }.toSource() + ")()", subsb); |
|
52 |
|
53 // Apply should work but the |this| argument should not be |
|
54 // possible to be changed. |
|
55 Cu.evalInSandbox("(" + function() { |
|
56 imported.apply("something", [42, tobecloned, native, mixed]); |
|
57 }.toSource() + ")()", subsb); |
|
58 |
|
59 Cu.evalInSandbox("(" + function() { |
|
60 checkIfCalled(); |
|
61 }.toSource() + ")()", epsb); |
|
62 |
|
63 // Exporting should throw if princpal of the source sandbox does |
|
64 // not subsume the principal of the target. |
|
65 Cu.evalInSandbox("(" + function() { |
|
66 try{ |
|
67 exportFunction(function() {}, this.xorigsb, { defineAs: "denied" }); |
|
68 do_check_true(false); |
|
69 } catch (e) { |
|
70 do_check_true(e.toString().indexOf('Permission denied') > -1); |
|
71 } |
|
72 }.toSource() + ")()", epsb); |
|
73 |
|
74 // Let's create an object in the target scope and add privileged |
|
75 // function to it as a property. |
|
76 Cu.evalInSandbox("(" + function() { |
|
77 var newContentObject = createObjectIn(subsb, { defineAs: "importedObject" }); |
|
78 exportFunction(funToExport, newContentObject, { defineAs: "privMethod" }); |
|
79 }.toSource() + ")()", epsb); |
|
80 |
|
81 Cu.evalInSandbox("(" + function () { |
|
82 importedObject.privMethod(42, tobecloned, native, mixed); |
|
83 }.toSource() + ")()", subsb); |
|
84 |
|
85 Cu.evalInSandbox("(" + function() { |
|
86 checkIfCalled(); |
|
87 }.toSource() + ")()", epsb); |
|
88 |
|
89 // exportFunction and createObjectIn should be available from Cu too. |
|
90 var newContentObject = Cu.createObjectIn(subsb, { defineAs: "importedObject2" }); |
|
91 var wasCalled = false; |
|
92 Cu.exportFunction(function(arg) { wasCalled = arg.wasCalled; }, |
|
93 newContentObject, { defineAs: "privMethod" }); |
|
94 |
|
95 Cu.evalInSandbox("(" + function () { |
|
96 importedObject2.privMethod({wasCalled: true}); |
|
97 }.toSource() + ")()", subsb); |
|
98 |
|
99 // 3rd argument of exportFunction should be optional. |
|
100 Cu.evalInSandbox("(" + function() { |
|
101 subsb.imported2 = exportFunction(funToExport, subsb); |
|
102 }.toSource() + ")()", epsb); |
|
103 |
|
104 Cu.evalInSandbox("(" + function () { |
|
105 imported2(42, tobecloned, native, mixed); |
|
106 }.toSource() + ")()", subsb); |
|
107 |
|
108 Cu.evalInSandbox("(" + function() { |
|
109 checkIfCalled(); |
|
110 }.toSource() + ")()", epsb); |
|
111 |
|
112 do_check_true(wasCalled, true); |
|
113 } |