addon-sdk/source/test/test-tab-events.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 const { Loader } = require("sdk/test/loader");
     8 const utils = require("sdk/tabs/utils");
     9 const { open, close } = require("sdk/window/helpers");
    10 const { getMostRecentBrowserWindow } = require("sdk/window/utils");
    11 const { events } = require("sdk/tab/events");
    12 const { on, off } = require("sdk/event/core");
    13 const { resolve, defer } = require("sdk/core/promise");
    15 let isFennec = require("sdk/system/xul-app").is("Fennec");
    17 function test(options) {
    18   return function(assert, done) {
    19     let tabEvents = [];
    20     let tabs = [];
    21     let { promise, resolve: resolveP } = defer();
    22     let win = isFennec ? resolve(getMostRecentBrowserWindow()) :
    23       open(null, {
    24         features: { private: true, toolbar:true, chrome: true }
    25       });
    26     let window = null;
    28     // Firefox events are fired sync; Fennec events async
    29     // this normalizes the tests
    30     function handler (event) {
    31       tabEvents.push(event);
    32       runIfReady();
    33     }
    35     function runIfReady () {
    36       let releventEvents = getRelatedEvents(tabEvents, tabs);
    37       if (options.readyWhen(releventEvents))
    38         options.end({
    39           tabs: tabs,
    40           events: releventEvents,
    41           assert: assert,
    42           done: resolveP
    43         });
    44     }
    46     win.then(function(w) {
    47       window = w;
    48       on(events, "data", handler);
    49       options.start({ tabs: tabs, window: window });
    51       // Execute here for synchronous FF events, as the handlers
    52       // were called before tabs were pushed to `tabs`
    53       runIfReady(); 
    54       return promise;
    55     }).then(function() {
    56       off(events, "data", handler);
    57       return isFennec ? null : close(window);
    58     }).then(done, assert.fail);
    59   };
    60 }
    62 // Just making sure that tab events work for already opened tabs not only
    63 // for new windows.
    64 exports["test current window"] = test({
    65   readyWhen: events => events.length === 3,
    66   start: ({ tabs, window }) => {
    67     let tab = utils.openTab(window, 'data:text/plain,open');
    68     tabs.push(tab);
    69     utils.closeTab(tab);
    70   },
    71   end: ({ tabs, events, assert, done }) => {
    72     let [open, select, close] = events;
    73     let tab = tabs[0];
    75     assert.equal(open.type, "TabOpen");
    76     assert.equal(open.target, tab);
    78     assert.equal(select.type, "TabSelect");
    79     assert.equal(select.target, tab);
    81     assert.equal(close.type, "TabClose");
    82     assert.equal(close.target, tab);
    83     done();
    84   }
    85 });
    87 exports["test open"] = test({
    88   readyWhen: events => events.length === 2,
    89   start: ({ tabs, window }) => {
    90     tabs.push(utils.openTab(window, 'data:text/plain,open'));
    91   },
    92   end: ({ tabs, events, assert, done }) => {
    93     let [open, select] = events;
    94     let tab = tabs[0];
    96     assert.equal(open.type, "TabOpen");
    97     assert.equal(open.target, tab);
    99     assert.equal(select.type, "TabSelect");
   100     assert.equal(select.target, tab);
   101     done();
   102   }
   103 });
   105 exports["test open -> close"] = test({
   106   readyWhen: events => events.length === 3,
   107   start: ({ tabs, window }) => {
   108     // First tab is useless we just open it so that closing second tab won't
   109     // close window on some platforms.
   110     utils.openTab(window, 'data:text/plain,ignore');
   111     let tab = utils.openTab(window, 'data:text/plain,open-close');
   112     tabs.push(tab);
   113     utils.closeTab(tab);
   114   },
   115   end: ({ tabs, events, assert, done }) => {
   116     let [open, select, close] = events;
   117     let tab = tabs[0];
   119     assert.equal(open.type, "TabOpen");
   120     assert.equal(open.target, tab);
   122     assert.equal(select.type, "TabSelect");
   123     assert.equal(select.target, tab);
   125     assert.equal(close.type, "TabClose");
   126     assert.equal(close.target, tab);
   127     done();
   128   }
   129 });
   131 exports["test open -> open -> select"] = test({
   132   readyWhen: events => events.length === 5,
   133   start: ({tabs, window}) => {
   134     tabs.push(utils.openTab(window, 'data:text/plain,Tab-1'));
   135     tabs.push(utils.openTab(window, 'data:text/plain,Tab-2'));
   136     utils.activateTab(tabs[0], window);
   137   },
   138   end: ({ tabs, events, assert, done }) => {
   139     let [ tab1, tab2 ] = tabs;
   140     let tab1Events = 0;
   141     getRelatedEvents(events, tab1).map(event => {
   142       tab1Events++;
   143       if (tab1Events === 1)
   144         assert.equal(event.type, "TabOpen", "first tab opened");
   145       else
   146         assert.equal(event.type, "TabSelect", "first tab selected");
   147       assert.equal(event.target, tab1);
   148     });
   149     assert.equal(tab1Events, 3, "first tab has 3 events");
   151     let tab2Opened;
   152     getRelatedEvents(events, tab2).map(event => {
   153       if (!tab2Opened)
   154         assert.equal(event.type, "TabOpen", "second tab opened");
   155       else
   156         assert.equal(event.type, "TabSelect", "second tab selected");
   157       tab2Opened = true;
   158       assert.equal(event.target, tab2);
   159     });
   160     done();
   161   }
   162 });
   164 exports["test open -> pin -> unpin"] = test({
   165   readyWhen: events => events.length === (isFennec ? 2 : 5),
   166   start: ({ tabs, window }) => {
   167     tabs.push(utils.openTab(window, 'data:text/plain,pin-unpin'));
   168     utils.pin(tabs[0]);
   169     utils.unpin(tabs[0]);
   170   },
   171   end: ({ tabs, events, assert, done }) => {
   172     let [open, select, move, pin, unpin] = events;
   173     let tab = tabs[0];
   175     assert.equal(open.type, "TabOpen");
   176     assert.equal(open.target, tab);
   178     assert.equal(select.type, "TabSelect");
   179     assert.equal(select.target, tab);
   181     if (isFennec) {
   182       assert.pass("Tab pin / unpin is not supported by Fennec");
   183     }
   184     else {
   185       assert.equal(move.type, "TabMove");
   186       assert.equal(move.target, tab);
   188       assert.equal(pin.type, "TabPinned");
   189       assert.equal(pin.target, tab);
   191       assert.equal(unpin.type, "TabUnpinned");
   192       assert.equal(unpin.target, tab);
   193     }
   194     done();
   195   }
   196 });
   198 exports["test open -> open -> move "] = test({
   199   readyWhen: events => events.length === (isFennec ? 4 : 5),
   200   start: ({tabs, window}) => {
   201     tabs.push(utils.openTab(window, 'data:text/plain,Tab-1'));
   202     tabs.push(utils.openTab(window, 'data:text/plain,Tab-2'));
   203     utils.move(tabs[0], 2);
   204   },
   205   end: ({ tabs, events, assert, done }) => {
   206     let [ tab1, tab2 ] = tabs;
   207     let tab1Events = 0;
   208     getRelatedEvents(events, tab1).map(event => {
   209       tab1Events++;
   210       if (tab1Events === 1)
   211         assert.equal(event.type, "TabOpen", "first tab opened");
   212       else if (tab1Events === 2)
   213         assert.equal(event.type, "TabSelect", "first tab selected");
   214       else if (tab1Events === 3 && isFennec)
   215         assert.equal(event.type, "TabMove", "first tab moved");
   216       assert.equal(event.target, tab1);
   217     });
   218     assert.equal(tab1Events, isFennec ? 2 : 3,
   219       "correct number of events for first tab");
   221     let tab2Events = 0;
   222     getRelatedEvents(events, tab2).map(event => {
   223       tab2Events++;
   224       if (tab2Events === 1)
   225         assert.equal(event.type, "TabOpen", "second tab opened");
   226       else
   227         assert.equal(event.type, "TabSelect", "second tab selected");
   228       assert.equal(event.target, tab2);
   229     });
   230     done();
   231   }
   232 });
   234 function getRelatedEvents (events, tabs) {
   235   return events.filter(({target}) => ~([].concat(tabs)).indexOf(target));
   236 }
   238 require("sdk/test").run(exports);

mercurial