From ad64adb2ee9da1742be8c6dbf80290b0ee4e01c9 Mon Sep 17 00:00:00 2001
From: Lucas Rocha <lucasr@mozilla.com>
Date: Tue, 10 Apr 2012 11:05:45 +0100
Subject: [PATCH] Bug 739966 - Add a Debugger listener to Fennec (r=mfinkle)

---
 mobile/android/app/mobile.js                 |  3 +
 mobile/android/chrome/content/browser.js     | 73 ++++++++++++++++++++
 mobile/android/installer/package-manifest.in |  2 +
 3 files changed, 78 insertions(+)

diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js
index 4a9f9dfb667a0..1c01ed09badb8 100644
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -706,3 +706,6 @@ pref("full-screen-api.enabled", true);
 
 pref("direct-texture.force.enabled", false);
 pref("direct-texture.force.disabled", false);
+
+pref("remote-debugger.enabled", false);
+pref("remote-debugger.port", 6000);
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index b449ba50b353b..f758e8c1ec57b 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -52,6 +52,11 @@ XPCOMUtils.defineLazyGetter(this, "PluralForm", function() {
   return PluralForm;
 });
 
+XPCOMUtils.defineLazyGetter(this, "DebuggerServer", function() {
+  Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
+  return DebuggerServer;
+});
+
 // Lazily-loaded browser scripts:
 [
   ["SelectHelper", "chrome://browser/content/SelectHelper.js"],
@@ -237,6 +242,7 @@ var BrowserApp = {
     SearchEngines.init();
     ActivityObserver.init();
     WebappsUI.init();
+    RemoteDebugger.init();
 
     // Init LoginManager
     Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
@@ -417,6 +423,7 @@ var BrowserApp = {
     CharacterEncoding.uninit();
     SearchEngines.uninit();
     WebappsUI.uninit();
+    RemoteDebugger.uninit();
   },
 
   // This function returns false during periods where the browser displayed document is
@@ -4618,3 +4625,69 @@ var WebappsUI = {
     }
   }
 }
+
+var RemoteDebugger = {
+  init: function rd_init() {
+    Services.prefs.addObserver("remote-debugger.", this, false);
+
+    if (this._isEnabled())
+      this._start();
+  },
+
+  observe: function rd_observe(aSubject, aTopic, aData) {
+    if (aTopic != "nsPref:changed")
+      return;
+
+    switch (aData) {
+      case "remote-debugger.enabled":
+        if (this._isEnabled())
+          this._start();
+        else
+          this._stop();
+        break;
+
+      case "remote-debugger.port":
+        if (this._isEnabled())
+          this._restart();
+        break;
+    }
+  },
+
+  uninit: function rd_uninit() {
+    Services.prefs.removeObserver("remote-debugger.", this);
+    this._stop();
+  },
+
+  _getPort: function _rd_getPort() {
+    return Services.prefs.getIntPref("remote-debugger.port");
+  },
+
+  _isEnabled: function rd_isEnabled() {
+    return Services.prefs.getBoolPref("remote-debugger.enabled");
+  },
+
+  _restart: function rd_restart() {
+    this._stop();
+    this._start();
+  },
+
+  _start: function rd_start() {
+    try {
+      if (!DebuggerServer.initialized) {
+        DebuggerServer.init();
+        DebuggerServer.addActors("chrome://browser/content/dbg-browser-actors.js");
+      }
+
+      let port = this._getPort();
+      DebuggerServer.openListener(port, false);
+      dump("Remote debugger listening on port " + port);
+    } catch(e) {
+      dump("Remote debugger didn't start: " + e);
+    }
+  },
+
+  _stop: function rd_start() {
+    DebuggerServer.closeListener();
+    dump("Remote debugger stopped");
+  }
+}
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index a8909a7619f2f..34d7235c33a75 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -199,6 +199,8 @@
 @BINPATH@/components/jar.xpt
 @BINPATH@/components/jetpack.xpt
 @BINPATH@/components/jsdservice.xpt
+@BINPATH@/components/jsdebugger.xpt
+@BINPATH@/components/jsinspector.xpt
 @BINPATH@/components/layout_base.xpt
 @BINPATH@/components/layout_forms.xpt
 #ifdef NS_PRINTING
-- 
GitLab