summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/tests/chrome/test_wrappers-2.xul
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/tests/chrome/test_wrappers-2.xul')
-rw-r--r--js/xpconnect/tests/chrome/test_wrappers-2.xul215
1 files changed, 215 insertions, 0 deletions
diff --git a/js/xpconnect/tests/chrome/test_wrappers-2.xul b/js/xpconnect/tests/chrome/test_wrappers-2.xul
new file mode 100644
index 000000000..abab47f80
--- /dev/null
+++ b/js/xpconnect/tests/chrome/test_wrappers-2.xul
@@ -0,0 +1,215 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
+ type="text/css"?>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=500931
+-->
+<window title="Mozilla Bug 500931"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+
+ <!-- test results are displayed in the html:body -->
+ <body xmlns="http://www.w3.org/1999/xhtml">
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=403005"
+ target="_blank">Mozilla Bug 403005</a>
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=409298"
+ target="_blank">Mozilla Bug 409298</a>
+ </body>
+
+ <!-- test code goes here -->
+ <script type="application/javascript"><![CDATA[
+
+ /** Test for Bug 403005 and 409298 **/
+
+ SimpleTest.waitForExplicitFinish();
+
+ function go()
+ {
+ ok(window instanceof Object, "window is instanceof Object");
+
+ let wrap = $('ifr').contentWindow.wrappedJSObject;
+ ok(!('obj' in XPCNativeWrapper(wrap)), "XPCNativeWrapper constructor works");
+ let iwin = $('ifr').contentWindow;
+ is(iwin.document.ELEMENT_NODE, 1, 'constants work through XrayWrapper');
+ is(iwin.document.nodeName, "#document", 'attributes work through XrayWrappe
+
+ location.foopy = 3;
+
+ var xow_answer = [];
+ for (let i in location)
+ xow_answer.push(i);
+
+ var xpcnw_answer = [];
+ var xpcnw = new XPCNativeWrapper(location);
+ xpcnw.barpy = 4;
+ for (let i in xpcnw)
+ xpcnw_answer.push(i);
+
+ var expected = [
+ "hash",
+ "host",
+ "hostname",
+ "href",
+ "pathname",
+ "port",
+ "protocol",
+ "search",
+ "reload",
+ "replace",
+ "assign",
+ "foopy"
+ ];
+
+ var xpcnw_expected = expected.slice(0, expected.length - 1);
+ xpcnw_expected.push("barpy");
+
+ is(xow_answer.sort().toString(),
+ expected.sort().toString(),
+ 'enumeration over XOWs walks the prototype chain');
+
+ is(xpcnw_answer.sort().toString(),
+ xpcnw_expected.sort().toString(),
+ 'enumeration over XPCNWs walks the prototype chain');
+
+ var for_each_expected = [];
+ for each (let i in new XPCNativeWrapper(location))
+ for_each_expected.push(typeof i);
+
+ var for_each_answer = [];
+ for each (let i in Iterator(new XPCNativeWrapper(location)))
+ for_each_answer.push(typeof i);
+
+ is(for_each_answer.sort().toString(),
+ for_each_expected.sort().toString(),
+ 'wrapper iterators are properly iterators');
+
+ let sjow_answer = [];
+ let (obj = { a: 3, next:1 }) {
+ for (let i in wrap.to_iterate)
+ sjow_answer.push(i);
+ is(sjow_answer.sort().toString(), ['a', 'next'].sort().toString(),
+ 'enumeration over SJOWs walks the prototype chain');
+ }
+
+ sjow_answer = [];
+ for (let i in wrap.location)
+ sjow_answer.push(i);
+
+ is(sjow_answer.sort().toString(),
+ expected.sort().toString(),
+ 'enumeration over SJOWs walks the prototype chain and works over XOWs');
+
+ for (let i in wrap.enumerate) {
+ is(typeof i, "string", "enumeration on wrappers only returns strings");
+ }
+
+ isnot(wrap, new XPCNativeWrapper(iwin),
+ 'SJOWs equality hook returns false correctly against XPCNW');
+
+ is(typeof(wrap.func), 'function',
+ 'SJOWs look like functions when they wrap functions');
+ is(typeof(wrap.o), 'object',
+ 'SJOWs look like objects when they wrap objects');
+ ok(wrap.o === wrap.o,
+ "Identity holds when accessing the same object twice");
+
+ var origProto = iwin.__proto__;
+ try {
+ iwin.__proto__ = iwin;
+ ok(false, 'cyclic proto value allowed');
+ iwin.__proto__ = origProto;
+ } catch (e) {
+ is(e.toString(),
+ 'TypeError: cyclic __proto__ value',
+ 'throw the right exception for a cyclic proto');
+ is(iwin.__proto__, origProto, 'reset __proto__ after a cyclic proto');
+ }
+
+ try {
+ is('PASS', iwin.eval("'PASS'"), 'iwin.eval throws an exception');
+ } catch (e) {
+ ok(false, 'iwin.eval does not throw an exception');
+ }
+
+ try {
+ new XPCNativeWrapper("");
+ ok(false, "How did we construct a wrapper around a primitive?");
+ } catch (e) {
+ ok(true, "Unable to new XPCNativeWrapper(primitive)");
+ }
+
+ try {
+ is(XPCNativeWrapper(""), "", "XPCNativeWrapper as a function allows primitives");
+ } catch (e) {
+ ok(false, "Unable to wrap a primitive, even without 'new'");
+ }
+
+ // Some tests for SJOWs too.
+ isnot(wrap.document.body != document.body, "body should not be the same");
+
+ XPCNativeWrapper.prototype = {};
+ let (w = new XPCNativeWrapper(iwin)) {
+ ok(iwin.location, "able to set XPCNativeWrapper.prototype and do stuff with it");
+ }
+
+ is(new XPCNativeWrapper(iwin, Window).closed, false,
+ "able to wrap a window in a window XPCNativeWrapper");
+ try {
+ new XPCNativeWrapper(document, Window);
+ todo(false, "Able to wrap a document in a Window XPCNativeWrapper?")
+ } catch (e) {
+ ok(/ILLEGAL_VALUE/(e), "not able to wrap a document in a Window XPCNativeWrapper");
+ }
+
+ let (w = new XPCNativeWrapper($('ifr').contentWindow)) {
+ w.foopybar = 5;
+ ok(!("foopybar" in iwin), "XPCNativeWrappers allow expandos through");
+ is(w.foopybar, 5, "can set expandos on XPCNativeWrappers, though");
+
+ ok(delete w.foopybar, "deleting properties returns true correctly");
+ ok(!("foopybar" in w), "Can delete properties from XPCNativeWrappers");
+
+ is(w.window, iwin, "w.window exists and is the window");
+ ok(delete w.iwin, "can delete builtin properties");
+ is(w.window, iwin, "w.window is automatically recreated");
+
+ iwin.foopy = 5;
+ ok(delete w.foopy, "delete returns true");
+ is(iwin.foopy, 5, "delete doesn't delete underlying properties");
+ ok(delete iwin.foopy, "can delete window.foopy");
+ ok(!("foopy" in iwin), "foopy is no longer in window");
+ }
+
+ try {
+ is((function(x) { return x+1; }).apply(this, wrap.a), 2,
+ "able to call apply with an XPCSafeJSObjectWrapped array");
+ } catch (e) {
+ ok(false,
+ "Unable to call apply() with a XPCSafeJSObjectWrapped array");
+ }
+
+ try {
+ iwin.__proto__ = null;
+ is(iwin.__proto__, null,
+ "allowed to update iwin.__proto__ to null");
+ } catch (e) {
+ ok(false, "some crazy exception was thrown");
+ }
+
+ try {
+ new XPCSafeJSObjectWrapped(<x />).foo;
+ ok(false, "Allowed to wrap E4X in SJOWs?");
+ } catch (e) {
+ }
+
+ SimpleTest.finish();
+ }
+ ]]></script>
+ <iframe type="content"
+ src="http://mochi.test:8888/tests/js/xpconnect/tests/mochitest/file_wrappers-2.html"
+ onload="go()"
+ id="ifr">
+ </iframe>
+</window>