tor-browser

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

superSetPropThrow.js (1982B)


      1 var g_foo = "foo";
      2 var g_bar = "bar";
      3 
      4 // Define base class with a read-only and a writable data property
      5 class Base
      6 {
      7 }
      8 Object.defineProperty(Base.prototype, "foo", { value: "Base", writable: true });
      9 Object.defineProperty(Base.prototype, "bar", { value: "Base", writable: false });
     10 
     11 // Test various cases that should throw during SETPROP_SUPER
     12 class Derived extends Base
     13 {
     14    // ECMA-2018 9.1.9.1, step 4.a
     15    testReadonly() {
     16        super.bar = "Derived";
     17    }
     18    testReadonlyElem() {
     19        super[g_bar] = "Derived";
     20    }
     21 
     22    // ECMA-2018 9.1.9.1, step 4.b
     23    testPrimitiveReceiver() {
     24        super.foo = "Derived";
     25    }
     26    testPrimitiveReceiverElem() {
     27        super[g_foo] = "Derived";
     28    }
     29 
     30    // ECMA-2018 9.1.9.1, step 4.d.i
     31    testAccessorShadow() {
     32        Object.defineProperty(this, "foo", { get: function() { } });
     33        super.foo = "Derived";
     34    }
     35    testAccessorShadowElem() {
     36        Object.defineProperty(this, "foo", { get: function() { } });
     37        super[g_foo] = "Derived";
     38    }
     39 
     40    // ECMA-2018 9.1.9.1, step 4.d.ii
     41    testReadonlyShadow() {
     42        Object.defineProperty(this, "foo", { writable: false });
     43        super.foo = "Derived";
     44    }
     45    testReadonlyShadowElem() {
     46        Object.defineProperty(this, "foo", { writable: false });
     47        super[g_foo] = "Derived";
     48    }
     49 }
     50 
     51 for (let i = 0; i < 10; ++i) {
     52    var cnt = 0;
     53 
     54    try { new Derived().testReadonly(); } catch(e) { cnt++; }
     55    try { new Derived().testReadonlyElem(); } catch(e) { cnt++; }
     56    try { Derived.prototype.testPrimitiveReceiver.call(null); } catch(e) { cnt++; }
     57    try { Derived.prototype.testPrimitiveReceiverElem.call(null); } catch(e) { cnt++; }
     58    try { new Derived().testAccessorShadow(); } catch(e) { cnt++; }
     59    try { new Derived().testAccessorShadowElem(); } catch(e) { cnt++; }
     60    try { new Derived().testReadonlyShadow(); } catch(e) { cnt++; }
     61    try { new Derived().testReadonlyShadowElem(); } catch(e) { cnt++; }
     62 
     63    assertEq(cnt, 8);
     64 }