addon-sdk/source/test/addons/page-mod-debugger-post/main.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/. */
     4 "use strict";
     6 const { Cu } = require('chrome');
     7 const { PageMod } = require('sdk/page-mod');
     8 const tabs = require('sdk/tabs');
     9 const promise = require('sdk/core/promise')
    10 const { getMostRecentBrowserWindow } = require('sdk/window/utils');
    11 const { data } = require('sdk/self');
    12 const { set } = require('sdk/preferences/service');
    14 const { DebuggerServer } = Cu.import('resource://gre/modules/devtools/dbg-server.jsm', {});
    15 const { DebuggerClient } = Cu.import('resource://gre/modules/devtools/dbg-client.jsm', {});
    17 let gClient;
    18 let ok;
    19 let testName = 'testDebugger';
    20 let iframeURL = 'data:text/html;charset=utf-8,' + testName;
    21 let TAB_URL = 'data:text/html;charset=utf-8,' + encodeURIComponent('<iframe src="' + iframeURL + '" />');
    22 TAB_URL = data.url('index.html');
    23 let mod;
    25 exports.testDebugger = function(assert, done) {
    26   ok = assert.ok.bind(assert);
    27   assert.pass('starting test');
    28   set('devtools.debugger.log', true);
    30   if (!DebuggerServer.initialized) {
    31     DebuggerServer.init(() => true);
    32     DebuggerServer.addBrowserActors();
    33   }
    35   let transport = DebuggerServer.connectPipe();
    36   gClient = new DebuggerClient(transport);
    37   gClient.connect((aType, aTraits) => {
    38     tabs.open({
    39       url: TAB_URL,
    40       onLoad: function(tab) {
    41         assert.pass('tab loaded');
    43         attachTabActorForUrl(gClient, TAB_URL).
    44           then(_ => { assert.pass('attachTabActorForUrl called'); return _; }).
    45           then(attachThread).
    46           then(testDebuggerStatement).
    47           then(_ => { assert.pass('testDebuggerStatement called') }).
    48           then(closeConnection).
    49           then(_ => { assert.pass('closeConnection called') }).
    50           then(done).
    51           then(null, aError => {
    52             ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
    53           });
    54       }
    55     });
    56   });
    57 }
    59 function attachThread([aGrip, aResponse]) {
    60   let deferred = promise.defer();
    62   // Now attach and resume...
    63   gClient.request({ to: aResponse.threadActor, type: "attach" }, () => {
    64     gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
    65       ok(true, "Pause wasn't called before we've attached.");
    66       deferred.resolve([aGrip, aResponse]);
    67     });
    68   });
    70   return deferred.promise;
    71 }
    73 function testDebuggerStatement([aGrip, aResponse]) {
    74   let deferred = promise.defer();
    75   ok(aGrip, 'aGrip existss')
    77   gClient.addListener("paused", (aEvent, aPacket) => {
    78     ok(true, 'there was a pause event');
    79     gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
    80       ok(true, "The pause handler was triggered on a debugger statement.");
    81       deferred.resolve();
    82     });
    83   });
    85   mod = PageMod({
    86     include: TAB_URL,
    87     attachTo: ['existing', 'top', 'frame'],
    88     contentScriptFile: data.url('script.js'),
    89     onAttach: function(mod) {
    90       ok(true, 'the page-mod was attached to ' + mod.tab.url);
    92       require('sdk/timers').setTimeout(function() {
    93         let debuggee = getMostRecentBrowserWindow().gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject;
    94         debuggee.runDebuggerStatement();
    95         ok(true, 'called runDebuggerStatement');
    96       }, 500)
    97     }
    98   });
    99   ok(true, 'PageMod was created');
   101   return deferred.promise;
   102 }
   104 function getTabActorForUrl(aClient, aUrl) {
   105   let deferred = promise.defer();
   107   aClient.listTabs(aResponse => {
   108     let tabActor = aResponse.tabs.filter(aGrip => aGrip.url == aUrl).pop();
   109     deferred.resolve(tabActor);
   110   });
   112   return deferred.promise;
   113 }
   115 function attachTabActorForUrl(aClient, aUrl) {
   116   let deferred = promise.defer();
   118   getTabActorForUrl(aClient, aUrl).then(aGrip => {
   119     aClient.attachTab(aGrip.actor, aResponse => {
   120       deferred.resolve([aGrip, aResponse]);
   121     });
   122   });
   124   return deferred.promise;
   125 }
   127 function closeConnection() {
   128   let deferred = promise.defer();
   129   gClient.close(deferred.resolve);
   130   return deferred.promise;
   131 }
   133 require('sdk/test/runner').runTestsFromModule(module);

mercurial