tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_bug1036214.html (7726B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--
      4 https://bugzilla.mozilla.org/show_bug.cgi?id=1036214
      5 -->
      6 <head>
      7  <meta charset="utf-8">
      8  <title>Test for Bug 1036214</title>
      9  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     10  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     11  <script type="application/javascript">
     12  /* global TestInterfaceJS */
     13 
     14  /** Test for subsumes-checking |any| and |object| for js-implemented WebIDL. */
     15  SimpleTest.waitForExplicitFinish();
     16  var xoObjects = [];
     17  function setup() {
     18    // window[0] is same-process and cross-origin, even with Fission enabled.
     19    xoObjects.push(window[0]);
     20    xoObjects.push(window[0].location);
     21    xoObjects.push(SpecialPowers.unwrap(SpecialPowers.wrap(window[0]).document));
     22    xoObjects.push(SpecialPowers.unwrap(SpecialPowers));
     23    xoObjects.push(SpecialPowers.unwrap(SpecialPowers.wrap));
     24    SpecialPowers.pushPrefEnv({set: [["dom.expose_test_interfaces", true]]}, go);
     25  }
     26 
     27  function setup2() {
     28    if (SpecialPowers.useRemoteSubframes) {
     29      // window[1] is cross-origin and out of process, with Fission enabled.
     30      xoObjects.push(window[1]);
     31      xoObjects.push(window[1].location);
     32    }
     33  }
     34 
     35  function checkThrows(f, msg) {
     36    try {
     37      f();
     38      ok(false, "Should have thrown: " + msg);
     39    } catch (e) {
     40      ok(true, "Threw correctly: " + msg);
     41      ok(/denied|insecure/.test(e), "Threw security exception: " + e);
     42    }
     43  }
     44 
     45  function go() {
     46    //
     47    // Test the basics of the test interface.
     48    //
     49 
     50    var any = { a: 11 };
     51    var obj = { b: 22, c: "str" };
     52    var obj2 = { foo: "baz" };
     53    var myDict = { anyMember: 42, objectMember: { answer: 42 }, objectOrStringMember: { answer: "anobject" },
     54                   anySequenceMember: [{}, 1, "thirdinsequence"],
     55                   objectRecordMember: { key: { answer: "fortytwo" } },
     56                   innerDictionary: { innerObject: { answer: "rabbithole" } } };
     57    var t = new TestInterfaceJS(any, obj, myDict);
     58    is(Object.getPrototypeOf(t), TestInterfaceJS.prototype, "Prototype setup works correctly");
     59    is(t.anyArg, any, "anyArg is correct");
     60    is(t.objectArg, obj, "objectArg is correct");
     61    is(t.getDictionaryArg().anyMember, 42, "dictionaryArg looks correct");
     62    is(t.getDictionaryArg().objectMember.answer, 42, "dictionaryArg looks correct");
     63    is(t.getDictionaryArg().objectRecordMember.key.answer, "fortytwo", "dictionaryArg looks correct");
     64    is(t.getDictionaryArg().objectRecordMember.key.answer, "fortytwo", "dictionaryArg looks correct");
     65    t.anyAttr = 2;
     66    is(t.anyAttr, 2, "ping-pong any attribute works");
     67    t.objAttr = obj2;
     68    is(t.objAttr, obj2, "ping-pong object attribute works");
     69    t.setDictionaryAttr(myDict);
     70    is(t.getDictionaryAttr().anyMember, 42, "ping-pong dictionary works");
     71    is(t.getDictionaryAttr().objectMember.answer, 42, "ping-pong dictionary works");
     72    is(t.getDictionaryAttr().objectRecordMember.key.answer, "fortytwo", "ping-pong dictionary works");
     73    is(t.getDictionaryAttr().objectRecordMember.key.answer, "fortytwo", "ping-pong dictionary works");
     74 
     75    is(any, t.pingPongAny(any), "ping-pong works with any");
     76    is(obj, t.pingPongObject(obj), "ping-pong works with obj");
     77    is(obj, t.pingPongObjectOrString(obj), "ping-pong works with obj or string");
     78    is("foo", t.pingPongObjectOrString("foo"), "ping-pong works with obj or string");
     79    is(t.pingPongDictionary(myDict).anyMember, 42, "ping pong works with dict");
     80    is(t.pingPongDictionary(myDict).objectMember.answer, 42, "ping pong works with dict");
     81    is(t.pingPongDictionary(myDict).objectOrStringMember.answer, "anobject", "ping pong works with dict");
     82    is(t.pingPongDictionary(myDict).anySequenceMember[2], "thirdinsequence", "ping pong works with dict");
     83    is(t.pingPongDictionary(myDict).objectRecordMember.key.answer, "fortytwo", "ping pong works with dict");
     84    is(t.pingPongDictionary(myDict).objectRecordMember.key.answer, "fortytwo", "ping pong works with dict");
     85    is(t.pingPongDictionary(myDict).innerDictionary.innerObject.answer, "rabbithole", "ping pong works with layered dicts");
     86    is(t.pingPongDictionaryOrLong({anyMember: 42}), 42, "ping pong (dict or long) works with dict");
     87    is(t.pingPongDictionaryOrLong(42), 42, "ping pong (dict or long) works with long");
     88    ok(/canary/.test(t.pingPongRecord({ someVal: 42, someOtherVal: "canary" })), "ping pong works with record");
     89    is(t.objectSequenceLength([{}, {}, {}]), 3, "ping pong works with object sequence");
     90    is(t.anySequenceLength([42, "string", {}, undefined]), 4, "ping pong works with any sequence");
     91 
     92    //
     93    // Test that we throw in the cross-origin cases.
     94    //
     95 
     96    xoObjects.forEach(function(xoObj) {
     97      new TestInterfaceJS();
     98      checkThrows(() => new TestInterfaceJS(xoObj, undefined), "any param for constructor");
     99      checkThrows(() => new TestInterfaceJS(undefined, xoObj), "obj param for constructor");
    100      checkThrows(() => new TestInterfaceJS(undefined, undefined, { anyMember: xoObj }), "any dict param for constructor");
    101      checkThrows(() => new TestInterfaceJS(undefined, undefined, { objectMember: xoObj }), "object dict param for constructor");
    102      checkThrows(() => new TestInterfaceJS(undefined, undefined, { objectOrStringMember: xoObj }), "union dict param for constructor");
    103      checkThrows(() => new TestInterfaceJS(undefined, undefined, { anySequenceMember: [0, xoObj, "hi" ] }), "sequence dict param for constructor");
    104      checkThrows(() => new TestInterfaceJS(undefined, undefined, { innerDictionary: { innerObject: xoObj } }), "inner dict param for constructor");
    105      checkThrows(() => t.anyAttr = xoObj, "anyAttr");
    106      checkThrows(() => t.objectAttr = xoObj, "objAttr");
    107      checkThrows(() => t.setDictionaryAttr({ anyMember: xoObj }), "dictionaryAttr any");
    108      checkThrows(() => t.setDictionaryAttr({ objectMember: xoObj }), "dictionaryAttr object");
    109      checkThrows(() => t.pingPongAny(xoObj), "pingpong any");
    110      checkThrows(() => t.pingPongObject(xoObj), "pingpong obj");
    111      checkThrows(() => t.pingPongObjectOrString(xoObj), "pingpong union");
    112      checkThrows(() => t.pingPongDictionary({ anyMember: xoObj }), "dictionary pingpong any");
    113      checkThrows(() => t.pingPongDictionary({ objectMember: xoObj }), "dictionary pingpong object");
    114      checkThrows(() => t.pingPongDictionary({ anyMember: xoObj, objectMember: xoObj }), "dictionary pingpong both");
    115      checkThrows(() => t.pingPongDictionary({ objectOrStringMember: xoObj }), "dictionary pingpong objectorstring");
    116      checkThrows(() => t.pingPongDictionary({ objectRecordMember: { key: xoObj } }), "dictionary pingpong record of object");
    117      checkThrows(() => t.pingPongDictionaryOrLong({ objectMember: xoObj }), "unionable dictionary");
    118      checkThrows(() => t.pingPongDictionaryOrLong({ anyMember: xoObj }), "unionable dictionary");
    119      checkThrows(() => t.pingPongRecord({ someMember: 42, someOtherMember: {}, crossOriginMember: xoObj }), "record");
    120      checkThrows(() => t.objectSequenceLength([{}, {}, xoObj, {}]), "object sequence");
    121      checkThrows(() => t.anySequenceLength([42, "someString", xoObj, {}]), "any sequence");
    122    });
    123 
    124 
    125    SimpleTest.finish();
    126  }
    127 
    128  </script>
    129 </head>
    130 <body>
    131 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1036214">Mozilla Bug 1036214</a>
    132 <p id="display"></p>
    133 <div id="content" style="display: none">
    134 
    135 </div>
    136 <pre id="test">
    137 </pre>
    138 <iframe id="ifr" onload="setup();" src="http://test1.mochi.test:8888/tests/js/xpconnect/tests/mochitest/file_empty.html"></iframe>
    139 <iframe id="ifr2" onload="setup2();" src="http://example.org/tests/js/xpconnect/tests/mochitest/file_empty.html"></iframe>
    140 </body>
    141 </html>