toolkit/devtools/apps/tests/debugger-protocol-helper.js

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:781b1bb7b4fc
1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
3
4 const Cc = Components.classes;
5 const Ci = Components.interfaces;
6 const Cu = Components.utils;
7
8 const { DebuggerServer } = Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
9 const { DebuggerClient } = Cu.import("resource://gre/modules/devtools/dbg-client.jsm");
10
11 const { FileUtils } = Cu.import("resource://gre/modules/FileUtils.jsm");
12 const { Services } = Cu.import("resource://gre/modules/Services.jsm");
13
14 let gClient, gActor;
15
16 function connect(onDone) {
17
18 if (Services.appinfo.name == "B2G") {
19 // On b2g, we try to exercice the code that launches the production debugger server
20 let settingsService = Cc["@mozilla.org/settingsService;1"].getService(Ci.nsISettingsService);
21 settingsService.createLock().set("devtools.debugger.remote-enabled", true, null);
22 // We can't use `set` callback as it is fired before shell.js code listening for this setting
23 // is actually called. Same thing applies to mozsettings-changed obs notification.
24 // So listen to a custom event until bug 942756 lands
25 let observer = {
26 observe: function (subject, topic, data) {
27 Services.obs.removeObserver(observer, "debugger-server-started");
28 let transport = debuggerSocketConnect("127.0.0.1", 6000);
29 startClient(transport, onDone);
30 }
31 };
32 Services.obs.addObserver(observer, "debugger-server-started", false);
33 } else {
34 // Initialize a loopback remote protocol connection
35 DebuggerServer.init(function () { return true; });
36 // We need to register browser actors to have `listTabs` working
37 // and also have a root actor
38 DebuggerServer.addBrowserActors();
39 let transport = DebuggerServer.connectPipe();
40 startClient(transport, onDone);
41 }
42 }
43
44 function startClient(transport, onDone) {
45 // Setup client and actor used in all tests
46 gClient = new DebuggerClient(transport);
47 gClient.connect(function onConnect() {
48 gClient.listTabs(function onListTabs(aResponse) {
49 gActor = aResponse.webappsActor;
50 if (gActor)
51 webappActorRequest({type: "watchApps"}, onDone);
52 });
53 });
54
55 gClient.addListener("appInstall", function (aState, aType, aPacket) {
56 sendAsyncMessage("installed-event", { manifestURL: aType.manifestURL });
57 });
58
59 gClient.addListener("appUninstall", function (aState, aType, aPacket) {
60 sendAsyncMessage("uninstalled-event", { manifestURL: aType.manifestURL });
61 });
62
63 addMessageListener("appActorRequest", request => {
64 webappActorRequest(request, response => {
65 sendAsyncMessage("appActorResponse", response);
66 });
67 });
68 }
69
70 function webappActorRequest(request, onResponse) {
71 if (!gActor) {
72 connect(webappActorRequest.bind(null, request, onResponse));
73 return;
74 }
75
76 request.to = gActor;
77 gClient.request(request, onResponse);
78 }
79
80
81 function downloadURL(url, file) {
82 let channel = Services.io.newChannel(url, null, null);
83 let istream = channel.open();
84 let bstream = Cc["@mozilla.org/binaryinputstream;1"]
85 .createInstance(Ci.nsIBinaryInputStream);
86 bstream.setInputStream(istream);
87 let data = bstream.readBytes(bstream.available());
88
89 let ostream = Cc["@mozilla.org/network/safe-file-output-stream;1"]
90 .createInstance(Ci.nsIFileOutputStream);
91 ostream.init(file, 0x04 | 0x08 | 0x20, 0600, 0);
92 ostream.write(data, data.length);
93 ostream.QueryInterface(Ci.nsISafeOutputStream).finish();
94 }
95
96 // Install a test packaged webapp from data folder
97 addMessageListener("install", function (aMessage) {
98 let url = aMessage.url;
99 let appId = aMessage.appId;
100
101 try {
102 // Download its content from mochitest http server
103 // Copy our package to tmp folder, where the actor retrieves it
104 let zip = FileUtils.getDir("TmpD", ["b2g", appId], true, true);
105 zip.append("application.zip");
106 downloadURL(url, zip);
107
108 let request = {type: "install", appId: appId};
109 webappActorRequest(request, function (aResponse) {
110 sendAsyncMessage("installed", aResponse);
111 });
112 } catch(e) {
113 dump("installTestApp exception: " + e + "\n");
114 }
115 });
116
117 addMessageListener("cleanup", function () {
118 webappActorRequest({type: "unwatchApps"}, function () {
119 gClient.close();
120 });
121 });
122

mercurial