Backed out 2 changesets (bug 1302996) for being the likely cause of browser chrome crashes a=backout

Backed out changeset 8a97f217ebe8 (bug 1302996)
Backed out changeset 45bcf45afca2 (bug 1302996)
This commit is contained in:
Wes Kocher 2016-11-28 16:38:20 -08:00
parent f91a03949a
commit 8df5ab601c
5 changed files with 94 additions and 114 deletions

View File

@ -12,7 +12,6 @@ loader.lazyGetter(this, "OptionsPanel", () => require("devtools/client/framework
loader.lazyGetter(this, "InspectorPanel", () => require("devtools/client/inspector/panel").InspectorPanel);
loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/client/webconsole/panel").WebConsolePanel);
loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/client/debugger/panel").DebuggerPanel);
loader.lazyGetter(this, "NewDebuggerPanel", () => require("devtools/client/debugger/new/panel").DebuggerPanel);
loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/client/styleeditor/styleeditor-panel").StyleEditorPanel);
loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/client/shadereditor/panel").ShaderEditorPanel);
loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/client/canvasdebugger/panel").CanvasDebuggerPanel);
@ -156,6 +155,8 @@ Tools.jsdebugger = {
function switchDebugger() {
if (Services.prefs.getBoolPref("devtools.debugger.new-debugger-frontend")) {
const NewDebuggerPanel = require("devtools/client/debugger/new/panel").DebuggerPanel;
Tools.jsdebugger.url = "chrome://devtools/content/debugger/new/index.html";
Tools.jsdebugger.build = function (iframeWindow, toolbox) {
return new NewDebuggerPanel(iframeWindow, toolbox);

View File

@ -18,6 +18,7 @@ const promise = require("promise");
const defer = require("devtools/shared/defer");
const Telemetry = require("devtools/client/shared/telemetry");
const { gDevTools } = require("./devtools");
const { when: unload } = require("sdk/system/unload");
// Load target and toolbox lazily as they need gDevTools to be fully initialized
loader.lazyRequireGetter(this, "TargetFactory", "devtools/client/framework/target", true);
@ -141,16 +142,6 @@ var gDevToolsBrowser = exports.gDevToolsBrowser = {
}
}
break;
case "quit-application":
gDevToolsBrowser.destroy({ shuttingDown: true });
break;
case "sdk:loader:destroy":
// This event is fired when the devtools loader unloads, which happens
// only when the add-on workflow ask devtools to be reloaded.
if (subject.wrappedJSObject == require('@loader/unload')) {
gDevToolsBrowser.destroy({ shuttingDown: false });
}
break;
}
},
@ -739,19 +730,12 @@ var gDevToolsBrowser = exports.gDevToolsBrowser = {
},
/**
* Either the SDK Loader has been destroyed by the add-on contribution
* workflow, or firefox is shutting down.
* @param {boolean} shuttingDown
* True if firefox is currently shutting down. We may prevent doing
* some cleanups to speed it up. Otherwise everything need to be
* cleaned up in order to be able to load devtools again.
* All browser windows have been closed, tidy up remaining objects.
*/
destroy: function ({ shuttingDown }) {
destroy: function () {
Services.prefs.removeObserver("devtools.", gDevToolsBrowser);
Services.obs.removeObserver(gDevToolsBrowser, "browser-delayed-startup-finished");
Services.obs.removeObserver(gDevToolsBrowser, "quit-application");
Services.obs.removeObserver(gDevToolsBrowser, "sdk:loader:destroy");
Services.obs.removeObserver(gDevToolsBrowser.destroy, "quit-application");
gDevToolsBrowser._pingTelemetry();
gDevToolsBrowser._telemetry = null;
@ -759,8 +743,6 @@ var gDevToolsBrowser = exports.gDevToolsBrowser = {
for (let win of gDevToolsBrowser._trackedBrowserWindows) {
gDevToolsBrowser._forgetBrowserWindow(win);
}
gDevTools.destroy({ shuttingDown });
},
};
@ -784,10 +766,8 @@ gDevTools.on("tool-unregistered", function (ev, toolId) {
gDevTools.on("toolbox-ready", gDevToolsBrowser._updateMenuCheckbox);
gDevTools.on("toolbox-destroyed", gDevToolsBrowser._updateMenuCheckbox);
Services.obs.addObserver(gDevToolsBrowser, "quit-application", false);
Services.obs.addObserver(gDevToolsBrowser.destroy, "quit-application", false);
Services.obs.addObserver(gDevToolsBrowser, "browser-delayed-startup-finished", false);
// Watch for module loader unload. Fires when the tools are reloaded.
Services.obs.addObserver(gDevToolsBrowser, "sdk:loader:destroy", false);
// Fake end of browser window load event for all already opened windows
// that is already fully loaded.
@ -798,3 +778,8 @@ while (enumerator.hasMoreElements()) {
gDevToolsBrowser._registerBrowserWindow(win);
}
}
// Watch for module loader unload. Fires when the tools are reloaded.
unload(function () {
gDevToolsBrowser.destroy();
});

View File

@ -18,6 +18,7 @@ const {defaultTools: DefaultTools, defaultThemes: DefaultThemes} =
const EventEmitter = require("devtools/shared/event-emitter");
const {JsonView} = require("devtools/client/jsonview/main");
const AboutDevTools = require("devtools/client/framework/about-devtools-toolbox");
const {when: unload} = require("sdk/system/unload");
const {Task} = require("devtools/shared/task");
const FORBIDDEN_IDS = new Set(["toolbox", ""]);
@ -34,6 +35,9 @@ this.DevTools = function DevTools() {
// List of toolboxes that are still in process of creation
this._creatingToolboxes = new Map(); // Map<target, toolbox Promise>
// destroy() is an observer's handler so we need to preserve context.
this.destroy = this.destroy.bind(this);
// JSON Viewer for 'application/json' documents.
JsonView.initialize();
@ -41,6 +45,8 @@ this.DevTools = function DevTools() {
EventEmitter.decorate(this);
Services.obs.addObserver(this.destroy, "quit-application", false);
// This is important step in initialization codepath where we are going to
// start registering all default tools and themes: create menuitems, keys, emit
// related events.
@ -482,23 +488,20 @@ DevTools.prototype = {
},
/**
* Either the SDK Loader has been destroyed by the add-on contribution
* workflow, or firefox is shutting down.
* @param {boolean} shuttingDown
* True if firefox is currently shutting down. We may prevent doing
* some cleanups to speed it up. Otherwise everything need to be
* cleaned up in order to be able to load devtools again.
* Called to tear down a tools provider.
*/
destroy: function ({ shuttingDown }) {
// Do not cleanup everything during firefox shutdown, but only when
// devtools are reloaded via the add-on contribution workflow.
if (!shuttingDown) {
_teardown: function DT_teardown() {
for (let [target, toolbox] of this._toolboxes) {
toolbox.destroy();
}
AboutDevTools.unregister();
}
},
/**
* All browser windows have been closed, tidy up remaining objects.
*/
destroy: function () {
Services.obs.removeObserver(this.destroy, "quit-application");
for (let [key, tool] of this.getToolDefinitionMap()) {
this.unregisterTool(key, true);
@ -524,3 +527,8 @@ DevTools.prototype = {
};
const gDevTools = exports.gDevTools = new DevTools();
// Watch for module loader unload. Fires when the tools are reloaded.
unload(function () {
gDevTools._teardown();
});

View File

@ -6,17 +6,16 @@
"use strict";
const {Cc, Ci, Cu, Cm, Cr, components} = require("chrome");
const registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
const {Cu, Cc, Ci, components} = require("chrome");
const Services = require("Services");
const {Class} = require("sdk/core/heritage");
const {Unknown} = require("sdk/platform/xpcom");
const xpcom = require("sdk/platform/xpcom");
const Events = require("sdk/dom/events");
const Clipboard = require("sdk/clipboard");
loader.lazyRequireGetter(this, "NetworkHelper",
"devtools/shared/webconsole/network-helper");
loader.lazyRequireGetter(this, "Events",
"sdk/dom/events");
loader.lazyRequireGetter(this, "Clipboard",
"sdk/clipboard");
loader.lazyRequireGetter(this, "JsonViewUtils",
"devtools/client/jsonview/utils");
@ -31,14 +30,11 @@ const SEGMENT_SIZE = Math.pow(2, 17);
const JSON_VIEW_MIME_TYPE = "application/vnd.mozilla.json.view";
const CONTRACT_ID = "@mozilla.org/streamconv;1?from=" +
JSON_VIEW_MIME_TYPE + "&to=*/*";
const CLASS_ID = components.ID("{d8c9acee-dec5-11e4-8c75-1681e6b88ec1}");
const CLASS_DESCRIPTION = "JSONView converter";
const CLASS_ID = "{d8c9acee-dec5-11e4-8c75-1681e6b88ec1}";
// Localization
loader.lazyGetter(this, "jsonViewStrings", () => {
return Services.strings.createBundle(
let jsonViewStrings = Services.strings.createBundle(
"chrome://devtools/locale/jsonview.properties");
});
/**
* This object detects 'application/vnd.mozilla.json.view' content type
@ -47,14 +43,14 @@ loader.lazyGetter(this, "jsonViewStrings", () => {
*
* Inspired by JSON View: https://github.com/bhollis/jsonview/
*/
function Converter() {}
let Converter = Class({
extends: Unknown,
Converter.prototype = {
QueryInterface: XPCOMUtils.generateQI([
Ci.nsIStreamConverter,
Ci.nsIStreamListener,
Ci.nsIRequestObserver
]),
interfaces: [
"nsIStreamConverter",
"nsIStreamListener",
"nsIRequestObserver"
],
get wrappedJSObject() {
return this;
@ -305,32 +301,28 @@ Converter.prototype = {
Clipboard.set(value, "text");
}
};
});
const Factory = {
createInstance: function (outer, iid) {
if (outer) {
throw Cr.NS_ERROR_NO_AGGREGATION;
}
return new Converter();
}
};
// Stream converter component definition
let service = xpcom.Service({
id: components.ID(CLASS_ID),
contract: CONTRACT_ID,
Component: Converter,
register: false,
unregister: false
});
function register() {
if (!registrar.isCIDRegistered(CLASS_ID)) {
registrar.registerFactory(CLASS_ID,
CLASS_DESCRIPTION,
CONTRACT_ID,
Factory);
if (!xpcom.isRegistered(service)) {
xpcom.register(service);
return true;
}
return false;
}
function unregister() {
if (registrar.isCIDRegistered(CLASS_ID)) {
registrar.unregisterFactory(CLASS_ID, Factory);
if (xpcom.isRegistered(service)) {
xpcom.unregister(service);
return true;
}
return false;

View File

@ -6,30 +6,25 @@
"use strict";
const {Cc, Ci, Cu, Cm, Cr, components} = require("chrome");
const registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
const {Cc, Ci, components} = require("chrome");
const xpcom = require("sdk/platform/xpcom");
const {Unknown} = require("sdk/platform/xpcom");
const {Class} = require("sdk/core/heritage");
const categoryManager = Cc["@mozilla.org/categorymanager;1"]
.getService(Ci.nsICategoryManager);
loader.lazyRequireGetter(this, "NetworkHelper",
"devtools/shared/webconsole/network-helper");
// Constants
const JSON_TYPE = "application/json";
const CONTRACT_ID = "@mozilla.org/devtools/jsonview-sniffer;1";
const CLASS_ID = components.ID("{4148c488-dca1-49fc-a621-2a0097a62422}");
const CLASS_DESCRIPTION = "JSONView content sniffer";
const CLASS_ID = "{4148c488-dca1-49fc-a621-2a0097a62422}";
const JSON_VIEW_MIME_TYPE = "application/vnd.mozilla.json.view";
const JSON_VIEW_TYPE = "JSON View";
const CONTENT_SNIFFER_CATEGORY = "net-content-sniffers";
function isTopLevelLoad(request) {
let loadInfo = request.loadInfo;
if (loadInfo && loadInfo.isTopLevelLoad) {
return (request.loadFlags & Ci.nsIChannel.LOAD_DOCUMENT_URI);
}
return false;
}
/**
* This component represents a sniffer (implements nsIContentSniffer
* interface) responsible for changing top level 'application/json'
@ -38,21 +33,24 @@ function isTopLevelLoad(request) {
* This internal type is consequently rendered by JSON View component
* that represents the JSON through a viewer interface.
*/
function Sniffer() {}
var Sniffer = Class({
extends: Unknown,
Sniffer.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentSniffer]),
interfaces: [
"nsIContentSniffer",
],
get wrappedJSObject() {
return this;
},
getMIMETypeFromContent: function (request, data, length) {
if (request instanceof Ci.nsIChannel) {
// JSON View is enabled only for top level loads only.
if (!isTopLevelLoad(request)) {
if (!NetworkHelper.isTopLevelLoad(request)) {
return "";
}
if (request instanceof Ci.nsIChannel) {
try {
if (request.contentDisposition ==
Ci.nsIChannel.DISPOSITION_ATTACHMENT) {
@ -71,23 +69,19 @@ Sniffer.prototype = {
return "";
}
};
});
const Factory = {
createInstance: function (outer, iid) {
if (outer) {
throw Cr.NS_ERROR_NO_AGGREGATION;
}
return new Sniffer();
}
};
var service = xpcom.Service({
id: components.ID(CLASS_ID),
contract: CONTRACT_ID,
Component: Sniffer,
register: false,
unregister: false
});
function register() {
if (!registrar.isCIDRegistered(CLASS_ID)) {
registrar.registerFactory(CLASS_ID,
CLASS_DESCRIPTION,
CONTRACT_ID,
Factory);
if (!xpcom.isRegistered(service)) {
xpcom.register(service);
categoryManager.addCategoryEntry(CONTENT_SNIFFER_CATEGORY, JSON_VIEW_TYPE,
CONTRACT_ID, false, false);
return true;
@ -97,10 +91,10 @@ function register() {
}
function unregister() {
if (registrar.isCIDRegistered(CLASS_ID)) {
registrar.unregisterFactory(CLASS_ID, Factory);
if (xpcom.isRegistered(service)) {
categoryManager.deleteCategoryEntry(CONTENT_SNIFFER_CATEGORY,
JSON_VIEW_TYPE, false);
xpcom.unregister(service);
return true;
}
return false;