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 */