|
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"; |
|
5 |
|
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'); |
|
13 |
|
14 const { DebuggerServer } = Cu.import('resource://gre/modules/devtools/dbg-server.jsm', {}); |
|
15 const { DebuggerClient } = Cu.import('resource://gre/modules/devtools/dbg-client.jsm', {}); |
|
16 |
|
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; |
|
24 |
|
25 exports.testDebugger = function(assert, done) { |
|
26 ok = assert.ok.bind(assert); |
|
27 assert.pass('starting test'); |
|
28 set('devtools.debugger.log', true); |
|
29 |
|
30 mod = PageMod({ |
|
31 include: TAB_URL, |
|
32 attachTo: ['existing', 'top', 'frame'], |
|
33 contentScriptFile: data.url('script.js'), |
|
34 }); |
|
35 ok(true, 'PageMod was created'); |
|
36 |
|
37 if (!DebuggerServer.initialized) { |
|
38 DebuggerServer.init(() => true); |
|
39 DebuggerServer.addBrowserActors(); |
|
40 } |
|
41 |
|
42 let transport = DebuggerServer.connectPipe(); |
|
43 gClient = new DebuggerClient(transport); |
|
44 gClient.connect((aType, aTraits) => { |
|
45 tabs.open({ |
|
46 url: TAB_URL, |
|
47 onLoad: function(tab) { |
|
48 assert.pass('tab loaded'); |
|
49 |
|
50 attachTabActorForUrl(gClient, TAB_URL). |
|
51 then(_ => { assert.pass('attachTabActorForUrl called'); return _; }). |
|
52 then(attachThread). |
|
53 then(testDebuggerStatement). |
|
54 then(_ => { assert.pass('testDebuggerStatement called') }). |
|
55 then(closeConnection). |
|
56 then(_ => { assert.pass('closeConnection called') }). |
|
57 then(done). |
|
58 then(null, aError => { |
|
59 ok(false, "Got an error: " + aError.message + "\n" + aError.stack); |
|
60 }); |
|
61 } |
|
62 }); |
|
63 }); |
|
64 } |
|
65 |
|
66 function attachThread([aGrip, aResponse]) { |
|
67 let deferred = promise.defer(); |
|
68 |
|
69 // Now attach and resume... |
|
70 gClient.request({ to: aResponse.threadActor, type: "attach" }, () => { |
|
71 gClient.request({ to: aResponse.threadActor, type: "resume" }, () => { |
|
72 ok(true, "Pause wasn't called before we've attached."); |
|
73 deferred.resolve([aGrip, aResponse]); |
|
74 }); |
|
75 }); |
|
76 |
|
77 return deferred.promise; |
|
78 } |
|
79 |
|
80 function testDebuggerStatement([aGrip, aResponse]) { |
|
81 let deferred = promise.defer(); |
|
82 ok(aGrip, 'aGrip existss') |
|
83 |
|
84 gClient.addListener("paused", (aEvent, aPacket) => { |
|
85 ok(true, 'there was a pause event'); |
|
86 gClient.request({ to: aResponse.threadActor, type: "resume" }, () => { |
|
87 ok(true, "The pause handler was triggered on a debugger statement."); |
|
88 deferred.resolve(); |
|
89 }); |
|
90 }); |
|
91 |
|
92 let debuggee = getMostRecentBrowserWindow().gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject; |
|
93 debuggee.runDebuggerStatement(); |
|
94 ok(true, 'called runDebuggerStatement'); |
|
95 |
|
96 return deferred.promise; |
|
97 } |
|
98 |
|
99 function getTabActorForUrl(aClient, aUrl) { |
|
100 let deferred = promise.defer(); |
|
101 |
|
102 aClient.listTabs(aResponse => { |
|
103 let tabActor = aResponse.tabs.filter(aGrip => aGrip.url == aUrl).pop(); |
|
104 deferred.resolve(tabActor); |
|
105 }); |
|
106 |
|
107 return deferred.promise; |
|
108 } |
|
109 |
|
110 function attachTabActorForUrl(aClient, aUrl) { |
|
111 let deferred = promise.defer(); |
|
112 |
|
113 getTabActorForUrl(aClient, aUrl).then(aGrip => { |
|
114 aClient.attachTab(aGrip.actor, aResponse => { |
|
115 deferred.resolve([aGrip, aResponse]); |
|
116 }); |
|
117 }); |
|
118 |
|
119 return deferred.promise; |
|
120 } |
|
121 |
|
122 function closeConnection() { |
|
123 let deferred = promise.defer(); |
|
124 gClient.close(deferred.resolve); |
|
125 return deferred.promise; |
|
126 } |
|
127 |
|
128 require('sdk/test/runner').runTestsFromModule(module); |