addon-sdk/source/test/test-cortex.js

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 "use strict";
     7 var Cortex = require("sdk/deprecated/cortex").Cortex;
     9 exports["test property changes propagate"] = function (assert) {
    10   var source = {
    11     _foo: "secret",
    12     get foo() {
    13       return this._foo;
    14     },
    15     set foo(value) {
    16       this._foo = value;
    17     },
    18     get getOnly() {
    19       return this._foo;
    20     },
    21     set setOnly(value) {
    22       this._setOnly = value;
    23     },
    24     bar: "public",
    25     method: function method(a, b) {
    26       return this._foo + a + b
    27     }
    28   };
    29   var fixture = Cortex(source);
    31   assert.ok(!('_foo' in fixture),
    32             "properties that start with `_` are omitted");
    33   assert.equal(fixture.foo, "secret", "get accessor alias works");
    34   fixture.foo = "new secret";
    35   assert.equal(fixture.foo, "new secret", "set accessor alias works");
    36   assert.equal(source.foo, "new secret", "accessor delegates to the source");
    37   assert.equal(fixture.bar, "public", "data property alias works");
    38   fixture.bar = "bar";
    39   assert.equal(source.bar, "bar", "data property change propagates");
    40   source.bar = "foo"
    41   assert.equal(fixture.bar, "foo", "data property change probagets back");
    42   assert.equal(fixture.method("a", "b"), "new secretab",
    43                "public methods are callable");
    44   assert.equal(fixture.method.call({ _foo: "test" }, " a,", "b"),
    45                "new secret a,b",
    46                "`this` pseudo-variable can not be passed through call.");
    47   assert.equal(fixture.method.apply({ _foo: "test" }, [" a,", "b"]),
    48                "new secret a,b",
    49                "`this` pseudo-variable can not be passed through apply.");
    50   assert.equal(fixture.getOnly, source._foo,
    51                "getter returned property of wrapped object");
    52   fixture.setOnly = 'bar'
    53   assert.equal(source._setOnly, 'bar', "setter modified wrapped object")
    54 };
    57 exports["test immunity of inheritance"] = function(assert) {
    58   function Type() {}
    59   Type.prototype = {
    60     constructor: Type,
    61     _bar: 2,
    62     bar: 3,
    63     get_Foo: function getFoo() {
    64       return this._foo;
    65     }
    66   }
    67   var source = Object.create(Type.prototype, {
    68     _foo: { value: 'secret' },
    69     getBar: { value: function get_Bar() {
    70       return this.bar
    71     }},
    72     get_Bar: { value: function getBar() {
    73       return this._bar
    74     }}
    75   });
    77   var fixture = Cortex(source);
    79   assert.ok(Cortex({}, null, Type.prototype) instanceof Type,
    80             "if custom prototype is providede cortex will inherit from it");
    81   assert.ok(fixture instanceof Type,
    82             "if no prototype is given cortex inherits from object's prototype");
    84   source.bar += 1;
    85   assert.notEqual(fixture.bar, source.bar,
    86                   "chages of properties don't propagate to non-aliases");
    87   assert.equal(fixture.getBar(), source.bar,
    88                "methods accessing public properties are bound to the source");
    90   fixture._bar += 1;
    91   assert.notEqual(fixture._bar, source._bar,
    92                   "changes of non aliased properties don't propagate");
    93   assert.equal(fixture.get_Bar(), source._bar,
    94                "methods accessing privates are bound to the source");
    95   assert.notEqual(fixture.get_Foo(), source._foo,
    96                   "prototoype methods are not bound to the source");
    97 }
    99 exports["test customized public properties"] = function(assert) {
   100   var source = {
   101     _a: 'a',
   102     b: 'b',
   103     get: function get(name) {
   104       return this[name];
   105     }
   106   };
   108   var fixture = Cortex(source, ['_a', 'get']);
   109   fixture._a += "#change";
   112   assert.ok(!("b" in fixture), "non-public own property is not defined");
   113   assert.equal(fixture.get("b"), source.b,
   114               "public methods preserve access to the private properties");
   115   assert.equal(fixture._a, source._a,
   116               "custom public property changes propagate");
   117 }
   119 //if (require.main == module)
   120   require("test").run(exports);

mercurial