Bug 804630 - Tests for exposing prototype properties on a derived object. r=mrbkap
authorBobby Holley <bobbyholley@gmail.com>
Tue, 30 Oct 2012 18:29:11 +0100
changeset 111807 9a2165ff980314f34ed60f41401e2c4b612d88fc
parent 111806 d718d87d4bb542aede8a10040f5d71e69f65d772
child 111808 df94ebb4b929618642e05e7d5d7bf7c2016670a6
push id17266
push userbobbyholley@gmail.com
push dateTue, 30 Oct 2012 20:16:04 +0000
treeherdermozilla-inbound@9a2165ff9803 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmrbkap
bugs804630
milestone19.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 804630 - Tests for exposing prototype properties on a derived object. r=mrbkap
js/xpconnect/tests/chrome/Makefile.in
js/xpconnect/tests/chrome/test_exposeInDerived.xul
--- a/js/xpconnect/tests/chrome/Makefile.in
+++ b/js/xpconnect/tests/chrome/Makefile.in
@@ -53,16 +53,17 @@ MOCHITEST_CHROME_FILES = \
 		test_cows.xul \
 		test_documentdomain.xul \
 		test_doublewrappedcompartments.xul \
 		test_evalInSandbox.xul \
 		file_evalInSandbox.html \
 		test_exnstack.xul \
 		test_expandosharing.xul \
 		file_expandosharing.jsm \
+		test_exposeInDerived.xul \
 		test_getweakmapkeys.xul \
 		test_mozMatchesSelector.xul \
 		test_nodelists.xul \
 		test_precisegc.xul \
 		test_sandboxImport.xul \
 		test_weakmaps.xul \
 		test_weakmap_keys_preserved.xul \
 		test_weakmap_keys_preserved2.xul \
new file mode 100644
--- /dev/null
+++ b/js/xpconnect/tests/chrome/test_exposeInDerived.xul
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
+<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=804630
+-->
+<window title="Mozilla Bug 804630"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+
+  <!-- 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=804630"
+     target="_blank">Mozilla Bug 804630</a>
+  </body>
+
+  <!-- test code goes here -->
+  <script type="application/javascript">
+  <![CDATA[
+  /** Test to make sure that COWed objects can expose properties from their prototypes. **/
+  const Cu = Components.utils;
+
+  // Set up the sandbox.
+  var sb = new Cu.Sandbox('http://www.example.com');
+  sb.ok = ok;
+  sb.is = is;
+
+  // Make a chrome object that exposes objects off its prototype.
+  sb.proto = { read: 42, readWrite: 32, __exposedProps__: {} };
+  sb.proto.__defineSetter__('setterProp', function(val) { this._setterProp = val; });
+  sb.obj = { __exposedProps__: { read: 'r', readWrite: 'rw', setterProp: 'w' } };
+  sb.obj.__proto__ = sb.proto;
+
+  // Make sure we can't access any of the properties on the prototype directly.
+  Cu.evalInSandbox('is(proto.read, undefined, "proto.read inaccessible");', sb);
+  Cu.evalInSandbox('var wrote = false; ' +
+                   'try { proto.readWrite = 12; wrote = true; } catch(e) {} ' +
+                   ' ok(!wrote, "Should not write proto property");', sb);
+  Cu.evalInSandbox('var wrote = false; ' +
+                   'try { proto.setterProp = 12; wrote = true; } catch(e) {} ' +
+                   ' ok(!wrote, "Should not write proto setter");', sb);
+
+  // Make sure we can access the exposed properties via the derived object.
+  Cu.evalInSandbox('is(obj.read, 42, "obj.read accessible");', sb);
+  Cu.evalInSandbox('is(obj.readWrite, 32, "obj.readWrite is readable");', sb);
+  Cu.evalInSandbox('obj.readWrite = 8; is(obj.readWrite, 8, "obj.readWrite is writable");', sb);
+  Cu.evalInSandbox('obj.setterProp = 3;', sb);
+  is(sb.obj._setterProp, 3, "obj.setterProp works");
+
+  ]]>
+  </script>
+</window>