diff --git a/addon-sdk/source/test/addons/page-mod-debugger-post/main.js b/addon-sdk/source/test/addons/page-mod-debugger-post/main.js
index fc276fc09da1..97973ec0f6e2 100644
--- a/addon-sdk/source/test/addons/page-mod-debugger-post/main.js
+++ b/addon-sdk/source/test/addons/page-mod-debugger-post/main.js
@@ -29,7 +29,7 @@ exports.testDebugger = function(assert, done) {
set('devtools.debugger.log', true);
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/addon-sdk/source/test/addons/page-mod-debugger-pre/main.js b/addon-sdk/source/test/addons/page-mod-debugger-pre/main.js
index f07703410772..695481e34d6b 100644
--- a/addon-sdk/source/test/addons/page-mod-debugger-pre/main.js
+++ b/addon-sdk/source/test/addons/page-mod-debugger-pre/main.js
@@ -36,7 +36,7 @@ exports.testDebugger = function(assert, done) {
ok(true, 'PageMod was created');
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/b2g/chrome/content/devtools/debugger.js b/b2g/chrome/content/devtools/debugger.js
index 5a5709b8aa41..19f7d40c8966 100644
--- a/b2g/chrome/content/devtools/debugger.js
+++ b/b2g/chrome/content/devtools/debugger.js
@@ -74,7 +74,7 @@ let RemoteDebugger = {
}
// Ask for remote connections.
- DebuggerServer.init(this.prompt.bind(this));
+ DebuggerServer.init();
// /!\ Be careful when adding a new actor, especially global actors.
// Any new global actor will be exposed and returned by the root actor.
@@ -119,6 +119,8 @@ let RemoteDebugger = {
}
};
+RemoteDebugger.prompt = RemoteDebugger.prompt.bind(RemoteDebugger);
+
let USBRemoteDebugger = {
get isDebugging() {
@@ -144,6 +146,7 @@ let USBRemoteDebugger = {
try {
debug("Starting USB debugger on " + portOrPath);
this._listener = DebuggerServer.openListener(portOrPath);
+ this._listener.allowConnection = RemoteDebugger.prompt;
// Temporary event, until bug 942756 lands and offers a way to know
// when the server is up and running.
Services.obs.notifyObservers(null, "debugger-server-started", null);
@@ -179,6 +182,7 @@ let WiFiRemoteDebugger = {
try {
debug("Starting WiFi debugger");
this._listener = DebuggerServer.openListener(-1);
+ this._listener.allowConnection = RemoteDebugger.prompt;
let port = this._listener.port;
debug("Started WiFi debugger on " + port);
discovery.addService("devtools", { port: port });
diff --git a/browser/devtools/app-manager/test/test_connection_store.html b/browser/devtools/app-manager/test/test_connection_store.html
index d3e696689879..ef2f0fd0f07a 100644
--- a/browser/devtools/app-manager/test/test_connection_store.html
+++ b/browser/devtools/app-manager/test/test_connection_store.html
@@ -28,7 +28,7 @@ Bug 901519 - [app manager] data store for connections
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/app-manager/test/test_device_store.html b/browser/devtools/app-manager/test/test_device_store.html
index 33ac516baf9c..1c2767d17b7d 100644
--- a/browser/devtools/app-manager/test/test_device_store.html
+++ b/browser/devtools/app-manager/test/test_device_store.html
@@ -22,7 +22,7 @@ Bug 901520 - [app manager] data store for device
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/app-manager/test/test_remain_connected.html b/browser/devtools/app-manager/test/test_remain_connected.html
index fc13d2b5b5e1..819e3d6c073b 100644
--- a/browser/devtools/app-manager/test/test_remain_connected.html
+++ b/browser/devtools/app-manager/test/test_remain_connected.html
@@ -22,7 +22,7 @@ Bug 912646 - Closing app toolbox causes phone to disconnect
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/canvasdebugger/test/head.js b/browser/devtools/canvasdebugger/test/head.js
index c1d8a1ebaf91..dc2241ddd3ee 100644
--- a/browser/devtools/canvasdebugger/test/head.js
+++ b/browser/devtools/canvasdebugger/test/head.js
@@ -184,7 +184,7 @@ function reload(aTarget, aWaitForTargetEvent = "navigate") {
function initServer() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
}
diff --git a/browser/devtools/debugger/test/browser_dbg_addonactor.js b/browser/devtools/debugger/test/browser_dbg_addonactor.js
index d2e794569030..9c511ceb8897 100644
--- a/browser/devtools/debugger/test/browser_dbg_addonactor.js
+++ b/browser/devtools/debugger/test/browser_dbg_addonactor.js
@@ -10,7 +10,7 @@ var gAddon, gClient, gThreadClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-01.js b/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-01.js
index 4ed6b99886fd..c5c115912681 100644
--- a/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-01.js
@@ -11,7 +11,7 @@ let gClient, gThreadClient, gInput, gButton;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-02.js b/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-02.js
index d8aca79d277d..fb40478e6499 100644
--- a/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_break-on-dom-event-02.js
@@ -12,7 +12,7 @@ let gClient, gThreadClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_chrome-debugging.js b/browser/devtools/debugger/test/browser_dbg_chrome-debugging.js
index 851043566a8a..516a7e5a35ac 100644
--- a/browser/devtools/debugger/test/browser_dbg_chrome-debugging.js
+++ b/browser/devtools/debugger/test/browser_dbg_chrome-debugging.js
@@ -20,7 +20,7 @@ let DebuggerServer = loader.DebuggerServer;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_debugger-statement.js b/browser/devtools/debugger/test/browser_dbg_debugger-statement.js
index 5514354aff14..40112acd0426 100644
--- a/browser/devtools/debugger/test/browser_dbg_debugger-statement.js
+++ b/browser/devtools/debugger/test/browser_dbg_debugger-statement.js
@@ -12,7 +12,7 @@ let gTab;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_event-listeners-01.js b/browser/devtools/debugger/test/browser_dbg_event-listeners-01.js
index c0c7ae7c24dd..5d5a8b35c22b 100644
--- a/browser/devtools/debugger/test/browser_dbg_event-listeners-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_event-listeners-01.js
@@ -12,7 +12,7 @@ let gTab;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_event-listeners-02.js b/browser/devtools/debugger/test/browser_dbg_event-listeners-02.js
index dd97a6d081f1..f516f1e45ecc 100644
--- a/browser/devtools/debugger/test/browser_dbg_event-listeners-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_event-listeners-02.js
@@ -13,7 +13,7 @@ let gTab;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_event-listeners-03.js b/browser/devtools/debugger/test/browser_dbg_event-listeners-03.js
index e7cf0a2ab8f2..34663cb9aac2 100644
--- a/browser/devtools/debugger/test/browser_dbg_event-listeners-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_event-listeners-03.js
@@ -13,7 +13,7 @@ let gTab;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_globalactor.js b/browser/devtools/debugger/test/browser_dbg_globalactor.js
index 12cc4d50ed88..fa21a6f7f8dd 100644
--- a/browser/devtools/debugger/test/browser_dbg_globalactor.js
+++ b/browser/devtools/debugger/test/browser_dbg_globalactor.js
@@ -12,7 +12,7 @@ function test() {
let gClient;
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_listaddons.js b/browser/devtools/debugger/test/browser_dbg_listaddons.js
index e1e340fd127b..bf3014ef30cb 100644
--- a/browser/devtools/debugger/test/browser_dbg_listaddons.js
+++ b/browser/devtools/debugger/test/browser_dbg_listaddons.js
@@ -11,7 +11,7 @@ let gAddon1, gAddon1Actor, gAddon2, gAddon2Actor, gClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_listtabs-01.js b/browser/devtools/debugger/test/browser_dbg_listtabs-01.js
index 8fa65254c89a..0f6bc608d6de 100644
--- a/browser/devtools/debugger/test/browser_dbg_listtabs-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_listtabs-01.js
@@ -12,7 +12,7 @@ let gTab1, gTab1Actor, gTab2, gTab2Actor, gClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_listtabs-02.js b/browser/devtools/debugger/test/browser_dbg_listtabs-02.js
index 4bc948b722c1..d9878a70ab10 100644
--- a/browser/devtools/debugger/test/browser_dbg_listtabs-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_listtabs-02.js
@@ -25,7 +25,7 @@ function onListChangedHandler() {
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_listtabs-03.js b/browser/devtools/debugger/test/browser_dbg_listtabs-03.js
index 9c2f042b615c..26ccc6837a92 100644
--- a/browser/devtools/debugger/test/browser_dbg_listtabs-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_listtabs-03.js
@@ -27,7 +27,7 @@ function request(params) {
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_multiple-windows.js b/browser/devtools/debugger/test/browser_dbg_multiple-windows.js
index fd17fc45002d..f842a3fc1fce 100644
--- a/browser/devtools/debugger/test/browser_dbg_multiple-windows.js
+++ b/browser/devtools/debugger/test/browser_dbg_multiple-windows.js
@@ -14,7 +14,7 @@ let gClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_navigation.js b/browser/devtools/debugger/test/browser_dbg_navigation.js
index 48563cb546cb..85915017cc35 100644
--- a/browser/devtools/debugger/test/browser_dbg_navigation.js
+++ b/browser/devtools/debugger/test/browser_dbg_navigation.js
@@ -12,7 +12,7 @@ let gClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_tabactor-01.js b/browser/devtools/debugger/test/browser_dbg_tabactor-01.js
index 723618d78e85..8e0b92d8f951 100644
--- a/browser/devtools/debugger/test/browser_dbg_tabactor-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_tabactor-01.js
@@ -13,7 +13,7 @@ let gClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/browser_dbg_tabactor-02.js b/browser/devtools/debugger/test/browser_dbg_tabactor-02.js
index 32664609ef7b..c27b39bbd799 100644
--- a/browser/devtools/debugger/test/browser_dbg_tabactor-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_tabactor-02.js
@@ -13,7 +13,7 @@ let gClient;
function test() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/debugger/test/head.js b/browser/devtools/debugger/test/head.js
index a21547810e64..db8e4a63a537 100644
--- a/browser/devtools/debugger/test/head.js
+++ b/browser/devtools/debugger/test/head.js
@@ -551,7 +551,7 @@ AddonDebugger.prototype = {
info("Initializing an addon debugger panel.");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/framework/connect/connect.js b/browser/devtools/framework/connect/connect.js
index 97f0d0a4ceb0..57eefa623b41 100644
--- a/browser/devtools/framework/connect/connect.js
+++ b/browser/devtools/framework/connect/connect.js
@@ -62,9 +62,9 @@ function submit() {
// Initiate the connection
let transport;
try {
- transport = debuggerSocketConnect(host, port);
+ transport = DebuggerClient.socketConnect(host, port);
} catch(e) {
- // Bug 921850: catch rare exception from debuggerSocketConnect
+ // Bug 921850: catch rare exception from DebuggerClient.socketConnect
showError("unexpected");
return;
}
diff --git a/browser/devtools/framework/test/browser_target_remote.js b/browser/devtools/framework/test/browser_target_remote.js
index 7f0f7d762cba..d0e41746f1cb 100644
--- a/browser/devtools/framework/test/browser_target_remote.js
+++ b/browser/devtools/framework/test/browser_target_remote.js
@@ -13,7 +13,7 @@ function test() {
waitForExplicitFinish();
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/framework/test/browser_target_support.js b/browser/devtools/framework/test/browser_target_support.js
index 1d8433f0bfdf..8664284c4275 100644
--- a/browser/devtools/framework/test/browser_target_support.js
+++ b/browser/devtools/framework/test/browser_target_support.js
@@ -61,7 +61,7 @@ function test() {
waitForExplicitFinish();
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js b/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js
index 270de33c2599..76d7e4c296e0 100644
--- a/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js
+++ b/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js
@@ -66,7 +66,7 @@ function getClient() {
let deferred = promise.defer();
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/framework/test/browser_two_tabs.js b/browser/devtools/framework/test/browser_two_tabs.js
index 84bd9ae4e218..1743999ecb66 100644
--- a/browser/devtools/framework/test/browser_two_tabs.js
+++ b/browser/devtools/framework/test/browser_two_tabs.js
@@ -23,7 +23,7 @@ function test() {
waitForExplicitFinish();
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/framework/toolbox-options.js b/browser/devtools/framework/toolbox-options.js
index 369a0581714a..88de29513b81 100644
--- a/browser/devtools/framework/toolbox-options.js
+++ b/browser/devtools/framework/toolbox-options.js
@@ -81,6 +81,9 @@ function OptionsPanel(iframeWindow, toolbox) {
this._prefChanged = this._prefChanged.bind(this);
this._themeRegistered = this._themeRegistered.bind(this);
this._themeUnregistered = this._themeUnregistered.bind(this);
+ this._disableJSClicked = this._disableJSClicked.bind(this);
+
+ this.disableJSNode = this.panelDoc.getElementById("devtools-disable-javascript");
this._addListeners();
@@ -112,11 +115,6 @@ OptionsPanel.prototype = {
this.setupBrowserThemeButton();
this.populatePreferences();
this.updateDefaultTheme();
-
- this._disableJSClicked = this._disableJSClicked.bind(this);
-
- let disableJSNode = this.panelDoc.getElementById("devtools-disable-javascript");
- disableJSNode.addEventListener("click", this._disableJSClicked, false);
}).then(() => {
this.isReady = true;
this.emit("ready");
@@ -369,11 +367,15 @@ OptionsPanel.prototype = {
}.bind(menulist));
}
- this.target.client.attachTab(this.target.activeTab._actor, (response) => {
- this._origJavascriptEnabled = response.javascriptEnabled;
-
- this._populateDisableJSCheckbox();
- });
+ if (this.target.activeTab) {
+ this.target.client.attachTab(this.target.activeTab._actor, (response) => {
+ this._origJavascriptEnabled = response.javascriptEnabled;
+ this.disableJSNode.checked = !this._origJavascriptEnabled
+ this.disableJSNode.addEventListener("click", this._disableJSClicked, false);
+ });
+ } else {
+ this.disableJSNode.hidden = true;
+ }
},
updateDefaultTheme: function() {
@@ -395,11 +397,6 @@ OptionsPanel.prototype = {
}
},
- _populateDisableJSCheckbox: function() {
- let cbx = this.panelDoc.getElementById("devtools-disable-javascript");
- cbx.checked = !this._origJavascriptEnabled;
- },
-
/**
* Disables JavaScript for the currently loaded tab. We force a page refresh
* here because setting docShell.allowJavascript to true fails to block JS
@@ -447,23 +444,21 @@ OptionsPanel.prototype = {
let deferred = promise.defer();
this.destroyPromise = deferred.promise;
-
- let disableJSNode = this.panelDoc.getElementById("devtools-disable-javascript");
- disableJSNode.removeEventListener("click", this._disableJSClicked, false);
-
this._removeListeners();
- this.panelWin = this.panelDoc = null;
- this._disableJSClicked = null;
+ if (this.target.activeTab) {
+ this.disableJSNode.removeEventListener("click", this._disableJSClicked, false);
+ // If JavaScript is disabled we need to revert it to it's original value.
+ let options = {
+ "javascriptEnabled": this._origJavascriptEnabled
+ };
+ this.target.activeTab.reconfigure(options, () => {
+ this.toolbox = null;
+ deferred.resolve();
+ }, true);
+ }
- // If JavaScript is disabled we need to revert it to it's original value.
- let options = {
- "javascriptEnabled": this._origJavascriptEnabled
- };
- this.target.activeTab.reconfigure(options, () => {
- this.toolbox = null;
- deferred.resolve();
- }, true);
+ this.panelWin = this.panelDoc = this.disableJSNode = null;
Services.obs.removeObserver(this, kDeveditionChangedNotification);
diff --git a/browser/devtools/framework/toolbox-process-window.js b/browser/devtools/framework/toolbox-process-window.js
index f8bffb524c87..9d83971ba916 100644
--- a/browser/devtools/framework/toolbox-process-window.js
+++ b/browser/devtools/framework/toolbox-process-window.js
@@ -8,7 +8,7 @@ const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
let { gDevTools } = Cu.import("resource:///modules/devtools/gDevTools.jsm", {});
let { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
let { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
-let { debuggerSocketConnect, DebuggerClient } =
+let { DebuggerClient } =
Cu.import("resource://gre/modules/devtools/dbg-client.jsm", {});
let { ViewHelpers } =
Cu.import("resource:///modules/devtools/ViewHelpers.jsm", {});
@@ -26,7 +26,7 @@ let gToolbox, gClient;
function connect() {
window.removeEventListener("load", connect);
// Initiate the connection
- let transport = debuggerSocketConnect(
+ let transport = DebuggerClient.socketConnect(
Prefs.chromeDebuggingHost,
Prefs.chromeDebuggingPort
);
diff --git a/browser/devtools/performance/test/head.js b/browser/devtools/performance/test/head.js
index 5f7478911a84..b2f9498b0747 100644
--- a/browser/devtools/performance/test/head.js
+++ b/browser/devtools/performance/test/head.js
@@ -139,7 +139,7 @@ function initBackend(aUrl) {
info("Initializing a performance front.");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/shadereditor/test/head.js b/browser/devtools/shadereditor/test/head.js
index f6216ca6d787..6dfe16ae9b79 100644
--- a/browser/devtools/shadereditor/test/head.js
+++ b/browser/devtools/shadereditor/test/head.js
@@ -234,7 +234,7 @@ function initBackend(aUrl) {
info("Initializing a shader editor front.");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/webaudioeditor/test/head.js b/browser/devtools/webaudioeditor/test/head.js
index a4d276bea9df..25dbda604406 100644
--- a/browser/devtools/webaudioeditor/test/head.js
+++ b/browser/devtools/webaudioeditor/test/head.js
@@ -129,7 +129,7 @@ function initBackend(aUrl) {
info("Initializing a web audio editor front.");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/webide/test/browser_tabs.js b/browser/devtools/webide/test/browser_tabs.js
index c26c9284a426..81ff64c2c7bf 100644
--- a/browser/devtools/webide/test/browser_tabs.js
+++ b/browser/devtools/webide/test/browser_tabs.js
@@ -15,7 +15,7 @@ function test() {
// Since we test the connections set below, destroy the server in case it
// was left open.
DebuggerServer.destroy();
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
let tab = yield addTab(TEST_URI);
diff --git a/browser/devtools/webide/test/test_autoconnect_runtime.html b/browser/devtools/webide/test/test_autoconnect_runtime.html
index 7f8cebeec1e1..c836a44b1cd0 100644
--- a/browser/devtools/webide/test/test_autoconnect_runtime.html
+++ b/browser/devtools/webide/test/test_autoconnect_runtime.html
@@ -21,7 +21,7 @@
Task.spawn(function* () {
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
let win = yield openWebIDE();
diff --git a/browser/devtools/webide/test/test_device_preferences.html b/browser/devtools/webide/test/test_device_preferences.html
index 82dfeae8e212..51e232373c7e 100644
--- a/browser/devtools/webide/test/test_device_preferences.html
+++ b/browser/devtools/webide/test/test_device_preferences.html
@@ -21,7 +21,7 @@
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/webide/test/test_deviceinfo.html b/browser/devtools/webide/test/test_deviceinfo.html
index 7f29f061fb8e..821100e2454d 100644
--- a/browser/devtools/webide/test/test_deviceinfo.html
+++ b/browser/devtools/webide/test/test_deviceinfo.html
@@ -22,7 +22,7 @@
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/webide/test/test_runtime.html b/browser/devtools/webide/test/test_runtime.html
index f0ed1ee66d2d..5e6f07c01bf9 100644
--- a/browser/devtools/webide/test/test_runtime.html
+++ b/browser/devtools/webide/test/test_runtime.html
@@ -43,7 +43,7 @@
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/devtools/webide/test/test_telemetry.html b/browser/devtools/webide/test/test_telemetry.html
index f35427ba295a..c97552c17a92 100644
--- a/browser/devtools/webide/test/test_telemetry.html
+++ b/browser/devtools/webide/test/test_telemetry.html
@@ -223,7 +223,7 @@
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn
index b210e396d92b..5c2ebccc2f84 100644
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -216,6 +216,7 @@ browser.jar:
skin/classic/browser/devtools/filters.svg (../shared/devtools/filters.svg)
skin/classic/browser/devtools/controls.png (../shared/devtools/images/controls.png)
skin/classic/browser/devtools/controls@2x.png (../shared/devtools/images/controls@2x.png)
+ skin/classic/browser/devtools/performance-icons.svg (../shared/devtools/images/performance-icons.svg)
skin/classic/browser/devtools/newtab.png (../shared/devtools/images/newtab.png)
skin/classic/browser/devtools/newtab@2x.png (../shared/devtools/images/newtab@2x.png)
skin/classic/browser/devtools/newtab-inverted.png (../shared/devtools/images/newtab-inverted.png)
diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn
index f88d3196c158..a4f69561b47a 100644
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -342,6 +342,7 @@ browser.jar:
skin/classic/browser/devtools/filters.svg (../shared/devtools/filters.svg)
skin/classic/browser/devtools/controls.png (../shared/devtools/images/controls.png)
skin/classic/browser/devtools/controls@2x.png (../shared/devtools/images/controls@2x.png)
+ skin/classic/browser/devtools/performance-icons.svg (../shared/devtools/images/performance-icons.svg)
skin/classic/browser/devtools/newtab.png (../shared/devtools/images/newtab.png)
skin/classic/browser/devtools/newtab@2x.png (../shared/devtools/images/newtab@2x.png)
skin/classic/browser/devtools/newtab-inverted.png (../shared/devtools/images/newtab-inverted.png)
diff --git a/browser/themes/shared/devtools/images/performance-icons.svg b/browser/themes/shared/devtools/images/performance-icons.svg
new file mode 100644
index 000000000000..6cb5f246b626
--- /dev/null
+++ b/browser/themes/shared/devtools/images/performance-icons.svg
@@ -0,0 +1,41 @@
+
\ No newline at end of file
diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn
index 464bbda7130f..9f06d41920d9 100644
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -251,6 +251,7 @@ browser.jar:
skin/classic/browser/devtools/filters.svg (../shared/devtools/filters.svg)
skin/classic/browser/devtools/controls.png (../shared/devtools/images/controls.png)
skin/classic/browser/devtools/controls@2x.png (../shared/devtools/images/controls@2x.png)
+ skin/classic/browser/devtools/performance-icons.svg (../shared/devtools/images/performance-icons.svg)
skin/classic/browser/devtools/newtab.png (../shared/devtools/images/newtab.png)
skin/classic/browser/devtools/newtab@2x.png (../shared/devtools/images/newtab@2x.png)
skin/classic/browser/devtools/newtab-inverted.png (../shared/devtools/images/newtab-inverted.png)
@@ -696,6 +697,7 @@ browser.jar:
skin/classic/aero/browser/devtools/filters.svg (../shared/devtools/filters.svg)
skin/classic/aero/browser/devtools/controls.png (../shared/devtools/images/controls.png)
skin/classic/aero/browser/devtools/controls@2x.png (../shared/devtools/images/controls@2x.png)
+ skin/classic/aero/browser/devtools/performance-icons.svg (../shared/devtools/images/performance-icons.svg)
skin/classic/aero/browser/devtools/newtab.png (../shared/devtools/images/newtab.png)
skin/classic/aero/browser/devtools/newtab@2x.png (../shared/devtools/images/newtab@2x.png)
skin/classic/aero/browser/devtools/newtab-inverted.png (../shared/devtools/images/newtab-inverted.png)
diff --git a/dom/media/fmp4/MP4Reader.cpp b/dom/media/fmp4/MP4Reader.cpp
index 8aa02c74ad82..71bb75ca5583 100644
--- a/dom/media/fmp4/MP4Reader.cpp
+++ b/dom/media/fmp4/MP4Reader.cpp
@@ -583,7 +583,6 @@ MP4Reader::Update(TrackType aTrack)
bool needInput = false;
bool needOutput = false;
- bool eos = false;
auto& decoder = GetDecoderData(aTrack);
nsRefPtr output;
{
@@ -599,7 +598,6 @@ MP4Reader::Update(TrackType aTrack)
output = decoder.mOutput[0];
decoder.mOutput.RemoveElementAt(0);
}
- eos = decoder.mEOS;
}
VLOG("Update(%s) ni=%d no=%d iex=%d or=%d fl=%d",
TrackTypeToStr(aTrack),
@@ -617,16 +615,15 @@ MP4Reader::Update(TrackType aTrack)
{
MonitorAutoLock lock(decoder.mMonitor);
MOZ_ASSERT(!decoder.mEOS);
- eos = decoder.mEOS = true;
+ decoder.mEOS = true;
}
+ // DrainComplete takes care of reporting EOS upwards
decoder.mDecoder->Drain();
}
}
if (needOutput) {
if (output) {
ReturnOutput(output, aTrack);
- } else if (eos) {
- ReturnEOS(aTrack);
}
}
}
@@ -730,9 +727,14 @@ void
MP4Reader::DrainComplete(TrackType aTrack)
{
DecoderData& data = GetDecoderData(aTrack);
- MonitorAutoLock mon(data.mMonitor);
- data.mDrainComplete = true;
- mon.NotifyAll();
+ bool eos;
+ {
+ MonitorAutoLock mon(data.mMonitor);
+ eos = data.mEOS;
+ }
+ if (eos) {
+ ReturnEOS(aTrack);
+ }
}
void
@@ -771,7 +773,6 @@ MP4Reader::Flush(TrackType aTrack)
{
MonitorAutoLock mon(data.mMonitor);
data.mIsFlushing = true;
- data.mDrainComplete = false;
data.mEOS = false;
}
data.mDecoder->Flush();
diff --git a/dom/media/fmp4/MP4Reader.h b/dom/media/fmp4/MP4Reader.h
index f1c4b6fac9b3..80bf2390eb9d 100644
--- a/dom/media/fmp4/MP4Reader.h
+++ b/dom/media/fmp4/MP4Reader.h
@@ -156,7 +156,6 @@ private:
, mInputExhausted(false)
, mError(false)
, mIsFlushing(false)
- , mDrainComplete(false)
, mOutputRequested(false)
, mUpdateScheduled(false)
, mEOS(false)
@@ -186,7 +185,6 @@ private:
bool mInputExhausted;
bool mError;
bool mIsFlushing;
- bool mDrainComplete;
bool mOutputRequested;
bool mUpdateScheduled;
bool mEOS;
diff --git a/dom/media/test/test_eme_stream_capture_blocked.html b/dom/media/test/test_eme_stream_capture_blocked.html
index 13eb222ada7e..58682343ce44 100644
--- a/dom/media/test/test_eme_stream_capture_blocked.html
+++ b/dom/media/test/test_eme_stream_capture_blocked.html
@@ -28,10 +28,9 @@ function startTest(test, token)
var v1 = SetupEME(test, case1token, { onSetKeysFail: setKeysFailed });
var context = new AudioContext();
var node = context.createMediaElementSource(v1);
- v1.preload = "auto"; // Required due to "canplay" not firing for MSE unless we do this.
v1.addEventListener("error", bail(case1token + " got error event"));
- v1.addEventListener("canplay", function(ev) {
- ok(false, TimeStamp(case1token) + " should never reach canplay, as setMediaKeys should fail");
+ v1.addEventListener("loadeddata", function(ev) {
+ ok(false, TimeStamp(case1token) + " should never reach loadeddata, as setMediaKeys should fail");
});
manager.started(case1token);
LoadTest(test, v1, case1token);
@@ -40,10 +39,9 @@ function startTest(test, token)
// Case 2. creating a MediaElementSource on a media element with a MediaKeys should fail.
var case2token = token + "_case2";
var v2 = SetupEME(test, case2token);
- v2.preload = "auto"; // Required due to "canplay" not firing for MSE unless we do this.
v2.addEventListener("error", bail(case2token + " got error event"));
- v2.addEventListener("canplay", function(ev) {
- ok(true, case2token + " should reach canplay");
+ v2.addEventListener("loadeddata", function(ev) {
+ ok(true, case2token + " should reach loadeddata");
var threw = false;
try {
var context = new AudioContext();
@@ -61,10 +59,9 @@ function startTest(test, token)
// Case 3. capturing a media element with mozCaptureStream that has a MediaKeys should fail.
var case3token = token + "_case3";
var v3 = SetupEME(test, case3token);
- v3.preload = "auto"; // Required due to "canplay" not firing for MSE unless we do this.
v3.addEventListener("error", bail(case3token + " got error event"));
- v3.addEventListener("canplay", function(ev) {
- ok(true, TimeStamp(case3token) + " should reach canplay");
+ v3.addEventListener("loadeddata", function(ev) {
+ ok(true, TimeStamp(case3token) + " should reach loadeddata");
var threw = false;
try {
var stream = v3.mozCaptureStreamUntilEnded();
diff --git a/dom/media/webm/WebMReader.cpp b/dom/media/webm/WebMReader.cpp
index ef2a0f869657..eafa1272d7c1 100644
--- a/dom/media/webm/WebMReader.cpp
+++ b/dom/media/webm/WebMReader.cpp
@@ -26,9 +26,8 @@
#include "OggReader.h"
// IntelWebMVideoDecoder uses the WMF backend, which is Windows Vista+ only.
-#if defined(MOZ_FMP4) && defined(MOZ_WMF)
+#if defined(MOZ_PDM_VPX)
#include "IntelWebMVideoDecoder.h"
-#define MOZ_PDM_VPX 1
#endif
// Un-comment to enable logging of seek bisections.
diff --git a/dom/media/webm/moz.build b/dom/media/webm/moz.build
index 7d0c586ccd8c..159752721c26 100644
--- a/dom/media/webm/moz.build
+++ b/dom/media/webm/moz.build
@@ -19,7 +19,8 @@ UNIFIED_SOURCES += [
'WebMReader.cpp',
]
-if CONFIG['MOZ_FMP4']:
+if CONFIG['MOZ_FMP4'] and CONFIG['MOZ_WMF']:
+ DEFINES['MOZ_PDM_VPX'] = True
UNIFIED_SOURCES += ['IntelWebMVideoDecoder.cpp']
if CONFIG['MOZ_WEBM_ENCODER']:
diff --git a/dom/security/nsCSPService.cpp b/dom/security/nsCSPService.cpp
index 0683e78db0d0..1b1f8638a102 100644
--- a/dom/security/nsCSPService.cpp
+++ b/dom/security/nsCSPService.cpp
@@ -47,6 +47,56 @@ CSPService::~CSPService()
NS_IMPL_ISUPPORTS(CSPService, nsIContentPolicy, nsIChannelEventSink)
+// Helper function to identify protocols not subject to CSP.
+bool
+subjectToCSP(nsIURI* aURI) {
+ // The three protocols: data:, blob: and filesystem: share the same
+ // protocol flag (URI_IS_LOCAL_RESOURCE) with other protocols, like
+ // chrome:, resource:, moz-icon:, but those three protocols get
+ // special attention in CSP and are subject to CSP, hence we have
+ // to make sure those protocols are subject to CSP, see:
+ // http://www.w3.org/TR/CSP2/#source-list-guid-matching
+ bool match = false;
+ nsresult rv = aURI->SchemeIs("data", &match);
+ if (NS_SUCCEEDED(rv) && match) {
+ return true;
+ }
+ rv = aURI->SchemeIs("blob", &match);
+ if (NS_SUCCEEDED(rv) && match) {
+ return true;
+ }
+ rv = aURI->SchemeIs("filesystem", &match);
+ if (NS_SUCCEEDED(rv) && match) {
+ return true;
+ }
+ // finally we have to whitelist "about:" which does not fall in
+ // any of the two categories underneath but is not subject to CSP.
+ rv = aURI->SchemeIs("about", &match);
+ if (NS_SUCCEEDED(rv) && match) {
+ return false;
+ }
+
+ // Other protocols are not subject to CSP and can be whitelisted:
+ // * URI_IS_LOCAL_RESOURCE
+ // e.g. chrome:, data:, blob:, resource:, moz-icon:
+ // * URI_INHERITS_SECURITY_CONTEXT
+ // e.g. javascript:
+ //
+ // Please note that it should be possible for websites to
+ // whitelist their own protocol handlers with respect to CSP,
+ // hence we use protocol flags to accomplish that.
+ rv = NS_URIChainHasFlags(aURI, nsIProtocolHandler::URI_IS_LOCAL_RESOURCE, &match);
+ if (NS_SUCCEEDED(rv) && match) {
+ return false;
+ }
+ rv = NS_URIChainHasFlags(aURI, nsIProtocolHandler::URI_INHERITS_SECURITY_CONTEXT, &match);
+ if (NS_SUCCEEDED(rv) && match) {
+ return false;
+ }
+ // all other protocols are subject To CSP.
+ return true;
+}
+
/* nsIContentPolicy implementation */
NS_IMETHODIMP
CSPService::ShouldLoad(uint32_t aContentType,
@@ -58,8 +108,9 @@ CSPService::ShouldLoad(uint32_t aContentType,
nsIPrincipal *aRequestPrincipal,
int16_t *aDecision)
{
- if (!aContentLocation)
+ if (!aContentLocation) {
return NS_ERROR_FAILURE;
+ }
#ifdef PR_LOGGING
{
@@ -73,26 +124,14 @@ CSPService::ShouldLoad(uint32_t aContentType,
// default decision, CSP can revise it if there's a policy to enforce
*aDecision = nsIContentPolicy::ACCEPT;
- // No need to continue processing if CSP is disabled
- if (!sCSPEnabled)
+ // No need to continue processing if CSP is disabled or if the protocol
+ // is *not* subject to CSP.
+ // Please note, the correct way to opt-out of CSP using a custom
+ // protocolHandler is to set one of the nsIProtocolHandler flags
+ // that are whitelistet in subjectToCSP()
+ if (!sCSPEnabled || !subjectToCSP(aContentLocation)) {
return NS_OK;
-
- // shortcut for about: chrome: and resource: and javascript: uris since
- // they're not subject to CSP content policy checks.
- bool schemeMatch = false;
- NS_ENSURE_SUCCESS(aContentLocation->SchemeIs("about", &schemeMatch), NS_OK);
- if (schemeMatch)
- return NS_OK;
- NS_ENSURE_SUCCESS(aContentLocation->SchemeIs("chrome", &schemeMatch), NS_OK);
- if (schemeMatch)
- return NS_OK;
- NS_ENSURE_SUCCESS(aContentLocation->SchemeIs("resource", &schemeMatch), NS_OK);
- if (schemeMatch)
- return NS_OK;
- NS_ENSURE_SUCCESS(aContentLocation->SchemeIs("javascript", &schemeMatch), NS_OK);
- if (schemeMatch)
- return NS_OK;
-
+ }
// These content types are not subject to CSP content policy checks:
// TYPE_CSP_REPORT -- csp can't block csp reports
diff --git a/editor/composer/nsEditorSpellCheck.cpp b/editor/composer/nsEditorSpellCheck.cpp
index 3190162f6468..467d0f61eb13 100644
--- a/editor/composer/nsEditorSpellCheck.cpp
+++ b/editor/composer/nsEditorSpellCheck.cpp
@@ -105,6 +105,23 @@ GetLoadContext(nsIEditor* aEditor)
return loadContext.forget();
}
+/**
+ * Helper function for converting underscore to dash in dictionary name,
+ * ie. en_CA to en-CA. This is required for some Linux distributions which
+ * use underscore as separator in system-wide installed dictionaries.
+ * We use it for nsStyleUtil::DashMatchCompare.
+ */
+static nsString
+GetDictNameWithDash(const nsAString& aDictName)
+{
+ nsString dictNameWithDash(aDictName);
+ int32_t underScore = dictNameWithDash.FindChar('_');
+ if (underScore != -1) {
+ dictNameWithDash.Replace(underScore, 1, '-');
+ }
+ return dictNameWithDash;
+}
+
/**
* Fetches the dictionary stored in content prefs and maintains state during the
* fetch, which is asynchronous.
@@ -603,8 +620,8 @@ nsEditorSpellCheck::SetCurrentDictionary(const nsAString& aDictionary)
} else {
langCode.Assign(aDictionary);
}
-
- if (mPreferredLang.IsEmpty() || !nsStyleUtil::DashMatchCompare(mPreferredLang, langCode, comparator)) {
+ if (mPreferredLang.IsEmpty() ||
+ !nsStyleUtil::DashMatchCompare(GetDictNameWithDash(mPreferredLang), langCode, comparator)) {
// When user sets dictionary manually, we store this value associated
// with editor url.
StoreCurrentDictionary(mEditor, aDictionary);
@@ -750,12 +767,6 @@ nsEditorSpellCheck::DictionaryFetched(DictionaryFetcher* aFetcher)
// otherwise, get language from preferences
nsAutoString preferedDict(Preferences::GetLocalizedString("spellchecker.dictionary"));
- // Replace '_' with '-' in case the user has an underscore stored in their
- // pref, see bug 992118 for how this could have happened.
- int32_t underScore = preferedDict.FindChar('_');
- if (underScore != -1) {
- preferedDict.Replace(underScore, 1, '-');
- }
if (dictName.IsEmpty()) {
dictName.Assign(preferedDict);
}
@@ -794,8 +805,8 @@ nsEditorSpellCheck::DictionaryFetched(DictionaryFetcher* aFetcher)
// try dictionary.spellchecker preference if it starts with langCode (and
// if we haven't tried it already)
- if (!preferedDict.IsEmpty() && !dictName.Equals(preferedDict) &&
- nsStyleUtil::DashMatchCompare(preferedDict, langCode, comparator)) {
+ if (!preferedDict.IsEmpty() && !dictName.Equals(preferedDict) &&
+ nsStyleUtil::DashMatchCompare(GetDictNameWithDash(preferedDict), langCode, comparator)) {
rv = SetCurrentDictionary(preferedDict);
}
@@ -823,8 +834,7 @@ nsEditorSpellCheck::DictionaryFetched(DictionaryFetcher* aFetcher)
// We have already tried it
continue;
}
-
- if (nsStyleUtil::DashMatchCompare(dictStr, langCode, comparator) &&
+ if (nsStyleUtil::DashMatchCompare(GetDictNameWithDash(dictStr), langCode, comparator) &&
NS_SUCCEEDED(SetCurrentDictionary(dictStr))) {
break;
}
diff --git a/gfx/2d/DrawTargetCG.cpp b/gfx/2d/DrawTargetCG.cpp
index 6510a8fb8e08..20dfaf705460 100644
--- a/gfx/2d/DrawTargetCG.cpp
+++ b/gfx/2d/DrawTargetCG.cpp
@@ -266,9 +266,9 @@ class UnboundnessFixer
{
CGRect mClipBounds;
CGLayerRef mLayer;
- CGContextRef mCg;
+ CGContextRef mLayerCg;
public:
- UnboundnessFixer() : mCg(nullptr) {}
+ UnboundnessFixer() : mLayerCg(nullptr) {}
CGContextRef Check(CGContextRef baseCg, CompositionOp blend, const Rect* maskBounds = nullptr)
{
@@ -287,14 +287,14 @@ class UnboundnessFixer
//XXX: The size here is in default user space units, of the layer relative to the graphics context.
// is the clip bounds still correct if, for example, we have a scale applied to the context?
mLayer = CGLayerCreateWithContext(baseCg, mClipBounds.size, nullptr);
- mCg = CGLayerGetContext(mLayer);
+ mLayerCg = CGLayerGetContext(mLayer);
// CGContext's default to have the origin at the bottom left
// so flip it to the top left and adjust for the origin
// of the layer
- CGContextTranslateCTM(mCg, -mClipBounds.origin.x, mClipBounds.origin.y + mClipBounds.size.height);
- CGContextScaleCTM(mCg, 1, -1);
+ CGContextTranslateCTM(mLayerCg, -mClipBounds.origin.x, mClipBounds.origin.y + mClipBounds.size.height);
+ CGContextScaleCTM(mLayerCg, 1, -1);
- return mCg;
+ return mLayerCg;
} else {
return baseCg;
}
@@ -302,12 +302,13 @@ class UnboundnessFixer
void Fix(CGContextRef baseCg)
{
- if (mCg) {
+ if (mLayerCg) {
+ // we pushed a layer so draw it to baseCg
CGContextTranslateCTM(baseCg, 0, mClipBounds.size.height);
CGContextScaleCTM(baseCg, 1, -1);
mClipBounds.origin.y *= -1;
CGContextDrawLayerAtPoint(baseCg, mClipBounds.origin, mLayer);
- CGContextRelease(mCg);
+ CGContextRelease(mLayerCg);
}
}
};
diff --git a/gfx/angle/src/commit.h b/gfx/angle/src/commit.h
index 8a951412c034..d221ae7291ed 100644
--- a/gfx/angle/src/commit.h
+++ b/gfx/angle/src/commit.h
@@ -1,3 +1,3 @@
-#define ANGLE_COMMIT_HASH "f0cacb827771"
+#define ANGLE_COMMIT_HASH "0fb6a60df77b"
#define ANGLE_COMMIT_HASH_SIZE 12
-#define ANGLE_COMMIT_DATE "2014-10-28 23:00:12 -0400"
+#define ANGLE_COMMIT_DATE "2014-11-28 13:56:37 -0500"
diff --git a/gfx/angle/src/common/NativeWindow.h b/gfx/angle/src/common/NativeWindow.h
index c5062789fd63..c0920a33d311 100644
--- a/gfx/angle/src/common/NativeWindow.h
+++ b/gfx/angle/src/common/NativeWindow.h
@@ -16,12 +16,14 @@
#include "common/debug.h"
#include "common/platform.h"
+#ifdef ANGLE_ENABLE_D3D11
// DXGISwapChain and DXGIFactory are typedef'd to specific required
// types. The HWND NativeWindow implementation requires IDXGISwapChain
// and IDXGIFactory and the Windows Store NativeWindow
// implementation requires IDXGISwapChain1 and IDXGIFactory2.
typedef IDXGISwapChain DXGISwapChain;
typedef IDXGIFactory DXGIFactory;
+#endif
namespace rx
{
@@ -37,9 +39,11 @@ class NativeWindow
inline bool getClientRect(LPRECT rect) { return GetClientRect(mWindow, rect) == TRUE; }
inline bool isIconic() { return IsIconic(mWindow) == TRUE; }
+#ifdef ANGLE_ENABLE_D3D11
HRESULT createSwapChain(ID3D11Device* device, DXGIFactory* factory,
DXGI_FORMAT format, UINT width, UINT height,
DXGISwapChain** swapChain);
+#endif
inline EGLNativeWindowType getNativeWindow() const { return mWindow; }
diff --git a/gfx/angle/src/common/win32/NativeWindow.cpp b/gfx/angle/src/common/win32/NativeWindow.cpp
index 403f9bc3e68a..07e80d97cece 100644
--- a/gfx/angle/src/common/win32/NativeWindow.cpp
+++ b/gfx/angle/src/common/win32/NativeWindow.cpp
@@ -20,6 +20,7 @@ NativeWindow::NativeWindow(EGLNativeWindowType window) : mWindow(window)
{
}
+#ifdef ANGLE_ENABLE_D3D11
HRESULT NativeWindow::createSwapChain(ID3D11Device* device, DXGIFactory* factory,
DXGI_FORMAT format, unsigned int width, unsigned int height,
DXGISwapChain** swapChain)
@@ -48,4 +49,5 @@ HRESULT NativeWindow::createSwapChain(ID3D11Device* device, DXGIFactory* factory
return factory->CreateSwapChain(device, &swapChainDesc, swapChain);
}
-};
\ No newline at end of file
+#endif
+};
diff --git a/gfx/layers/client/TiledContentClient.cpp b/gfx/layers/client/TiledContentClient.cpp
index 97bddf1c7340..9e65dff8ac11 100644
--- a/gfx/layers/client/TiledContentClient.cpp
+++ b/gfx/layers/client/TiledContentClient.cpp
@@ -987,6 +987,22 @@ void PadDrawTargetOutFromRegion(RefPtr drawTarget, nsIntRegion ®i
return x;
}
+ static void ensure_memcpy(uint8_t *dst, uint8_t *src, size_t n, uint8_t *bitmap, int stride, int height)
+ {
+ if (src + n > bitmap + stride*height) {
+ MOZ_CRASH("long src memcpy");
+ }
+ if (src < bitmap) {
+ MOZ_CRASH("short src memcpy");
+ }
+ if (dst + n > bitmap + stride*height) {
+ MOZ_CRASH("long dst mempcy");
+ }
+ if (dst < bitmap) {
+ MOZ_CRASH("short dst mempcy");
+ }
+ }
+
static void visitor(void *closure, VisitSide side, int x1, int y1, int x2, int y2) {
LockedBits *lb = static_cast(closure);
uint8_t *bitmap = lb->data;
@@ -999,12 +1015,14 @@ void PadDrawTargetOutFromRegion(RefPtr drawTarget, nsIntRegion ®i
if (y1 > 0) {
x1 = clamp(x1, 0, width - 1);
x2 = clamp(x2, 0, width - 1);
+ ensure_memcpy(&bitmap[x1*bpp + (y1-1) * stride], &bitmap[x1*bpp + y1 * stride], (x2 - x1) * bpp, bitmap, stride, height);
memcpy(&bitmap[x1*bpp + (y1-1) * stride], &bitmap[x1*bpp + y1 * stride], (x2 - x1) * bpp);
}
} else if (side == VisitSide::BOTTOM) {
if (y1 < height) {
x1 = clamp(x1, 0, width - 1);
x2 = clamp(x2, 0, width - 1);
+ ensure_memcpy(&bitmap[x1*bpp + y1 * stride], &bitmap[x1*bpp + (y1-1) * stride], (x2 - x1) * bpp, bitmap, stride, height);
memcpy(&bitmap[x1*bpp + y1 * stride], &bitmap[x1*bpp + (y1-1) * stride], (x2 - x1) * bpp);
}
} else if (side == VisitSide::LEFT) {
diff --git a/gfx/layers/composite/TextureHost.h b/gfx/layers/composite/TextureHost.h
index cf1fc47508ee..37ee46613aa7 100644
--- a/gfx/layers/composite/TextureHost.h
+++ b/gfx/layers/composite/TextureHost.h
@@ -86,13 +86,15 @@ public:
*
* This class is used on the compositor side.
*/
-class TextureSource
+class TextureSource: public RefCounted
{
public:
- NS_INLINE_DECL_REFCOUNTING(TextureSource)
+ MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(TextureSource)
TextureSource();
+ virtual ~TextureSource();
+
/**
* Should be overridden in order to deallocate the data that is associated
* with the rendering backend, such as GL textures.
@@ -159,7 +161,6 @@ public:
int NumCompositableRefs() const { return mCompositableCount; }
protected:
- virtual ~TextureSource();
RefPtr mNextSibling;
int mCompositableCount;
diff --git a/gfx/layers/d3d11/CompositorD3D11.cpp b/gfx/layers/d3d11/CompositorD3D11.cpp
index 2be4be291ba0..334a54f64124 100644
--- a/gfx/layers/d3d11/CompositorD3D11.cpp
+++ b/gfx/layers/d3d11/CompositorD3D11.cpp
@@ -938,7 +938,15 @@ CompositorD3D11::VerifyBufferSize()
return;
}
- mDefaultRT = nullptr;
+ if (mDefaultRT) {
+ // Make sure the texture, which belongs to the swapchain, is destroyed
+ // before resizing the swapchain.
+ if (mCurrentRT == mDefaultRT) {
+ mCurrentRT = nullptr;
+ }
+ MOZ_ASSERT(mDefaultRT->hasOneRef());
+ mDefaultRT = nullptr;
+ }
if (IsRunningInWindowsMetro()) {
hr = mSwapChain->ResizeBuffers(2, mSize.width, mSize.height,
diff --git a/js/src/gc/RootMarking.cpp b/js/src/gc/RootMarking.cpp
index 61a123d6ecc0..f1db475739a9 100644
--- a/js/src/gc/RootMarking.cpp
+++ b/js/src/gc/RootMarking.cpp
@@ -454,7 +454,7 @@ js::gc::GCRuntime::markRuntime(JSTracer *trc,
if (!c->zone()->isCollecting())
c->markCrossCompartmentWrappers(trc);
}
- Debugger::markCrossCompartmentDebuggerObjectReferents(trc);
+ Debugger::markAllCrossCompartmentEdges(trc);
}
AutoGCRooter::traceAll(trc);
diff --git a/js/src/jit/MCallOptimize.cpp b/js/src/jit/MCallOptimize.cpp
index 9e7787b45af8..62723531e007 100644
--- a/js/src/jit/MCallOptimize.cpp
+++ b/js/src/jit/MCallOptimize.cpp
@@ -550,14 +550,14 @@ IonBuilder::InliningStatus
IonBuilder::inlineArrayJoin(CallInfo &callInfo)
{
if (callInfo.argc() != 1 || callInfo.constructing())
- return InliningStatus_Error;
+ return InliningStatus_NotInlined;
if (getInlineReturnType() != MIRType_String)
- return InliningStatus_Error;
+ return InliningStatus_NotInlined;
if (callInfo.thisArg()->type() != MIRType_Object)
- return InliningStatus_Error;
+ return InliningStatus_NotInlined;
if (callInfo.getArg(0)->type() != MIRType_String)
- return InliningStatus_Error;
+ return InliningStatus_NotInlined;
callInfo.setImplicitlyUsedUnchecked();
diff --git a/js/src/jit/mips/MacroAssembler-mips.cpp b/js/src/jit/mips/MacroAssembler-mips.cpp
index d081e8b05059..bbed57fed9f7 100644
--- a/js/src/jit/mips/MacroAssembler-mips.cpp
+++ b/js/src/jit/mips/MacroAssembler-mips.cpp
@@ -2033,8 +2033,8 @@ MacroAssemblerMIPSCompat::store32(Register src, const Address &address)
void
MacroAssemblerMIPSCompat::store32(Imm32 src, const Address &address)
{
- move32(src, ScratchRegister);
- storePtr(ScratchRegister, address);
+ move32(src, SecondScratchReg);
+ storePtr(SecondScratchReg, address);
}
void
@@ -2053,8 +2053,8 @@ template
void
MacroAssemblerMIPSCompat::storePtr(ImmWord imm, T address)
{
- ma_li(ScratchRegister, Imm32(imm.value));
- ma_sw(ScratchRegister, address);
+ ma_li(SecondScratchReg, Imm32(imm.value));
+ ma_sw(SecondScratchReg, address);
}
template void MacroAssemblerMIPSCompat::storePtr(ImmWord imm, Address address);
@@ -2074,8 +2074,8 @@ template
void
MacroAssemblerMIPSCompat::storePtr(ImmGCPtr imm, T address)
{
- ma_li(ScratchRegister, imm);
- ma_sw(ScratchRegister, address);
+ ma_li(SecondScratchReg, imm);
+ ma_sw(SecondScratchReg, address);
}
template void MacroAssemblerMIPSCompat::storePtr(ImmGCPtr imm, Address address);
diff --git a/js/src/jit/shared/Assembler-x86-shared.h b/js/src/jit/shared/Assembler-x86-shared.h
index c9939ee672f1..6821aa98be57 100644
--- a/js/src/jit/shared/Assembler-x86-shared.h
+++ b/js/src/jit/shared/Assembler-x86-shared.h
@@ -1675,36 +1675,36 @@ class AssemblerX86Shared : public AssemblerShared
MOZ_CRASH("unexpected operand kind");
}
}
- void cmpps(const Operand &src, FloatRegister dest, uint8_t order) {
+ void cmpps(uint8_t order, const Operand &src, FloatRegister dest) {
MOZ_ASSERT(HasSSE2());
switch (src.kind()) {
case Operand::FPREG:
- masm.cmpps_rr(src.fpu(), dest.code(), order);
+ masm.cmpps_rr(order, src.fpu(), dest.code());
break;
case Operand::MEM_REG_DISP:
- masm.cmpps_mr(src.disp(), src.base(), dest.code(), order);
+ masm.cmpps_mr(order, src.disp(), src.base(), dest.code());
break;
case Operand::MEM_ADDRESS32:
- masm.cmpps_mr(src.address(), dest.code(), order);
+ masm.cmpps_mr(order, src.address(), dest.code());
break;
default:
MOZ_CRASH("unexpected operand kind");
}
}
void cmpeqps(const Operand &src, FloatRegister dest) {
- cmpps(src, dest, X86Assembler::ConditionCmp_EQ);
+ cmpps(X86Assembler::ConditionCmp_EQ, src, dest);
}
void cmpltps(const Operand &src, FloatRegister dest) {
- cmpps(src, dest, X86Assembler::ConditionCmp_LT);
+ cmpps(X86Assembler::ConditionCmp_LT, src, dest);
}
void cmpleps(const Operand &src, FloatRegister dest) {
- cmpps(src, dest, X86Assembler::ConditionCmp_LE);
+ cmpps(X86Assembler::ConditionCmp_LE, src, dest);
}
void cmpunordps(const Operand &src, FloatRegister dest) {
- cmpps(src, dest, X86Assembler::ConditionCmp_UNORD);
+ cmpps(X86Assembler::ConditionCmp_UNORD, src, dest);
}
void cmpneqps(const Operand &src, FloatRegister dest) {
- cmpps(src, dest, X86Assembler::ConditionCmp_NEQ);
+ cmpps(X86Assembler::ConditionCmp_NEQ, src, dest);
}
void rcpps(const Operand &src, FloatRegister dest) {
MOZ_ASSERT(HasSSE2());
@@ -2173,13 +2173,13 @@ class AssemblerX86Shared : public AssemblerShared
MOZ_ASSERT(HasSSE2());
masm.sqrtss_rr(src.code(), dest.code());
}
- void roundsd(FloatRegister src, FloatRegister dest, X86Assembler::RoundingMode mode) {
+ void roundsd(X86Assembler::RoundingMode mode, FloatRegister src, FloatRegister dest) {
MOZ_ASSERT(HasSSE41());
- masm.roundsd_rr(src.code(), dest.code(), mode);
+ masm.roundsd_rr(mode, src.code(), dest.code());
}
- void roundss(FloatRegister src, FloatRegister dest, X86Assembler::RoundingMode mode) {
+ void roundss(X86Assembler::RoundingMode mode, FloatRegister src, FloatRegister dest) {
MOZ_ASSERT(HasSSE41());
- masm.roundss_rr(src.code(), dest.code(), mode);
+ masm.roundss_rr(mode, src.code(), dest.code());
}
unsigned insertpsMask(SimdLane sourceLane, SimdLane destLane, unsigned zeroMask = 0)
{
diff --git a/js/src/jit/shared/BaseAssembler-x86-shared.h b/js/src/jit/shared/BaseAssembler-x86-shared.h
index 61a68b3fc690..ebcaa73bb04a 100644
--- a/js/src/jit/shared/BaseAssembler-x86-shared.h
+++ b/js/src/jit/shared/BaseAssembler-x86-shared.h
@@ -269,7 +269,7 @@ private:
OP_GROUP1_EvIb = 0x83,
OP_TEST_EbGb = 0x84,
OP_TEST_EvGv = 0x85,
- OP_XCHG_EvGv = 0x87,
+ OP_XCHG_GvEv = 0x87,
OP_MOV_EbGv = 0x88,
OP_MOV_EvGv = 0x89,
OP_MOV_GvEb = 0x8A,
@@ -554,13 +554,13 @@ public:
void push_m(int offset, RegisterID base)
{
spew("push %s0x%x(%s)", PRETTY_PRINT_OFFSET(offset), nameIReg(base));
- m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_PUSH, base, offset);
+ m_formatter.oneByteOp(OP_GROUP5_Ev, offset, base, GROUP5_OP_PUSH);
}
void pop_m(int offset, RegisterID base)
{
spew("pop %s0x%x(%s)", PRETTY_PRINT_OFFSET(offset), nameIReg(base));
- m_formatter.oneByteOp(OP_GROUP1A_Ev, GROUP1A_OP_POP, base, offset);
+ m_formatter.oneByteOp(OP_GROUP1A_Ev, offset, base, GROUP1A_OP_POP);
}
void push_flags()
@@ -582,10 +582,10 @@ public:
{
FIXME_INSN_PRINTING;
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADC, addr);
+ m_formatter.oneByteOp(OP_GROUP1_EvIb, addr, GROUP1_OP_ADC);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_ADC, addr);
+ m_formatter.oneByteOp(OP_GROUP1_EvIz, addr, GROUP1_OP_ADC);
m_formatter.immediate32(imm);
}
}
@@ -594,31 +594,31 @@ public:
void addl_rr(RegisterID src, RegisterID dst)
{
spew("addl %s, %s", nameIReg(4,src), nameIReg(4,dst));
- m_formatter.oneByteOp(OP_ADD_EvGv, src, dst);
+ m_formatter.oneByteOp(OP_ADD_GvEv, src, dst);
}
void addl_mr(int offset, RegisterID base, RegisterID dst)
{
spew("addl %s0x%x(%s), %s",
PRETTY_PRINT_OFFSET(offset), nameIReg(base), nameIReg(4,dst));
- m_formatter.oneByteOp(OP_ADD_GvEv, dst, base, offset);
+ m_formatter.oneByteOp(OP_ADD_GvEv, offset, base, dst);
}
void addl_rm(RegisterID src, int offset, RegisterID base)
{
spew("addl %s, %s0x%x(%s)",
nameIReg(4,src), PRETTY_PRINT_OFFSET(offset), nameIReg(base));
- m_formatter.oneByteOp(OP_ADD_EvGv, src, base, offset);
+ m_formatter.oneByteOp(OP_ADD_EvGv, offset, base, src);
}
void addl_ir(int imm, RegisterID dst)
{
spew("addl $0x%x, %s", imm, nameIReg(4,dst));
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADD, dst);
+ m_formatter.oneByteOp(OP_GROUP1_EvIb, dst, GROUP1_OP_ADD);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_ADD, dst);
+ m_formatter.oneByteOp(OP_GROUP1_EvIz, dst, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
}
@@ -626,7 +626,7 @@ public:
{
// 32-bit immediate always, for patching.
spew("addl $0x%x, %s", imm, nameIReg(4,dst));
- m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_ADD, dst);
+ m_formatter.oneByteOp(OP_GROUP1_EvIz, dst, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
@@ -635,10 +635,10 @@ public:
spew("addl $%d, %s0x%x(%s)",
imm, PRETTY_PRINT_OFFSET(offset), nameIReg(base));
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADD, base, offset);
+ m_formatter.oneByteOp(OP_GROUP1_EvIb, offset, base, GROUP1_OP_ADD);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_ADD, base, offset);
+ m_formatter.oneByteOp(OP_GROUP1_EvIz, offset, base, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
}
@@ -647,30 +647,30 @@ public:
void addq_rr(RegisterID src, RegisterID dst)
{
spew("addq %s, %s", nameIReg(8,src), nameIReg(8,dst));
- m_formatter.oneByteOp64(OP_ADD_EvGv, src, dst);
+ m_formatter.oneByteOp64(OP_ADD_GvEv, src, dst);
}
void addq_mr(int offset, RegisterID base, RegisterID dst)
{
spew("addq %s0x%x(%s), %s",
PRETTY_PRINT_OFFSET(offset), nameIReg(8,base), nameIReg(8,dst));
- m_formatter.oneByteOp64(OP_ADD_GvEv, dst, base, offset);
+ m_formatter.oneByteOp64(OP_ADD_GvEv, offset, base, dst);
}
void addq_mr(const void* addr, RegisterID dst)
{
spew("addq %p, %s", addr, nameIReg(8, dst));
- m_formatter.oneByteOp64(OP_ADD_GvEv, dst, addr);
+ m_formatter.oneByteOp64(OP_ADD_GvEv, addr, dst);
}
void addq_ir(int imm, RegisterID dst)
{
spew("addq $0x%x, %s", imm, nameIReg(8,dst));
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_ADD, dst);
+ m_formatter.oneByteOp64(OP_GROUP1_EvIb, dst, GROUP1_OP_ADD);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_ADD, dst);
+ m_formatter.oneByteOp64(OP_GROUP1_EvIz, dst, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
}
@@ -680,34 +680,34 @@ public:
spew("addq $0x%x, %s0x%x(%s)",
imm, PRETTY_PRINT_OFFSET(offset), nameIReg(8,base));
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_ADD, base, offset);
+ m_formatter.oneByteOp64(OP_GROUP1_EvIb, offset, base, GROUP1_OP_ADD);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_ADD, base, offset);
+ m_formatter.oneByteOp64(OP_GROUP1_EvIz, offset, base, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
}
void addq_im(int imm, const void* addr)
{
- spew("addq %d, %p", imm, addr);
+ spew("addq $%d, %p", imm, addr);
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_ADD, addr);
+ m_formatter.oneByteOp64(OP_GROUP1_EvIb, addr, GROUP1_OP_ADD);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_ADD, addr);
+ m_formatter.oneByteOp64(OP_GROUP1_EvIz, addr, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
}
#endif
void addl_im(int imm, const void* addr)
{
- spew("addl %d, %p", imm, addr);
+ spew("addl $%d, %p", imm, addr);
if (CAN_SIGN_EXTEND_8_32(imm)) {
- m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADD, addr);
+ m_formatter.oneByteOp(OP_GROUP1_EvIb, addr, GROUP1_OP_ADD);
m_formatter.immediate8(imm);
} else {
- m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_ADD, addr);
+ m_formatter.oneByteOp(OP_GROUP1_EvIz, addr, GROUP1_OP_ADD);
m_formatter.immediate32(imm);
}
}
@@ -717,7 +717,7 @@ public:
spew("lock xaddl %s, %s0x%x(%s)",
nameIReg(1, srcdest), PRETTY_PRINT_OFFSET(offset), nameIReg(base));
m_formatter.oneByteOp(PRE_LOCK);
- m_formatter.twoByteOp(OP2_XADD_EbGb, srcdest, base, offset);
+ m_formatter.twoByteOp(OP2_XADD_EbGb, offset, base, srcdest);
}
void lock_xaddb_rm(RegisterID srcdest, int offset, RegisterID base, RegisterID index, int scale)
@@ -726,7 +726,7 @@ public:
nameIReg(1, srcdest), PRETTY_PRINT_OFFSET(offset),
nameIReg(base), nameIReg(index), 1<snapshot()))
return false;
@@ -1751,7 +1751,7 @@ CodeGeneratorX86Shared::visitFloorF(LFloorF *lir)
return false;
// Round toward -Infinity.
- masm.roundss(input, scratch, X86Assembler::RoundDown);
+ masm.roundss(X86Assembler::RoundDown, input, scratch);
if (!bailoutCvttss2si(scratch, output, lir->snapshot()))
return false;
@@ -1822,7 +1822,7 @@ CodeGeneratorX86Shared::visitCeil(LCeil *lir)
// x <= -1 or x > -0
masm.bind(&lessThanMinusOne);
// Round toward +Infinity.
- masm.roundsd(input, scratch, X86Assembler::RoundUp);
+ masm.roundsd(X86Assembler::RoundUp, input, scratch);
return bailoutCvttsd2si(scratch, output, lir->snapshot());
}
@@ -1878,7 +1878,7 @@ CodeGeneratorX86Shared::visitCeilF(LCeilF *lir)
// x <= -1 or x > -0
masm.bind(&lessThanMinusOne);
// Round toward +Infinity.
- masm.roundss(input, scratch, X86Assembler::RoundUp);
+ masm.roundss(X86Assembler::RoundUp, input, scratch);
return bailoutCvttss2si(scratch, output, lir->snapshot());
}
@@ -1958,7 +1958,7 @@ CodeGeneratorX86Shared::visitRound(LRound *lir)
// Add 0.5 and round toward -Infinity. The result is stored in the temp
// register (currently contains 0.5).
masm.addsd(input, temp);
- masm.roundsd(temp, scratch, X86Assembler::RoundDown);
+ masm.roundsd(X86Assembler::RoundDown, temp, scratch);
// Truncate.
if (!bailoutCvttsd2si(scratch, output, lir->snapshot()))
@@ -2049,7 +2049,7 @@ CodeGeneratorX86Shared::visitRoundF(LRoundF *lir)
// Add 0.5 and round toward -Infinity. The result is stored in the temp
// register (currently contains 0.5).
masm.addss(input, temp);
- masm.roundss(temp, scratch, X86Assembler::RoundDown);
+ masm.roundss(X86Assembler::RoundDown, temp, scratch);
// Truncate.
if (!bailoutCvttss2si(scratch, output, lir->snapshot()))
diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp
index 28d39562ebf5..cc29f566874e 100644
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -2082,20 +2082,6 @@ size_t ArenaHeader::countUsedCells()
return Arena::thingsPerArena(getThingSize()) - countFreeCells();
}
-/*
- * Iterate throught the list and count the number of cells used.
- *
- * We may be able to precalculate this while sweeping and store the result
- * somewhere.
- */
-size_t ArenaList::countUsedCells()
-{
- size_t count = 0;
- for (ArenaHeader *arena = head_; arena; arena = arena->next)
- count += arena->countUsedCells();
- return count;
-}
-
ArenaHeader *
ArenaList::removeRemainingArenas(ArenaHeader **arenap, const AutoLockGC &lock)
{
@@ -2153,7 +2139,12 @@ ArenaList::pickArenasToRelocate(JSRuntime *runtime)
ArenaHeader **arenap = cursorp_; // Next arena to consider
size_t previousFreeCells = 0; // Count of free cells before
- size_t followingUsedCells = countUsedCells(); // Count of used cells after
+
+ // Count of used cells after arenap.
+ size_t followingUsedCells = 0;
+ for (ArenaHeader *arena = *arenap; arena; arena = arena->next)
+ followingUsedCells += arena->countUsedCells();
+
mozilla::DebugOnly lastFreeCells(0);
size_t cellsPerArena = Arena::thingsPerArena((*arenap)->getThingSize());
@@ -2662,7 +2653,7 @@ GCRuntime::updatePointersToRelocatedCells()
// Mark roots to update them.
markRuntime(&trc, MarkRuntime);
Debugger::markAll(&trc);
- Debugger::markCrossCompartmentDebuggerObjectReferents(&trc);
+ Debugger::markAllCrossCompartmentEdges(&trc);
for (GCCompartmentsIter c(rt); !c.done(); c.next()) {
WeakMapBase::markAll(c, &trc);
diff --git a/js/src/jsgc.h b/js/src/jsgc.h
index 8e8661ab5f8e..05f58ca33962 100644
--- a/js/src/jsgc.h
+++ b/js/src/jsgc.h
@@ -503,7 +503,6 @@ class ArenaList {
}
#ifdef JSGC_COMPACTING
- size_t countUsedCells();
ArenaHeader *removeRemainingArenas(ArenaHeader **arenap, const AutoLockGC &lock);
ArenaHeader *pickArenasToRelocate(JSRuntime *runtime);
ArenaHeader *relocateArenas(ArenaHeader *toRelocate, ArenaHeader *relocated);
diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp
index 9a62ec31faba..67383307af2a 100644
--- a/js/src/vm/Debugger.cpp
+++ b/js/src/vm/Debugger.cpp
@@ -93,6 +93,11 @@ enum {
JSSLOT_DEBUGSOURCE_COUNT
};
+void DebuggerObject_trace(JSTracer *trc, JSObject *obj);
+void DebuggerEnv_trace(JSTracer *trc, JSObject *obj);
+void DebuggerScript_trace(JSTracer *trc, JSObject *obj);
+void DebuggerSource_trace(JSTracer *trc, JSObject *obj);
+
/*** Utils ***************************************************************************************/
@@ -2073,17 +2078,12 @@ Debugger::setObservesAllExecution(JSContext *cx, IsObserving observing)
/*** Debugger JSObjects **************************************************************************/
void
-Debugger::markKeysInCompartment(JSTracer *trc)
+Debugger::markCrossCompartmentEdges(JSTracer *trc)
{
- /*
- * WeakMap::Range is deliberately private, to discourage C++ code from
- * enumerating WeakMap keys. However in this case we need access, so we
- * make a base-class reference. Range is public in HashMap.
- */
- objects.markKeys(trc);
- environments.markKeys(trc);
- scripts.markKeys(trc);
- sources.markKeys(trc);
+ objects.markCrossCompartmentEdges(trc);
+ environments.markCrossCompartmentEdges(trc);
+ scripts.markCrossCompartmentEdges(trc);
+ sources.markCrossCompartmentEdges(trc);
}
/*
@@ -2091,35 +2091,30 @@ Debugger::markKeysInCompartment(JSTracer *trc)
* discovered that the WeakMap was live; that is, some object containing the
* WeakMap was marked during mark phase.
*
- * However, during compartment GC, we have to do something about
- * cross-compartment WeakMaps in non-GC'd compartments. If their keys and values
- * might need to be marked, we have to do it manually.
+ * However, during zone GC, we have to do something about cross-compartment
+ * edges in non-GC'd compartments. Since the source may be live, we
+ * conservatively assume it is and mark the edge.
*
- * Each Debugger object keeps found cross-compartment WeakMaps: objects, scripts,
- * script source objects, and environments. They have the nice property that all
- * their values are in the same compartment as the Debugger object, so we only
- * need to mark the keys. We must simply mark all keys that are in a compartment
- * being GC'd.
+ * Each Debugger object keeps four cross-compartment WeakMaps: objects, scripts,
+ * script source objects, and environments. They have the property that all
+ * their values are in the same compartment as the Debugger object, but we have
+ * to mark the keys and the private pointer in the wrapper object.
*
- * We must scan all Debugger objects regardless of whether they *currently*
- * have any debuggees in a compartment being GC'd, because the WeakMap
- * entries persist even when debuggees are removed.
+ * We must scan all Debugger objects regardless of whether they *currently* have
+ * any debuggees in a compartment being GC'd, because the WeakMap entries
+ * persist even when debuggees are removed.
*
* This happens during the initial mark phase, not iterative marking, because
* all the edges being reported here are strong references.
*/
/* static */ void
-Debugger::markCrossCompartmentDebuggerObjectReferents(JSTracer *trc)
+Debugger::markAllCrossCompartmentEdges(JSTracer *trc)
{
JSRuntime *rt = trc->runtime();
- /*
- * Mark all objects in comp that are referents of Debugger.Objects in other
- * compartments.
- */
for (Debugger *dbg = rt->debuggerList.getFirst(); dbg; dbg = dbg->getNext()) {
if (!dbg->object->zone()->isCollecting())
- dbg->markKeysInCompartment(trc);
+ dbg->markCrossCompartmentEdges(trc);
}
}
@@ -2213,7 +2208,6 @@ Debugger::markAll(JSTracer *trc)
GlobalObjectSet &debuggees = dbg->debuggees;
for (GlobalObjectSet::Enum e(debuggees); !e.empty(); e.popFront()) {
GlobalObject *global = e.front();
-
MarkObjectUnbarriered(trc, &global, "Global Object");
if (global != e.front())
e.rekeyFront(global);
@@ -3814,7 +3808,7 @@ GetScriptReferent(JSObject *obj)
return static_cast(obj->as().getPrivate());
}
-static void
+void
DebuggerScript_trace(JSTracer *trc, JSObject *obj)
{
/* This comes from a private pointer, so no barrier needed. */
@@ -4765,7 +4759,7 @@ GetSourceReferent(JSObject *obj)
return static_cast(obj->as().getPrivate());
}
-static void
+void
DebuggerSource_trace(JSTracer *trc, JSObject *obj)
{
/*
@@ -5845,7 +5839,7 @@ static const JSFunctionSpec DebuggerFrame_methods[] = {
/*** Debugger.Object *****************************************************************************/
-static void
+void
DebuggerObject_trace(JSTracer *trc, JSObject *obj)
{
/*
@@ -6753,7 +6747,7 @@ static const JSFunctionSpec DebuggerObject_methods[] = {
/*** Debugger.Environment ************************************************************************/
-static void
+void
DebuggerEnv_trace(JSTracer *trc, JSObject *obj)
{
/*
diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h
index 04ef22ce4305..7748fa0b8241 100644
--- a/js/src/vm/Debugger.h
+++ b/js/src/vm/Debugger.h
@@ -36,10 +36,9 @@ class Breakpoint;
class DebuggerMemory;
/*
- * A weakmap that supports the keys being in different compartments to the
- * values, although all values must be in the same compartment.
- *
- * The Key and Value classes must support the compartment() method.
+ * A weakmap from GC thing keys to JSObject values that supports the keys being
+ * in different compartments to the values. All values must be in the same
+ * compartment.
*
* The purpose of this is to allow the garbage collector to easily find edges
* from debugee object compartments to debugger compartments when calculating
@@ -55,10 +54,13 @@ class DebuggerMemory;
* debugger compartments. If it is false, we assert that such entries are never
* created.
*/
-template
-class DebuggerWeakMap : private WeakMap >
+template
+class DebuggerWeakMap : private WeakMap, RelocatablePtrObject>
{
private:
+ typedef PreBarriered Key;
+ typedef RelocatablePtrObject Value;
+
typedef HashMap,
@@ -112,8 +114,10 @@ class DebuggerWeakMap : private WeakMap >
}
public:
- void markKeys(JSTracer *tracer) {
+ template
+ void markCrossCompartmentEdges(JSTracer *tracer) {
for (Enum e(*static_cast(this)); !e.empty(); e.popFront()) {
+ traceValueEdges(tracer, e.front().value());
Key key = e.front().key();
gc::Mark(tracer, &key, "Debugger WeakMap key");
if (key != e.front().key())
@@ -282,15 +286,15 @@ class Debugger : private mozilla::LinkedListElement
FrameMap frames;
/* An ephemeral map from JSScript* to Debugger.Script instances. */
- typedef DebuggerWeakMap ScriptWeakMap;
+ typedef DebuggerWeakMap ScriptWeakMap;
ScriptWeakMap scripts;
/* The map from debuggee source script objects to their Debugger.Source instances. */
- typedef DebuggerWeakMap SourceWeakMap;
+ typedef DebuggerWeakMap SourceWeakMap;
SourceWeakMap sources;
/* The map from debuggee objects to their Debugger.Object instances. */
- typedef DebuggerWeakMap ObjectWeakMap;
+ typedef DebuggerWeakMap ObjectWeakMap;
ObjectWeakMap objects;
/* The map from debuggee Envs to Debugger.Environment instances. */
@@ -356,7 +360,7 @@ class Debugger : private mozilla::LinkedListElement
static void traceObject(JSTracer *trc, JSObject *obj);
void trace(JSTracer *trc);
static void finalize(FreeOp *fop, JSObject *obj);
- void markKeysInCompartment(JSTracer *tracer);
+ void markCrossCompartmentEdges(JSTracer *tracer);
static const Class jsclass;
@@ -506,7 +510,7 @@ class Debugger : private mozilla::LinkedListElement
* Debugger objects that are definitely live but not yet marked, it marks
* them and returns true. If not, it returns false.
*/
- static void markCrossCompartmentDebuggerObjectReferents(JSTracer *tracer);
+ static void markAllCrossCompartmentEdges(JSTracer *tracer);
static bool markAllIteratively(GCMarker *trc);
static void markAll(JSTracer *trc);
static void sweepAll(FreeOp *fop);
diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp
index e44405cd7e52..2aac1c38a0d1 100644
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -3382,13 +3382,16 @@ PropertyProvider::SetupJustificationSpacing(bool aPostReflow)
return;
}
+ // Remember that textrun measurements are in the run's orientation,
+ // so its advance "width" is actually a height in vertical writing modes,
+ // corresponding to the inline-direction of the frame.
gfxFloat naturalWidth =
mTextRun->GetAdvanceWidth(mStart.GetSkippedOffset(),
GetSkippedDistance(mStart, realEnd), this);
if (mFrame->GetStateBits() & TEXT_HYPHEN_BREAK) {
naturalWidth += GetHyphenWidth();
}
- mJustificationSpacing = mFrame->GetSize().width - naturalWidth;
+ mJustificationSpacing = mFrame->ISize() - naturalWidth;
if (mJustificationSpacing <= 0) {
// No space available
return;
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index 7b9b765f6183..848c2695f776 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -7295,7 +7295,7 @@ var RemoteDebugger = {
_start: function rd_start() {
try {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(this._showConnectionPrompt.bind(this));
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
DebuggerServer.registerModule("resource://gre/modules/dbg-browser-actors.js");
}
@@ -7303,7 +7303,8 @@ var RemoteDebugger = {
let pathOrPort = this._getPath();
if (!pathOrPort)
pathOrPort = this._getPort();
- DebuggerServer.openListener(pathOrPort);
+ let listener = DebuggerServer.openListener(pathOrPort);
+ listener.allowConnection = this._showConnectionPrompt.bind(this);
dump("Remote debugger listening at path " + pathOrPort);
} catch(e) {
dump("Remote debugger didn't start: " + e);
diff --git a/security/manager/ssl/src/nsNSSIOLayer.cpp b/security/manager/ssl/src/nsNSSIOLayer.cpp
index 3af7ae55b85b..0f9ba97defd0 100644
--- a/security/manager/ssl/src/nsNSSIOLayer.cpp
+++ b/security/manager/ssl/src/nsNSSIOLayer.cpp
@@ -1172,7 +1172,6 @@ uint32_t tlsIntoleranceTelemetryBucket(PRErrorCode err)
case SSL_ERROR_NO_CYPHER_OVERLAP: return 7;
case SSL_ERROR_BAD_SERVER: return 8;
case SSL_ERROR_BAD_BLOCK_PADDING: return 9;
- case SSL_ERROR_UNSUPPORTED_VERSION: return 10;
case SSL_ERROR_PROTOCOL_VERSION_ALERT: return 11;
case SSL_ERROR_RX_MALFORMED_FINISHED: return 12;
case SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE: return 13;
diff --git a/testing/marionette/client/setup.py b/testing/marionette/client/setup.py
index 9c678b3c62d7..6c9635dc76b0 100644
--- a/testing/marionette/client/setup.py
+++ b/testing/marionette/client/setup.py
@@ -2,7 +2,7 @@ import os
from setuptools import setup, find_packages
import sys
-version = '0.8.4'
+version = '0.8.5'
# dependencies
with open('requirements.txt') as f:
diff --git a/testing/mozbase/mozversion/setup.py b/testing/mozbase/mozversion/setup.py
index caa55b9fcc9b..2cfbc449e98b 100644
--- a/testing/mozbase/mozversion/setup.py
+++ b/testing/mozbase/mozversion/setup.py
@@ -4,7 +4,7 @@
from setuptools import setup
-PACKAGE_VERSION = '1.0'
+PACKAGE_VERSION = '1.1'
dependencies = ['mozdevice >= 0.44',
'mozfile >= 1.0',
diff --git a/testing/xpcshell/head.js b/testing/xpcshell/head.js
index f90909bb7123..2091489ae00b 100644
--- a/testing/xpcshell/head.js
+++ b/testing/xpcshell/head.js
@@ -354,7 +354,7 @@ function _initDebugging(port) {
}
let {DebuggerServer} = Components.utils.import('resource://gre/modules/devtools/dbg-server.jsm', {});
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
DebuggerServer.addActors("resource://testing-common/dbg-actors.js");
@@ -406,7 +406,8 @@ function _initDebugging(port) {
do_print("*******************************************************************");
do_print("")
- DebuggerServer.openListener(port);
+ let listener = DebuggerServer.openListener(port);
+ listener.allowConnection = () => true;
// spin an event loop until the debugger connects.
let thr = Components.classes["@mozilla.org/thread-manager;1"]
diff --git a/toolkit/devtools/apps/tests/debugger-protocol-helper.js b/toolkit/devtools/apps/tests/debugger-protocol-helper.js
index db00b28043b2..42c8b53281f1 100644
--- a/toolkit/devtools/apps/tests/debugger-protocol-helper.js
+++ b/toolkit/devtools/apps/tests/debugger-protocol-helper.js
@@ -28,14 +28,14 @@ function connect(onDone) {
let observer = {
observe: function (subject, topic, data) {
Services.obs.removeObserver(observer, "debugger-server-started");
- let transport = debuggerSocketConnect("127.0.0.1", 6000);
+ let transport = DebuggerClient.socketConnect("127.0.0.1", 6000);
startClient(transport, onDone);
}
};
Services.obs.addObserver(observer, "debugger-server-started", false);
} else {
// Initialize a loopback remote protocol connection
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
// We need to register browser actors to have `listTabs` working
// and also have a root actor
DebuggerServer.addBrowserActors();
diff --git a/toolkit/devtools/apps/tests/unit/head_apps.js b/toolkit/devtools/apps/tests/unit/head_apps.js
index d71869c5d9a5..b726224b15c6 100644
--- a/toolkit/devtools/apps/tests/unit/head_apps.js
+++ b/toolkit/devtools/apps/tests/unit/head_apps.js
@@ -21,7 +21,7 @@ let gClient, gActor, gActorFront;
function connect(onDone) {
// Initialize a loopback remote protocol connection
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
// We need to register browser actors to have `listTabs` working
// and also have a root actor
DebuggerServer.addBrowserActors();
diff --git a/toolkit/devtools/client/connection-manager.js b/toolkit/devtools/client/connection-manager.js
index d0513ee706c2..2ae8d25f96f2 100644
--- a/toolkit/devtools/client/connection-manager.js
+++ b/toolkit/devtools/client/connection-manager.js
@@ -231,10 +231,10 @@ Connection.prototype = {
transport = DebuggerServer.connectPipe();
} else {
try {
- transport = debuggerSocketConnect(this.host, this.port);
+ transport = DebuggerClient.socketConnect(this.host, this.port);
} catch (e) {
// In some cases, especially on Mac, the openOutputStream call in
- // debuggerSocketConnect may throw NS_ERROR_NOT_INITIALIZED.
+ // DebuggerClient.socketConnect may throw NS_ERROR_NOT_INITIALIZED.
// It occurs when we connect agressively to the simulator,
// and keep trying to open a socket to the server being started in
// the simulator.
@@ -299,4 +299,3 @@ Connection.prototype = {
exports.ConnectionManager = ConnectionManager;
exports.Connection = Connection;
-
diff --git a/toolkit/devtools/client/dbg-client.jsm b/toolkit/devtools/client/dbg-client.jsm
index 59fcb0085afb..e755f0f652ab 100644
--- a/toolkit/devtools/client/dbg-client.jsm
+++ b/toolkit/devtools/client/dbg-client.jsm
@@ -21,7 +21,6 @@ this.CC = CC;
this.EXPORTED_SYMBOLS = ["DebuggerTransport",
"DebuggerClient",
"RootClient",
- "debuggerSocketConnect",
"LongStringClient",
"EnvironmentClient",
"ObjectClient"];
@@ -33,10 +32,6 @@ Cu.import("resource://gre/modules/Services.jsm");
let promise = Cu.import("resource://gre/modules/devtools/deprecated-sync-thenables.js").Promise;
const { defer, resolve, reject } = promise;
-XPCOMUtils.defineLazyServiceGetter(this, "socketTransportService",
- "@mozilla.org/network/socket-transport-service;1",
- "nsISocketTransportService");
-
XPCOMUtils.defineLazyModuleGetter(this, "console",
"resource://gre/modules/devtools/Console.jsm");
@@ -84,6 +79,11 @@ let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader);
loader.loadSubScript("resource://gre/modules/devtools/transport/transport.js", this);
+DevToolsUtils.defineLazyGetter(this, "DebuggerSocket", () => {
+ let { DebuggerSocket } = devtools.require("devtools/toolkit/security/socket");
+ return DebuggerSocket;
+});
+
/**
* TODO: Get rid of this API in favor of EventTarget (bug 1042642)
*
@@ -371,6 +371,12 @@ DebuggerClient.Argument.prototype.getArgument = function (aParams) {
return aParams[this.position];
};
+// Expose this to save callers the trouble of importing DebuggerSocket
+DebuggerClient.socketConnect = function(host, port) {
+ // Defined here instead of just copying the function to allow lazy-load
+ return DebuggerSocket.connect(host, port);
+};
+
DebuggerClient.prototype = {
/**
* Connect to the server and start exchanging protocol messages.
@@ -2578,33 +2584,3 @@ EnvironmentClient.prototype = {
};
eventSource(EnvironmentClient.prototype);
-
-/**
- * Connects to a debugger server socket and returns a DebuggerTransport.
- *
- * @param aHost string
- * The host name or IP address of the debugger server.
- * @param aPort number
- * The port number of the debugger server.
- */
-this.debuggerSocketConnect = function (aHost, aPort)
-{
- let s = socketTransportService.createTransport(null, 0, aHost, aPort, null);
- // By default the CONNECT socket timeout is very long, 65535 seconds,
- // so that if we race to be in CONNECT state while the server socket is still
- // initializing, the connection is stuck in connecting state for 18.20 hours!
- s.setTimeout(Ci.nsISocketTransport.TIMEOUT_CONNECT, 2);
-
- // openOutputStream may throw NS_ERROR_NOT_INITIALIZED if we hit some race
- // where the nsISocketTransport gets shutdown in between its instantiation and
- // the call to this method.
- let transport;
- try {
- transport = new DebuggerTransport(s.openInputStream(0, 0, 0),
- s.openOutputStream(0, 0, 0));
- } catch(e) {
- DevToolsUtils.reportException("debuggerSocketConnect", e);
- throw e;
- }
- return transport;
-}
diff --git a/toolkit/devtools/gcli/source/lib/gcli/connectors/rdp.js b/toolkit/devtools/gcli/source/lib/gcli/connectors/rdp.js
index cde7a8e12589..3c3e30f95f4e 100644
--- a/toolkit/devtools/gcli/source/lib/gcli/connectors/rdp.js
+++ b/toolkit/devtools/gcli/source/lib/gcli/connectors/rdp.js
@@ -18,7 +18,6 @@
var Cu = require('chrome').Cu;
-var debuggerSocketConnect = Cu.import('resource://gre/modules/devtools/dbg-client.jsm', {}).debuggerSocketConnect;
var DebuggerClient = Cu.import('resource://gre/modules/devtools/dbg-client.jsm', {}).DebuggerClient;
var Promise = require('../util/promise').Promise;
@@ -72,7 +71,7 @@ RdpConnection.create = function(url) {
this._emit = this._emit.bind(this);
return new Promise(function(resolve, reject) {
- this.transport = debuggerSocketConnect(this.host, this.port);
+ this.transport = DebuggerClient.socketConnect(this.host, this.port);
this.client = new DebuggerClient(this.transport);
this.client.connect(function() {
this.client.listTabs(function(response) {
diff --git a/toolkit/devtools/security/moz.build b/toolkit/devtools/security/moz.build
index f14e1f3da932..35c365340f6f 100644
--- a/toolkit/devtools/security/moz.build
+++ b/toolkit/devtools/security/moz.build
@@ -19,3 +19,7 @@ UNIFIED_SOURCES += [
FAIL_ON_WARNINGS = True
FINAL_LIBRARY = 'xul'
+
+EXTRA_JS_MODULES.devtools.security += [
+ 'socket.js',
+]
diff --git a/toolkit/devtools/security/socket.js b/toolkit/devtools/security/socket.js
new file mode 100644
index 000000000000..7aab6e491a60
--- /dev/null
+++ b/toolkit/devtools/security/socket.js
@@ -0,0 +1,203 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+let { Ci, Cc, CC, Cr } = require("chrome");
+let Services = require("Services");
+let DevToolsUtils = require("devtools/toolkit/DevToolsUtils");
+let { dumpn } = DevToolsUtils;
+loader.lazyRequireGetter(this, "DebuggerTransport",
+ "devtools/toolkit/transport/transport", true);
+loader.lazyRequireGetter(this, "DebuggerServer",
+ "devtools/server/main", true);
+
+DevToolsUtils.defineLazyGetter(this, "ServerSocket", () => {
+ return CC("@mozilla.org/network/server-socket;1",
+ "nsIServerSocket",
+ "initSpecialConnection");
+});
+
+DevToolsUtils.defineLazyGetter(this, "UnixDomainServerSocket", () => {
+ return CC("@mozilla.org/network/server-socket;1",
+ "nsIServerSocket",
+ "initWithFilename");
+});
+
+DevToolsUtils.defineLazyGetter(this, "nsFile", () => {
+ return CC("@mozilla.org/file/local;1", "nsIFile", "initWithPath");
+});
+
+DevToolsUtils.defineLazyGetter(this, "socketTransportService", () => {
+ return Cc["@mozilla.org/network/socket-transport-service;1"]
+ .getService(Ci.nsISocketTransportService);
+});
+
+const DBG_STRINGS_URI = "chrome://global/locale/devtools/debugger.properties";
+
+/**
+ * Connects to a debugger server socket and returns a DebuggerTransport.
+ *
+ * @param host string
+ * The host name or IP address of the debugger server.
+ * @param port number
+ * The port number of the debugger server.
+ */
+function socketConnect(host, port) {
+ let s = socketTransportService.createTransport(null, 0, host, port, null);
+ // By default the CONNECT socket timeout is very long, 65535 seconds,
+ // so that if we race to be in CONNECT state while the server socket is still
+ // initializing, the connection is stuck in connecting state for 18.20 hours!
+ s.setTimeout(Ci.nsISocketTransport.TIMEOUT_CONNECT, 2);
+
+ // openOutputStream may throw NS_ERROR_NOT_INITIALIZED if we hit some race
+ // where the nsISocketTransport gets shutdown in between its instantiation and
+ // the call to this method.
+ let transport;
+ try {
+ transport = new DebuggerTransport(s.openInputStream(0, 0, 0),
+ s.openOutputStream(0, 0, 0));
+ } catch(e) {
+ DevToolsUtils.reportException("socketConnect", e);
+ throw e;
+ }
+ return transport;
+}
+
+/**
+ * Creates a new socket listener for remote connections to the DebuggerServer.
+ * This helps contain and organize the parts of the server that may differ or
+ * are particular to one given listener mechanism vs. another.
+ */
+function SocketListener() {}
+
+/**
+ * Prompt the user to accept or decline the incoming connection. This is the
+ * default implementation that products embedding the debugger server may
+ * choose to override. A separate security handler can be specified for each
+ * socket via |allowConnection| on a socket listener instance.
+ *
+ * @return true if the connection should be permitted, false otherwise
+ */
+SocketListener.defaultAllowConnection = () => {
+ let bundle = Services.strings.createBundle(DBG_STRINGS_URI);
+ let title = bundle.GetStringFromName("remoteIncomingPromptTitle");
+ let msg = bundle.GetStringFromName("remoteIncomingPromptMessage");
+ let disableButton = bundle.GetStringFromName("remoteIncomingPromptDisable");
+ let prompt = Services.prompt;
+ let flags = prompt.BUTTON_POS_0 * prompt.BUTTON_TITLE_OK +
+ prompt.BUTTON_POS_1 * prompt.BUTTON_TITLE_CANCEL +
+ prompt.BUTTON_POS_2 * prompt.BUTTON_TITLE_IS_STRING +
+ prompt.BUTTON_POS_1_DEFAULT;
+ let result = prompt.confirmEx(null, title, msg, flags, null, null,
+ disableButton, null, { value: false });
+ if (result === 0) {
+ return true;
+ }
+ if (result === 2) {
+ DebuggerServer.closeAllListeners();
+ Services.prefs.setBoolPref("devtools.debugger.remote-enabled", false);
+ }
+ return false;
+};
+
+SocketListener.prototype = {
+
+ /**
+ * Listens on the given port or socket file for remote debugger connections.
+ *
+ * @param portOrPath int, string
+ * If given an integer, the port to listen on.
+ * Otherwise, the path to the unix socket domain file to listen on.
+ */
+ open: function(portOrPath) {
+ let flags = Ci.nsIServerSocket.KeepWhenOffline;
+ // A preference setting can force binding on the loopback interface.
+ if (Services.prefs.getBoolPref("devtools.debugger.force-local")) {
+ flags |= Ci.nsIServerSocket.LoopbackOnly;
+ }
+
+ try {
+ let backlog = 4;
+ let port = Number(portOrPath);
+ if (port) {
+ this._socket = new ServerSocket(port, flags, backlog);
+ } else {
+ let file = nsFile(portOrPath);
+ if (file.exists())
+ file.remove(false);
+ this._socket = new UnixDomainServerSocket(file, parseInt("666", 8),
+ backlog);
+ }
+ this._socket.asyncListen(this);
+ } catch (e) {
+ dumpn("Could not start debugging listener on '" + portOrPath + "': " + e);
+ throw Cr.NS_ERROR_NOT_AVAILABLE;
+ }
+ },
+
+ /**
+ * Closes the SocketListener. Notifies the server to remove the listener from
+ * the set of active SocketListeners.
+ */
+ close: function() {
+ this._socket.close();
+ DebuggerServer._removeListener(this);
+ },
+
+ /**
+ * Gets the port that a TCP socket listener is listening on, or null if this
+ * is not a TCP socket (so there is no port).
+ */
+ get port() {
+ if (!this._socket) {
+ return null;
+ }
+ return this._socket.port;
+ },
+
+ /**
+ * Prompt the user to accept or decline the incoming connection. The default
+ * implementation is used unless this is overridden on a particular socket
+ * listener instance.
+ *
+ * @return true if the connection should be permitted, false otherwise
+ */
+ allowConnection: SocketListener.defaultAllowConnection,
+
+ // nsIServerSocketListener implementation
+
+ onSocketAccepted:
+ DevToolsUtils.makeInfallible(function(socket, socketTransport) {
+ if (Services.prefs.getBoolPref("devtools.debugger.prompt-connection") &&
+ !this.allowConnection()) {
+ return;
+ }
+ dumpn("New debugging connection on " +
+ socketTransport.host + ":" + socketTransport.port);
+
+ let input = socketTransport.openInputStream(0, 0, 0);
+ let output = socketTransport.openOutputStream(0, 0, 0);
+ let transport = new DebuggerTransport(input, output);
+ DebuggerServer._onConnection(transport);
+ }, "SocketListener.onSocketAccepted"),
+
+ onStopListening: function(socket, status) {
+ dumpn("onStopListening, status: " + status);
+ }
+
+};
+
+// TODO: These high-level entry points will branch based on TLS vs. bare TCP as
+// part of bug 1059001.
+exports.DebuggerSocket = {
+ createListener() {
+ return new SocketListener();
+ },
+ connect(host, port) {
+ return socketConnect(host, port);
+ }
+};
diff --git a/toolkit/devtools/server/actors/script.js b/toolkit/devtools/server/actors/script.js
index 35e075de297d..cf3ecb722ca2 100644
--- a/toolkit/devtools/server/actors/script.js
+++ b/toolkit/devtools/server/actors/script.js
@@ -2121,21 +2121,7 @@ ThreadActor.prototype = {
* @returns true, if the script can be added, false otherwise.
*/
_allowSource: function (aSource) {
- let url = getSourceURL(aSource);
-
- if (isHiddenSource(aSource)) {
- return false;
- }
-
- // Ignore XBL bindings for content debugging.
- if (url && url.indexOf("chrome://") == 0) {
- return false;
- }
- // Ignore about:* pages for content debugging.
- if (url && url.indexOf("about:") == 0) {
- return false;
- }
- return true;
+ return !isHiddenSource(aSource);
},
/**
@@ -5201,16 +5187,7 @@ update(ChromeDebuggerActor.prototype, {
constructor: ChromeDebuggerActor,
// A constant prefix that will be used to form the actor ID by the server.
- actorPrefix: "chromeDebugger",
-
- /**
- * Override the eligibility check for scripts and sources to make sure every
- * script and source with a URL is stored when debugging chrome.
- */
-
- _allowSource: function(aSource) {
- return !isHiddenSource(aSource);
- }
+ actorPrefix: "chromeDebugger"
});
exports.ChromeDebuggerActor = ChromeDebuggerActor;
diff --git a/toolkit/devtools/server/main.js b/toolkit/devtools/server/main.js
index 370dbb363fe8..c82312565103 100644
--- a/toolkit/devtools/server/main.js
+++ b/toolkit/devtools/server/main.js
@@ -13,13 +13,18 @@
let { Ci, Cc, CC, Cu, Cr } = require("chrome");
let Services = require("Services");
let { ActorPool, RegisteredActorFactory, ObservedActorFactory } = require("devtools/server/actors/common");
-let { DebuggerTransport, LocalDebuggerTransport, ChildDebuggerTransport } =
+let { LocalDebuggerTransport, ChildDebuggerTransport } =
require("devtools/toolkit/transport/transport");
let DevToolsUtils = require("devtools/toolkit/DevToolsUtils");
let { dumpn, dumpv, dbg_assert } = DevToolsUtils;
let EventEmitter = require("devtools/toolkit/event-emitter");
let Debugger = require("Debugger");
+DevToolsUtils.defineLazyGetter(this, "DebuggerSocket", () => {
+ let { DebuggerSocket } = require("devtools/toolkit/security/socket");
+ return DebuggerSocket;
+});
+
// On B2G, `this` != Global scope, so `Ci` won't be binded on `this`
// (i.e. this.Ci is undefined) Then later, when using loadSubScript,
// Ci,... won't be defined for sub scripts.
@@ -42,12 +47,6 @@ Object.defineProperty(this, "Components", {
get: function () require("chrome").components
});
-const DBG_STRINGS_URI = "chrome://global/locale/devtools/debugger.properties";
-
-DevToolsUtils.defineLazyGetter(this, "nsFile", () => {
- return CC("@mozilla.org/file/local;1", "nsIFile", "initWithPath");
-});
-
if (isWorker) {
dumpn.wantLogging = true;
dumpv.wantVerbose = true;
@@ -84,19 +83,6 @@ this.resolve = resolve;
this.reject = reject;
this.all = all;
-// XPCOM constructors
-DevToolsUtils.defineLazyGetter(this, "ServerSocket", () => {
- return CC("@mozilla.org/network/server-socket;1",
- "nsIServerSocket",
- "initSpecialConnection");
-});
-
-DevToolsUtils.defineLazyGetter(this, "UnixDomainServerSocket", () => {
- return CC("@mozilla.org/network/server-socket;1",
- "nsIServerSocket",
- "initWithFilename");
-});
-
var gRegisteredModules = Object.create(null);
/**
@@ -170,12 +156,6 @@ var DebuggerServer = {
LONG_STRING_INITIAL_LENGTH: 1000,
LONG_STRING_READ_LENGTH: 65 * 1024,
- /**
- * A handler function that prompts the user to accept or decline the incoming
- * connection.
- */
- _allowConnection: null,
-
/**
* The windowtype of the chrome window to use for actors that use the global
* window (i.e the global style editor). Set this to your main window type,
@@ -183,48 +163,15 @@ var DebuggerServer = {
*/
chromeWindowType: null,
- /**
- * Prompt the user to accept or decline the incoming connection. This is the
- * default implementation that products embedding the debugger server may
- * choose to override.
- *
- * @return true if the connection should be permitted, false otherwise
- */
- _defaultAllowConnection: function DS__defaultAllowConnection() {
- let bundle = Services.strings.createBundle(DBG_STRINGS_URI)
- let title = bundle.GetStringFromName("remoteIncomingPromptTitle");
- let msg = bundle.GetStringFromName("remoteIncomingPromptMessage");
- let disableButton = bundle.GetStringFromName("remoteIncomingPromptDisable");
- let prompt = Services.prompt;
- let flags = prompt.BUTTON_POS_0 * prompt.BUTTON_TITLE_OK +
- prompt.BUTTON_POS_1 * prompt.BUTTON_TITLE_CANCEL +
- prompt.BUTTON_POS_2 * prompt.BUTTON_TITLE_IS_STRING +
- prompt.BUTTON_POS_1_DEFAULT;
- let result = prompt.confirmEx(null, title, msg, flags, null, null,
- disableButton, null, { value: false });
- if (result == 0) {
- return true;
- }
- if (result == 2) {
- DebuggerServer.closeAllListeners();
- Services.prefs.setBoolPref("devtools.debugger.remote-enabled", false);
- }
- return false;
- },
-
/**
* Initialize the debugger server.
- *
- * @param function aAllowConnectionCallback
- * The embedder-provider callback, that decides whether an incoming
- * remote protocol conection should be allowed or refused.
*/
- init: function DS_init(aAllowConnectionCallback) {
+ init: function DS_init() {
if (this.initialized) {
return;
}
- this.initTransport(aAllowConnectionCallback);
+ this.initTransport();
this._initialized = true;
},
@@ -234,12 +181,8 @@ var DebuggerServer = {
/**
* Initialize the debugger server's transport variables. This can be
* in place of init() for cases where the jsdebugger isn't needed.
- *
- * @param function aAllowConnectionCallback
- * The embedder-provider callback, that decides whether an incoming
- * remote protocol conection should be allowed or refused.
*/
- initTransport: function DS_initTransport(aAllowConnectionCallback) {
+ initTransport: function DS_initTransport() {
if (this._transportInitialized) {
return;
}
@@ -247,9 +190,6 @@ var DebuggerServer = {
this._connections = {};
this._nextConnID = 0;
this._transportInitialized = true;
- this._allowConnection = aAllowConnectionCallback ?
- aAllowConnectionCallback :
- this._defaultAllowConnection;
},
get initialized() this._initialized,
@@ -278,7 +218,6 @@ var DebuggerServer = {
this.closeAllListeners();
this.globalActorFactories = {};
this.tabActorFactories = {};
- this._allowConnection = null;
this._transportInitialized = false;
this._initialized = false;
@@ -621,7 +560,7 @@ var DebuggerServer = {
}
this._checkInit();
- let listener = new SocketListener(this);
+ let listener = DebuggerSocket.createListener();
listener.open(portOrPath);
this._listeners.push(listener);
return listener;
@@ -1088,94 +1027,6 @@ if (this.exports) {
exports.ActorPool = ActorPool;
}
-/**
- * Creates a new socket listener for remote connections to a given
- * DebuggerServer. This helps contain and organize the parts of the server that
- * may differ or are particular to one given listener mechanism vs. another.
- */
-function SocketListener(server) {
- this._server = server;
-}
-
-SocketListener.prototype = {
-
- /**
- * Listens on the given port or socket file for remote debugger connections.
- *
- * @param portOrPath int, string
- * If given an integer, the port to listen on.
- * Otherwise, the path to the unix socket domain file to listen on.
- */
- open: function(portOrPath) {
- let flags = Ci.nsIServerSocket.KeepWhenOffline;
- // A preference setting can force binding on the loopback interface.
- if (Services.prefs.getBoolPref("devtools.debugger.force-local")) {
- flags |= Ci.nsIServerSocket.LoopbackOnly;
- }
-
- try {
- let backlog = 4;
- let port = Number(portOrPath);
- if (port) {
- this._socket = new ServerSocket(port, flags, backlog);
- } else {
- let file = nsFile(portOrPath);
- if (file.exists())
- file.remove(false);
- this._socket = new UnixDomainServerSocket(file, parseInt("666", 8),
- backlog);
- }
- this._socket.asyncListen(this);
- } catch (e) {
- dumpn("Could not start debugging listener on '" + portOrPath + "': " + e);
- throw Cr.NS_ERROR_NOT_AVAILABLE;
- }
- },
-
- /**
- * Closes the SocketListener. Notifies the server to remove the listener from
- * the set of active SocketListeners.
- */
- close: function() {
- this._socket.close();
- this._server._removeListener(this);
- this._server = null;
- },
-
- /**
- * Gets the port that a TCP socket listener is listening on, or null if this
- * is not a TCP socket (so there is no port).
- */
- get port() {
- if (!this._socket) {
- return null;
- }
- return this._socket.port;
- },
-
- // nsIServerSocketListener implementation
-
- onSocketAccepted:
- DevToolsUtils.makeInfallible(function(aSocket, aTransport) {
- if (Services.prefs.getBoolPref("devtools.debugger.prompt-connection") &&
- !this._server._allowConnection()) {
- return;
- }
- dumpn("New debugging connection on " +
- aTransport.host + ":" + aTransport.port);
-
- let input = aTransport.openInputStream(0, 0, 0);
- let output = aTransport.openOutputStream(0, 0, 0);
- let transport = new DebuggerTransport(input, output);
- this._server._onConnection(transport);
- }, "SocketListener.onSocketAccepted"),
-
- onStopListening: function(aSocket, status) {
- dumpn("onStopListening, status: " + status);
- }
-
-};
-
/**
* Creates a DebuggerServerConnection.
*
diff --git a/toolkit/devtools/server/tests/browser/head.js b/toolkit/devtools/server/tests/browser/head.js
index 20834e6381d2..604157e12afe 100644
--- a/toolkit/devtools/server/tests/browser/head.js
+++ b/toolkit/devtools/server/tests/browser/head.js
@@ -56,7 +56,7 @@ function initDebuggerServer() {
// tests.
DebuggerServer.destroy();
} catch (ex) { }
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/toolkit/devtools/server/tests/mochitest/inspector-helpers.js b/toolkit/devtools/server/tests/mochitest/inspector-helpers.js
index 9a39a8cb41c0..530961c1b628 100644
--- a/toolkit/devtools/server/tests/mochitest/inspector-helpers.js
+++ b/toolkit/devtools/server/tests/mochitest/inspector-helpers.js
@@ -16,7 +16,7 @@ SimpleTest.registerCleanupFunction(function() {
if (!DebuggerServer.initialized) {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
SimpleTest.registerCleanupFunction(function() {
DebuggerServer.destroy();
diff --git a/toolkit/devtools/server/tests/mochitest/memory-helpers.js b/toolkit/devtools/server/tests/mochitest/memory-helpers.js
index b7d6fe993a50..30b883662a45 100644
--- a/toolkit/devtools/server/tests/mochitest/memory-helpers.js
+++ b/toolkit/devtools/server/tests/mochitest/memory-helpers.js
@@ -20,7 +20,7 @@ let { require } = devtools;
let { MemoryFront } = require("devtools/server/actors/memory");
function startServerAndGetSelectedTabMemory() {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
var client = new DebuggerClient(DebuggerServer.connectPipe());
diff --git a/toolkit/devtools/server/tests/mochitest/test_attachProcess.html b/toolkit/devtools/server/tests/mochitest/test_attachProcess.html
index 38504a0b0d78..28e2a783bf33 100644
--- a/toolkit/devtools/server/tests/mochitest/test_attachProcess.html
+++ b/toolkit/devtools/server/tests/mochitest/test_attachProcess.html
@@ -44,7 +44,7 @@ function runTests() {
// Instantiate a minimal server
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
}
if (!DebuggerServer.createRootActor) {
DebuggerServer.addBrowserActors();
diff --git a/toolkit/devtools/server/tests/mochitest/test_connectToChild.html b/toolkit/devtools/server/tests/mochitest/test_connectToChild.html
index 0d23b6c42fef..132348810fd1 100644
--- a/toolkit/devtools/server/tests/mochitest/test_connectToChild.html
+++ b/toolkit/devtools/server/tests/mochitest/test_connectToChild.html
@@ -68,7 +68,7 @@ function runTests() {
// Instantiate a minimal server
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
}
if (!DebuggerServer.createRootActor) {
DebuggerServer.addBrowserActors();
diff --git a/toolkit/devtools/server/tests/mochitest/test_connection-manager.html b/toolkit/devtools/server/tests/mochitest/test_connection-manager.html
index 9e6c5f2e0208..ddfe72b9417a 100644
--- a/toolkit/devtools/server/tests/mochitest/test_connection-manager.html
+++ b/toolkit/devtools/server/tests/mochitest/test_connection-manager.html
@@ -23,7 +23,7 @@ window.onload = function() {
Cu.import("resource://gre/modules/Services.jsm");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/toolkit/devtools/server/tests/mochitest/test_device.html b/toolkit/devtools/server/tests/mochitest/test_device.html
index 152b2c110dd4..b06883960264 100644
--- a/toolkit/devtools/server/tests/mochitest/test_device.html
+++ b/toolkit/devtools/server/tests/mochitest/test_device.html
@@ -29,7 +29,7 @@ window.onload = function() {
var {getDeviceFront} = devtools.require("devtools/server/actors/device");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/toolkit/devtools/server/tests/mochitest/test_framerate_01.html b/toolkit/devtools/server/tests/mochitest/test_framerate_01.html
index 3b89b49230aa..f4bd28efcc7b 100644
--- a/toolkit/devtools/server/tests/mochitest/test_framerate_01.html
+++ b/toolkit/devtools/server/tests/mochitest/test_framerate_01.html
@@ -35,7 +35,7 @@ window.onload = function() {
var {FramerateFront} = devtools.require("devtools/server/actors/framerate");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/toolkit/devtools/server/tests/mochitest/test_framerate_02.html b/toolkit/devtools/server/tests/mochitest/test_framerate_02.html
index 175b8a134672..cb69b26c96c4 100644
--- a/toolkit/devtools/server/tests/mochitest/test_framerate_02.html
+++ b/toolkit/devtools/server/tests/mochitest/test_framerate_02.html
@@ -35,7 +35,7 @@ window.onload = function() {
var {FramerateFront} = devtools.require("devtools/server/actors/framerate");
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/toolkit/devtools/server/tests/mochitest/test_framerate_03.html b/toolkit/devtools/server/tests/mochitest/test_framerate_03.html
index 5eb789929a2b..3c8151fc00aa 100644
--- a/toolkit/devtools/server/tests/mochitest/test_framerate_03.html
+++ b/toolkit/devtools/server/tests/mochitest/test_framerate_03.html
@@ -38,7 +38,7 @@ window.onload = function() {
var TOTAL_TIME = 5000;
if (!DebuggerServer.initialized) {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
}
diff --git a/toolkit/devtools/server/tests/mochitest/test_framerate_05.html b/toolkit/devtools/server/tests/mochitest/test_framerate_05.html
index 0505b4535205..829832776137 100644
--- a/toolkit/devtools/server/tests/mochitest/test_framerate_05.html
+++ b/toolkit/devtools/server/tests/mochitest/test_framerate_05.html
@@ -34,7 +34,7 @@ window.onload = function() {
var {FramerateFront} = devtools.require("devtools/server/actors/framerate");
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
var client = new DebuggerClient(DebuggerServer.connectPipe());
diff --git a/toolkit/devtools/server/tests/mochitest/test_preference.html b/toolkit/devtools/server/tests/mochitest/test_preference.html
index 62d6dab377bc..efeacb9481fe 100644
--- a/toolkit/devtools/server/tests/mochitest/test_preference.html
+++ b/toolkit/devtools/server/tests/mochitest/test_preference.html
@@ -27,7 +27,7 @@ function runTests() {
var {getPreferenceFront} = devtools.require("devtools/server/actors/preference");
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
var client = new DebuggerClient(DebuggerServer.connectPipe());
diff --git a/toolkit/devtools/server/tests/unit/test_add_actors.js b/toolkit/devtools/server/tests/unit/test_add_actors.js
index 3bdbb8adc9ce..d210076e9ead 100644
--- a/toolkit/devtools/server/tests/unit/test_add_actors.js
+++ b/toolkit/devtools/server/tests/unit/test_add_actors.js
@@ -16,7 +16,7 @@ function run_test()
DebuggerServer.addActors("resource://test/pre_init_global_actors.js");
DebuggerServer.addActors("resource://test/pre_init_tab_actors.js");
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
DebuggerServer.addActors("resource://test/post_init_global_actors.js");
diff --git a/toolkit/devtools/server/tests/unit/test_client_request.js b/toolkit/devtools/server/tests/unit/test_client_request.js
index fa5b60da4942..4a1a5f274c6f 100644
--- a/toolkit/devtools/server/tests/unit/test_client_request.js
+++ b/toolkit/devtools/server/tests/unit/test_client_request.js
@@ -28,7 +28,7 @@ function run_test()
{
DebuggerServer.addGlobalActor(TestActor);
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
add_test(init);
diff --git a/toolkit/devtools/server/tests/unit/test_dbgglobal.js b/toolkit/devtools/server/tests/unit/test_dbgglobal.js
index 5386ccfb2282..d09698963137 100644
--- a/toolkit/devtools/server/tests/unit/test_dbgglobal.js
+++ b/toolkit/devtools/server/tests/unit/test_dbgglobal.js
@@ -15,7 +15,7 @@ function run_test()
check_except(DebuggerServer.connectPipe);
// Allow incoming connections.
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
// These should still fail because we haven't added a createRootActor
// implementation yet.
diff --git a/toolkit/devtools/server/tests/unit/test_eventlooplag_actor.js b/toolkit/devtools/server/tests/unit/test_eventlooplag_actor.js
index d32186e88fff..9b0d121d9afc 100644
--- a/toolkit/devtools/server/tests/unit/test_eventlooplag_actor.js
+++ b/toolkit/devtools/server/tests/unit/test_eventlooplag_actor.js
@@ -11,7 +11,7 @@ function run_test()
{
let {EventLoopLagFront} = devtools.require("devtools/server/actors/eventlooplag");
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
// As seen in EventTracer.cpp
diff --git a/toolkit/devtools/server/tests/unit/test_memory_footprint.js b/toolkit/devtools/server/tests/unit/test_memory_footprint.js
index 46300352e456..0c807ac51218 100644
--- a/toolkit/devtools/server/tests/unit/test_memory_footprint.js
+++ b/toolkit/devtools/server/tests/unit/test_memory_footprint.js
@@ -25,7 +25,7 @@ function check_footprint(step, max) {
}
function init_server() {
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
check_footprint("DebuggerServer.init()", 500);
}
diff --git a/toolkit/devtools/server/tests/unit/test_monitor_actor.js b/toolkit/devtools/server/tests/unit/test_monitor_actor.js
index 817bcd58658c..14dfc07beac6 100644
--- a/toolkit/devtools/server/tests/unit/test_monitor_actor.js
+++ b/toolkit/devtools/server/tests/unit/test_monitor_actor.js
@@ -11,7 +11,7 @@ function run_test()
{
let EventEmitter = devtools.require("devtools/toolkit/event-emitter");
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
let client = new DebuggerClient(DebuggerServer.connectPipe());
diff --git a/toolkit/devtools/server/tests/unit/test_profiler_activation-01.js b/toolkit/devtools/server/tests/unit/test_profiler_activation-01.js
index 708bc8166291..88dfe1542d62 100644
--- a/toolkit/devtools/server/tests/unit/test_profiler_activation-01.js
+++ b/toolkit/devtools/server/tests/unit/test_profiler_activation-01.js
@@ -26,7 +26,7 @@ function run_test()
// happen if the MOZ_PROFILER_STARTUP environment variable is set).
Profiler.StopProfiler();
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
connect_client((client1, actor1) => {
diff --git a/toolkit/devtools/server/tests/unit/test_profiler_activation-02.js b/toolkit/devtools/server/tests/unit/test_profiler_activation-02.js
index 4f8f4c72afba..f331ed726b44 100644
--- a/toolkit/devtools/server/tests/unit/test_profiler_activation-02.js
+++ b/toolkit/devtools/server/tests/unit/test_profiler_activation-02.js
@@ -27,7 +27,7 @@ function run_test()
Profiler.StartProfiler(1000000, 1, ["js"], 1);
DevToolsUtils.waitForTime(WAIT_TIME).then(() => {
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
connect_client((client, actor) => {
diff --git a/toolkit/devtools/server/tests/unit/test_profiler_close.js b/toolkit/devtools/server/tests/unit/test_profiler_close.js
index 7ff7b08848dd..c756104ab4f2 100644
--- a/toolkit/devtools/server/tests/unit/test_profiler_close.js
+++ b/toolkit/devtools/server/tests/unit/test_profiler_close.js
@@ -22,7 +22,7 @@ function connect_client(callback)
function run_test()
{
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
connect_client((client1, actor1) => {
diff --git a/toolkit/devtools/server/tests/unit/test_profiler_data.js b/toolkit/devtools/server/tests/unit/test_profiler_data.js
index 6d90417a1d84..6ebb338e7afa 100644
--- a/toolkit/devtools/server/tests/unit/test_profiler_data.js
+++ b/toolkit/devtools/server/tests/unit/test_profiler_data.js
@@ -24,7 +24,7 @@ function connect_client(callback)
function run_test()
{
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
connect_client((client, actor) => {
diff --git a/toolkit/devtools/server/tests/unit/test_profiler_events-01.js b/toolkit/devtools/server/tests/unit/test_profiler_events-01.js
index 90f74dfb3c18..8819decae728 100644
--- a/toolkit/devtools/server/tests/unit/test_profiler_events-01.js
+++ b/toolkit/devtools/server/tests/unit/test_profiler_events-01.js
@@ -21,7 +21,7 @@ function connect_client(callback)
function run_test()
{
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
connect_client((client, actor) => {
diff --git a/toolkit/devtools/server/tests/unit/test_profiler_events-02.js b/toolkit/devtools/server/tests/unit/test_profiler_events-02.js
index 8bdf463b3ec9..05b7740bd746 100644
--- a/toolkit/devtools/server/tests/unit/test_profiler_events-02.js
+++ b/toolkit/devtools/server/tests/unit/test_profiler_events-02.js
@@ -22,7 +22,7 @@ function connect_client(callback)
function run_test()
{
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
connect_client((client, actor) => {
diff --git a/toolkit/devtools/server/tests/unit/test_protocol_async.js b/toolkit/devtools/server/tests/unit/test_protocol_async.js
index 93b5117b9ac6..189f3eff05f5 100644
--- a/toolkit/devtools/server/tests/unit/test_protocol_async.js
+++ b/toolkit/devtools/server/tests/unit/test_protocol_async.js
@@ -91,7 +91,7 @@ let RootFront = protocol.FrontClass(RootActor, {
function run_test()
{
DebuggerServer.createRootActor = RootActor;
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
let trace = connectPipeTracing();
let client = new DebuggerClient(trace);
diff --git a/toolkit/devtools/server/tests/unit/test_protocol_children.js b/toolkit/devtools/server/tests/unit/test_protocol_children.js
index 1f75eb3ee7eb..e872e6b38e2f 100644
--- a/toolkit/devtools/server/tests/unit/test_protocol_children.js
+++ b/toolkit/devtools/server/tests/unit/test_protocol_children.js
@@ -260,7 +260,7 @@ function run_test()
DebuggerServer.createRootActor = (conn => {
return RootActor(conn);
});
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
let trace = connectPipeTracing();
let client = new DebuggerClient(trace);
diff --git a/toolkit/devtools/server/tests/unit/test_protocol_formtype.js b/toolkit/devtools/server/tests/unit/test_protocol_formtype.js
index c471656f5862..68c19b2345f5 100644
--- a/toolkit/devtools/server/tests/unit/test_protocol_formtype.js
+++ b/toolkit/devtools/server/tests/unit/test_protocol_formtype.js
@@ -126,7 +126,7 @@ const run_test = Test(function*() {
DebuggerServer.createRootActor = (conn => {
return RootActor(conn);
});
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
const connection = DebuggerServer.connectPipe();
const conn = new DebuggerClient(connection);
diff --git a/toolkit/devtools/server/tests/unit/test_protocol_longstring.js b/toolkit/devtools/server/tests/unit/test_protocol_longstring.js
index b2dc73f7951e..95a4a5850461 100644
--- a/toolkit/devtools/server/tests/unit/test_protocol_longstring.js
+++ b/toolkit/devtools/server/tests/unit/test_protocol_longstring.js
@@ -83,7 +83,7 @@ function run_test()
return RootActor(conn);
});
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
let trace = connectPipeTracing();
let client = new DebuggerClient(trace);
let rootClient;
diff --git a/toolkit/devtools/server/tests/unit/test_protocol_simple.js b/toolkit/devtools/server/tests/unit/test_protocol_simple.js
index 264baf811483..e7cb9d4ddfda 100644
--- a/toolkit/devtools/server/tests/unit/test_protocol_simple.js
+++ b/toolkit/devtools/server/tests/unit/test_protocol_simple.js
@@ -161,7 +161,7 @@ function run_test()
DebuggerServer.createRootActor = (conn => {
return RootActor(conn);
});
- DebuggerServer.init(() => true);
+ DebuggerServer.init();
check_except(() => {
let badActor = ActorClass({
diff --git a/toolkit/devtools/server/tests/unit/test_registerClient.js b/toolkit/devtools/server/tests/unit/test_registerClient.js
index ff51f7e24fb8..d351a47aca42 100644
--- a/toolkit/devtools/server/tests/unit/test_registerClient.js
+++ b/toolkit/devtools/server/tests/unit/test_registerClient.js
@@ -53,7 +53,7 @@ function run_test()
{
DebuggerServer.addGlobalActor(TestActor);
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
add_test(init);
diff --git a/toolkit/devtools/server/tests/unit/test_register_actor.js b/toolkit/devtools/server/tests/unit/test_register_actor.js
index 2736883b099f..be581dcadec6 100644
--- a/toolkit/devtools/server/tests/unit/test_register_actor.js
+++ b/toolkit/devtools/server/tests/unit/test_register_actor.js
@@ -16,7 +16,7 @@ function check_actors(expect) {
function run_test()
{
// Allow incoming connections.
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
add_test(test_deprecated_api);
diff --git a/toolkit/devtools/server/tests/unit/test_requestTypes.js b/toolkit/devtools/server/tests/unit/test_requestTypes.js
index 46d165865d28..fb41b0c6b994 100644
--- a/toolkit/devtools/server/tests/unit/test_requestTypes.js
+++ b/toolkit/devtools/server/tests/unit/test_requestTypes.js
@@ -38,7 +38,7 @@ function test_existent_actor(aClient, anActor)
function run_test()
{
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
DebuggerServer.addBrowserActors();
var client = new DebuggerClient(DebuggerServer.connectPipe());
client.connect(function() {
diff --git a/toolkit/devtools/transport/tests/unit/head_dbg.js b/toolkit/devtools/transport/tests/unit/head_dbg.js
index 81c9f9183ff4..51ac858db8c5 100644
--- a/toolkit/devtools/transport/tests/unit/head_dbg.js
+++ b/toolkit/devtools/transport/tests/unit/head_dbg.js
@@ -196,7 +196,7 @@ function initTestDebuggerServer() {
});
DebuggerServer.registerModule("xpcshell-test/testactors");
// Allow incoming connections.
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
}
function finishClient(aClient) {
@@ -260,11 +260,12 @@ function writeTestTempFile(aFileName, aContent) {
function socket_transport() {
if (!DebuggerServer.listeningSockets) {
- DebuggerServer.openListener(-1);
+ let listener = DebuggerServer.openListener(-1);
+ listener.allowConnection = () => true;
}
let port = DebuggerServer._listeners[0].port;
do_print("Debugger server port is " + port);
- return debuggerSocketConnect("127.0.0.1", port);
+ return DebuggerClient.socketConnect("127.0.0.1", port);
}
function local_transport() {
diff --git a/toolkit/devtools/transport/tests/unit/test_dbgsocket.js b/toolkit/devtools/transport/tests/unit/test_dbgsocket.js
index 9c5237f10039..83375f61f388 100644
--- a/toolkit/devtools/transport/tests/unit/test_dbgsocket.js
+++ b/toolkit/devtools/transport/tests/unit/test_dbgsocket.js
@@ -22,17 +22,20 @@ function run_test()
function test_socket_conn()
{
do_check_eq(DebuggerServer.listeningSockets, 0);
- do_check_true(DebuggerServer.openListener(-1));
+ let listener = DebuggerServer.openListener(-1);
+ listener.allowConnection = () => true;
+ do_check_true(listener);
do_check_eq(DebuggerServer.listeningSockets, 1);
gPort = DebuggerServer._listeners[0].port;
do_print("Debugger server port is " + gPort);
// Open a second, separate listener
gExtraListener = DebuggerServer.openListener(-1);
+ gExtraListener.allowConnection = () => true;
do_check_eq(DebuggerServer.listeningSockets, 2);
do_print("Starting long and unicode tests at " + new Date().toTimeString());
let unicodeString = "(╯°□°)╯︵ ┻━┻";
- let transport = debuggerSocketConnect("127.0.0.1", gPort);
+ let transport = DebuggerClient.socketConnect("127.0.0.1", gPort);
transport.hooks = {
onPacket: function(aPacket) {
this.onPacket = function(aPacket) {
@@ -66,7 +69,7 @@ function test_socket_shutdown()
do_check_eq(DebuggerServer.listeningSockets, 0);
do_print("Connecting to a server socket at " + new Date().toTimeString());
- let transport = debuggerSocketConnect("127.0.0.1", gPort);
+ let transport = DebuggerClient.socketConnect("127.0.0.1", gPort);
transport.hooks = {
onPacket: function(aPacket) {
// Shouldn't reach this, should never connect.
diff --git a/toolkit/devtools/transport/tests/unit/test_dbgsocket_connection_drop.js b/toolkit/devtools/transport/tests/unit/test_dbgsocket_connection_drop.js
index c402707b841d..49eed944af90 100644
--- a/toolkit/devtools/transport/tests/unit/test_dbgsocket_connection_drop.js
+++ b/toolkit/devtools/transport/tests/unit/test_dbgsocket_connection_drop.js
@@ -48,8 +48,9 @@ function test_socket_conn_drops_after_too_long_header() {
function test_helper(payload) {
let listener = DebuggerServer.openListener(-1);
+ listener.allowConnection = () => true;
- let transport = debuggerSocketConnect("127.0.0.1", listener.port);
+ let transport = DebuggerClient.socketConnect("127.0.0.1", listener.port);
transport.hooks = {
onPacket: function(aPacket) {
this.onPacket = function(aPacket) {
diff --git a/toolkit/devtools/transport/tests/unit/test_no_bulk.js b/toolkit/devtools/transport/tests/unit/test_no_bulk.js
index e90756181ef9..df9f48beb22c 100644
--- a/toolkit/devtools/transport/tests/unit/test_no_bulk.js
+++ b/toolkit/devtools/transport/tests/unit/test_no_bulk.js
@@ -13,7 +13,7 @@ let { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {});
function run_test() {
DebuggerServer.registerModule("xpcshell-test/testactors-no-bulk");
// Allow incoming connections.
- DebuggerServer.init(function () { return true; });
+ DebuggerServer.init();
add_task(function() {
yield test_bulk_send_error(socket_transport);
diff --git a/toolkit/modules/tests/xpcshell/test_sqlite.js b/toolkit/modules/tests/xpcshell/test_sqlite.js
index 8f17496444c7..11a15faa48cd 100644
--- a/toolkit/modules/tests/xpcshell/test_sqlite.js
+++ b/toolkit/modules/tests/xpcshell/test_sqlite.js
@@ -8,6 +8,7 @@ const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
do_get_profile();
Cu.import("resource://gre/modules/Promise.jsm");
+Cu.import("resource://gre/modules/PromiseUtils.jsm");
Cu.import("resource://gre/modules/osfile.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
@@ -1041,23 +1042,28 @@ add_task(function* test_forget_witness_on_close() {
add_task(function* test_close_database_on_gc() {
failTestsOnAutoClose(false);
- let deferred = Promise.defer();
+ let finalPromise;
- for (let i = 0; i < 100; ++i) {
- let c = yield getDummyDatabase("gc_" + i);
- c._connectionData._deferredClose.promise.then(deferred.resolve);
+ {
+ let collectedPromises = [];
+ for (let i = 0; i < 100; ++i) {
+ let deferred = PromiseUtils.defer();
+ let c = yield getDummyDatabase("gc_" + i);
+ c._connectionData._deferredClose.promise.then(deferred.resolve);
+ collectedPromises.push(deferred.promise);
+ }
+ finalPromise = Promise.all(collectedPromises);
}
// Call getDummyDatabase once more to clear any remaining
// references. This is needed at the moment, otherwise
// garbage-collection takes place after the shutdown barrier and the
// test will timeout. Once that is fixed, we can remove this line
- // and be fine as long as at least one connection is
- // garbage-collected.
+ // and be fine as long as the connections are garbage-collected.
let last = yield getDummyDatabase("gc_last");
yield last.close();
Components.utils.forceGC();
- yield deferred.promise;
+ yield finalPromise;
failTestsOnAutoClose(true);
});
diff --git a/toolkit/mozapps/update/nsUpdateService.js b/toolkit/mozapps/update/nsUpdateService.js
index 5bbf0c9e0f2c..6e4a1ef25b02 100644
--- a/toolkit/mozapps/update/nsUpdateService.js
+++ b/toolkit/mozapps/update/nsUpdateService.js
@@ -1215,23 +1215,37 @@ function writeVersionFile(dir, version) {
}
/**
- * Removes the MozUpdater folders that bgupdates/staged updates creates.
+ * Removes the MozUpdater directory that is created when replacing an install
+ * with a staged update and leftover MozUpdater-i folders in the tmp directory.
*/
function cleanUpMozUpdaterDirs() {
+ try {
+ // Remove the MozUpdater directory in the updates/0 directory.
+ var mozUpdaterDir = getUpdatesDir();
+ mozUpdaterDir.append("MozUpdater");
+ if (mozUpdaterDir.exists()) {
+ LOG("cleanUpMozUpdaterDirs - removing MozUpdater directory");
+ mozUpdaterDir.remove(true);
+ }
+ } catch (e) {
+ LOG("cleanUpMozUpdaterDirs - Exception: " + e);
+ }
+
try {
var tmpDir = Cc["@mozilla.org/file/directory_service;1"].
getService(Ci.nsIProperties).
get("TmpD", Ci.nsIFile);
- // We used to store MozUpdater-i folders directly inside the temp directory.
- // We need to cleanup these directories if we detect that they still exist.
+ // We used to store MozUpdater-i directories in the temp directory.
+ // We need to remove these directories if we detect that they still exist.
// To check if they still exist, we simply check for MozUpdater-1.
var mozUpdaterDir1 = tmpDir.clone();
mozUpdaterDir1.append("MozUpdater-1");
- // Only try to delete the left over folders in "$Temp/MozUpdater-i/*" if
+ // Only try to delete the left over directories in "$Temp/MozUpdater-i/*" if
// MozUpdater-1 exists.
if (mozUpdaterDir1.exists()) {
- LOG("cleanUpMozUpdaterDirs - Cleaning top level MozUpdater-i folders");
+ LOG("cleanUpMozUpdaterDirs - Removing top level tmp MozUpdater-i " +
+ "directories");
let i = 0;
let dirEntries = tmpDir.directoryEntries;
while (dirEntries.hasMoreElements() && i < 10) {
@@ -1247,15 +1261,6 @@ function cleanUpMozUpdaterDirs() {
mozUpdaterDir1.remove(true);
}
}
-
- // If we reach here, we simply need to clean the MozUpdater folder. In our
- // new way of storing these files, the unique subfolders are inside MozUpdater
- var mozUpdaterDir = tmpDir.clone();
- mozUpdaterDir.append("MozUpdater");
- if (mozUpdaterDir.exists()) {
- LOG("cleanUpMozUpdaterDirs - Cleaning MozUpdater folder");
- mozUpdaterDir.remove(true);
- }
} catch (e) {
LOG("cleanUpMozUpdaterDirs - Exception: " + e);
}
@@ -2298,7 +2303,8 @@ UpdateService.prototype = {
prompter.showUpdateError(update);
}
- // Now trash the MozUpdater folders which staged/bgupdates uses.
+ // Now trash the MozUpdater directory created when replacing an install with
+ // a staged update.
cleanUpMozUpdaterDirs();
},
diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp
index 0e48e598ffcc..16f50ea99d61 100644
--- a/toolkit/xre/nsUpdateDriver.cpp
+++ b/toolkit/xre/nsUpdateDriver.cpp
@@ -417,43 +417,40 @@ CopyUpdaterIntoUpdateDir(nsIFile *greDir, nsIFile *appDir, nsIFile *updateDir,
* staged.
*
* @param greDir the GRE dir
- * @param updateDir the update root dir
- * @param statusFile the update.status file
+ * @param updateDir the update dir where the mar file is located
* @param appDir the app dir
* @param appArgc the number of args to the application
* @param appArgv the args to the application, used for restarting if needed
*/
static void
-SwitchToUpdatedApp(nsIFile *greDir, nsIFile *updateDir, nsIFile *statusFile,
+SwitchToUpdatedApp(nsIFile *greDir, nsIFile *updateDir,
nsIFile *appDir, int appArgc, char **appArgv)
{
nsresult rv;
// Steps:
- // - copy updater into temp dir
+ // - copy updater into updates/0/MozUpdater/bgupdate/ dir
// - run updater with the correct arguments
- nsCOMPtr tmpDir;
- GetSpecialSystemDirectory(OS_TemporaryDirectory,
- getter_AddRefs(tmpDir));
- if (!tmpDir) {
- LOG(("failed getting a temp dir\n"));
+ nsCOMPtr mozUpdaterDir;
+ rv = updateDir->Clone(getter_AddRefs(mozUpdaterDir));
+ if (NS_FAILED(rv)) {
+ LOG(("failed cloning update dir\n"));
return;
}
- // Try to create our own new temp directory in case there is already an
- // updater binary in the OS temporary location which we cannot write to.
- // Note that we don't check for errors here, as if this directory can't
- // be created, the following CopyUpdaterIntoUpdateDir call will fail.
- // We create the unique directory inside a subfolder of MozUpdater instead
- // of directly in the temp directory so we can efficiently delete everything
- // after updates.
- tmpDir->Append(NS_LITERAL_STRING("MozUpdater"));
- tmpDir->Append(NS_LITERAL_STRING("bgupdate"));
- tmpDir->CreateUnique(nsIFile::DIRECTORY_TYPE, 0755);
+ // Create a new directory named MozUpdater in the updates/0 directory to copy
+ // the updater files to that will be used to replace the installation with the
+ // staged application that has been updated. Note that we don't check for
+ // directory creation errors since the call to CopyUpdaterIntoUpdateDir will
+ // fail if the creation of the directory fails. A unique directory is created
+ // in MozUpdater in case a previous attempt locked the directory or files.
+ mozUpdaterDir->Append(NS_LITERAL_STRING("MozUpdater"));
+ mozUpdaterDir->Append(NS_LITERAL_STRING("bgupdate"));
+ mozUpdaterDir->CreateUnique(nsIFile::DIRECTORY_TYPE, 0755);
nsCOMPtr updater;
- if (!CopyUpdaterIntoUpdateDir(greDir, appDir, tmpDir, updater)) {
+ if (!CopyUpdaterIntoUpdateDir(greDir, appDir, mozUpdaterDir, updater)) {
LOG(("failed copying updater\n"));
return;
}
@@ -1012,8 +1009,7 @@ ProcessUpdates(nsIFile *greDir, nsIFile *appDir, nsIFile *updRootDir,
case eAppliedService:
// An update was staged and needs to be switched so the updated application
// is used.
- SwitchToUpdatedApp(greDir, updatesDir, statusFile,
- appDir, argc, argv);
+ SwitchToUpdatedApp(greDir, updatesDir, appDir, argc, argv);
break;
case eNoUpdateAction:
// We don't need to do any special processing here, we'll just continue to
diff --git a/widget/windows/GfxInfo.cpp b/widget/windows/GfxInfo.cpp
index ee215fe2f0d7..fb122e27a257 100644
--- a/widget/windows/GfxInfo.cpp
+++ b/widget/windows/GfxInfo.cpp
@@ -857,6 +857,12 @@ GfxInfo::GetGfxDriverInfo()
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
DRIVER_LESS_THAN, V(8,62,0,0), "9.6" );
+ // Bug 1099252
+ APPEND_TO_DRIVER_BLOCKLIST2( DRIVER_OS_WINDOWS_7,
+ (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorATI), GfxDriverInfo::allDevices,
+ GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
+ DRIVER_EQUAL, V(8,832,0,0));
+
/*
* Bug 783517 - crashes in AMD driver on Windows 8
*/