Thu, 15 Jan 2015 15:59:08 +0100
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);