зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1482070 - Move StackTraceCollector to its own file. r=Honza
Summary: Depends On D3603 Reviewers: Honza! Tags: #secure-revision Bug #: 1482070 Differential Revision: https://phabricator.services.mozilla.com/D3604 MozReview-Commit-ID: 53aaLHR6lv
This commit is contained in:
Родитель
32c1768465
Коммит
5e3572023f
|
@ -6,4 +6,5 @@
|
|||
|
||||
DevToolsModules(
|
||||
'channel-event-sink.js',
|
||||
'stack-trace-collector.js',
|
||||
)
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
/* -*- 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";
|
||||
|
||||
const {Ci, components} = require("chrome");
|
||||
const Services = require("Services");
|
||||
|
||||
loader.lazyRequireGetter(this, "ChannelEventSinkFactory",
|
||||
"devtools/server/actors/network-monitor/channel-event-sink",
|
||||
true);
|
||||
loader.lazyRequireGetter(this, "matchRequest",
|
||||
"devtools/server/actors/network-monitor/network-observer",
|
||||
true);
|
||||
|
||||
function StackTraceCollector(filters, netmonitors) {
|
||||
this.filters = filters;
|
||||
this.stacktracesById = new Map();
|
||||
this.netmonitors = netmonitors;
|
||||
}
|
||||
|
||||
StackTraceCollector.prototype = {
|
||||
init() {
|
||||
Services.obs.addObserver(this, "http-on-opening-request");
|
||||
ChannelEventSinkFactory.getService().registerCollector(this);
|
||||
this.onGetStack = this.onGetStack.bind(this);
|
||||
for (const { messageManager } of this.netmonitors) {
|
||||
messageManager.addMessageListener("debug:request-stack", this.onGetStack);
|
||||
}
|
||||
},
|
||||
|
||||
destroy() {
|
||||
Services.obs.removeObserver(this, "http-on-opening-request");
|
||||
ChannelEventSinkFactory.getService().unregisterCollector(this);
|
||||
for (const { messageManager } of this.netmonitors) {
|
||||
messageManager.removeMessageListener("debug:request-stack", this.onGetStack);
|
||||
}
|
||||
},
|
||||
|
||||
_saveStackTrace(channel, stacktrace) {
|
||||
for (const { messageManager } of this.netmonitors) {
|
||||
messageManager.sendAsyncMessage("debug:request-stack-available", {
|
||||
channelId: channel.channelId,
|
||||
stacktrace: stacktrace && stacktrace.length > 0
|
||||
});
|
||||
}
|
||||
this.stacktracesById.set(channel.channelId, stacktrace);
|
||||
},
|
||||
|
||||
observe(subject) {
|
||||
const channel = subject.QueryInterface(Ci.nsIHttpChannel);
|
||||
|
||||
if (!matchRequest(channel, this.filters)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert the nsIStackFrame XPCOM objects to a nice JSON that can be
|
||||
// passed around through message managers etc.
|
||||
let frame = components.stack;
|
||||
const stacktrace = [];
|
||||
if (frame && frame.caller) {
|
||||
frame = frame.caller;
|
||||
while (frame) {
|
||||
stacktrace.push({
|
||||
filename: frame.filename,
|
||||
lineNumber: frame.lineNumber,
|
||||
columnNumber: frame.columnNumber,
|
||||
functionName: frame.name,
|
||||
asyncCause: frame.asyncCause,
|
||||
});
|
||||
frame = frame.caller || frame.asyncCaller;
|
||||
}
|
||||
}
|
||||
|
||||
this._saveStackTrace(channel, stacktrace);
|
||||
},
|
||||
|
||||
// eslint-disable-next-line no-shadow
|
||||
onChannelRedirect(oldChannel, newChannel, flags) {
|
||||
// We can be called with any nsIChannel, but are interested only in HTTP channels
|
||||
try {
|
||||
oldChannel.QueryInterface(Ci.nsIHttpChannel);
|
||||
newChannel.QueryInterface(Ci.nsIHttpChannel);
|
||||
} catch (ex) {
|
||||
return;
|
||||
}
|
||||
|
||||
const oldId = oldChannel.channelId;
|
||||
const stacktrace = this.stacktracesById.get(oldId);
|
||||
if (stacktrace) {
|
||||
this._saveStackTrace(newChannel, stacktrace);
|
||||
}
|
||||
},
|
||||
|
||||
getStackTrace(channelId) {
|
||||
const trace = this.stacktracesById.get(channelId);
|
||||
this.stacktracesById.delete(channelId);
|
||||
return trace;
|
||||
},
|
||||
|
||||
onGetStack(msg) {
|
||||
const messageManager = msg.target;
|
||||
const channelId = msg.data;
|
||||
const stack = this.getStackTrace(channelId);
|
||||
messageManager.sendAsyncMessage("debug:request-stack", {
|
||||
channelId,
|
||||
stack,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
exports.StackTraceCollector = StackTraceCollector;
|
|
@ -21,7 +21,7 @@ const ErrorDocs = require("devtools/server/actors/errordocs");
|
|||
|
||||
loader.lazyRequireGetter(this, "NetworkMonitorActor", "devtools/server/actors/network-monitor", true);
|
||||
loader.lazyRequireGetter(this, "ConsoleProgressListener", "devtools/server/actors/webconsole/listeners/console-progress", true);
|
||||
loader.lazyRequireGetter(this, "StackTraceCollector", "devtools/shared/webconsole/network-monitor", true);
|
||||
loader.lazyRequireGetter(this, "StackTraceCollector", "devtools/server/actors/network-monitor/stack-trace-collector", true);
|
||||
loader.lazyRequireGetter(this, "JSPropertyProvider", "devtools/shared/webconsole/js-property-provider", true);
|
||||
loader.lazyRequireGetter(this, "Parser", "resource://devtools/shared/Parser.jsm", true);
|
||||
loader.lazyRequireGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm", true);
|
||||
|
|
|
@ -102,104 +102,6 @@ function matchRequest(channel, filters) {
|
|||
return false;
|
||||
}
|
||||
|
||||
function StackTraceCollector(filters, netmonitors) {
|
||||
this.filters = filters;
|
||||
this.stacktracesById = new Map();
|
||||
this.netmonitors = netmonitors;
|
||||
}
|
||||
|
||||
StackTraceCollector.prototype = {
|
||||
init() {
|
||||
Services.obs.addObserver(this, "http-on-opening-request");
|
||||
ChannelEventSinkFactory.getService().registerCollector(this);
|
||||
this.onGetStack = this.onGetStack.bind(this);
|
||||
for (const { messageManager } of this.netmonitors) {
|
||||
messageManager.addMessageListener("debug:request-stack", this.onGetStack);
|
||||
}
|
||||
},
|
||||
|
||||
destroy() {
|
||||
Services.obs.removeObserver(this, "http-on-opening-request");
|
||||
ChannelEventSinkFactory.getService().unregisterCollector(this);
|
||||
for (const { messageManager } of this.netmonitors) {
|
||||
messageManager.removeMessageListener("debug:request-stack", this.onGetStack);
|
||||
}
|
||||
},
|
||||
|
||||
_saveStackTrace(channel, stacktrace) {
|
||||
for (const { messageManager } of this.netmonitors) {
|
||||
messageManager.sendAsyncMessage("debug:request-stack-available", {
|
||||
channelId: channel.channelId,
|
||||
stacktrace: stacktrace && stacktrace.length > 0
|
||||
});
|
||||
}
|
||||
this.stacktracesById.set(channel.channelId, stacktrace);
|
||||
},
|
||||
|
||||
observe(subject) {
|
||||
const channel = subject.QueryInterface(Ci.nsIHttpChannel);
|
||||
|
||||
if (!matchRequest(channel, this.filters)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert the nsIStackFrame XPCOM objects to a nice JSON that can be
|
||||
// passed around through message managers etc.
|
||||
let frame = components.stack;
|
||||
const stacktrace = [];
|
||||
if (frame && frame.caller) {
|
||||
frame = frame.caller;
|
||||
while (frame) {
|
||||
stacktrace.push({
|
||||
filename: frame.filename,
|
||||
lineNumber: frame.lineNumber,
|
||||
columnNumber: frame.columnNumber,
|
||||
functionName: frame.name,
|
||||
asyncCause: frame.asyncCause,
|
||||
});
|
||||
frame = frame.caller || frame.asyncCaller;
|
||||
}
|
||||
}
|
||||
|
||||
this._saveStackTrace(channel, stacktrace);
|
||||
},
|
||||
|
||||
// eslint-disable-next-line no-shadow
|
||||
onChannelRedirect(oldChannel, newChannel, flags) {
|
||||
// We can be called with any nsIChannel, but are interested only in HTTP channels
|
||||
try {
|
||||
oldChannel.QueryInterface(Ci.nsIHttpChannel);
|
||||
newChannel.QueryInterface(Ci.nsIHttpChannel);
|
||||
} catch (ex) {
|
||||
return;
|
||||
}
|
||||
|
||||
const oldId = oldChannel.channelId;
|
||||
const stacktrace = this.stacktracesById.get(oldId);
|
||||
if (stacktrace) {
|
||||
this._saveStackTrace(newChannel, stacktrace);
|
||||
}
|
||||
},
|
||||
|
||||
getStackTrace(channelId) {
|
||||
const trace = this.stacktracesById.get(channelId);
|
||||
this.stacktracesById.delete(channelId);
|
||||
return trace;
|
||||
},
|
||||
|
||||
onGetStack(msg) {
|
||||
const messageManager = msg.target;
|
||||
const channelId = msg.data;
|
||||
const stack = this.getStackTrace(channelId);
|
||||
messageManager.sendAsyncMessage("debug:request-stack", {
|
||||
channelId,
|
||||
stack,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
exports.StackTraceCollector = StackTraceCollector;
|
||||
|
||||
/**
|
||||
* The network response listener implements the nsIStreamListener and
|
||||
* nsIRequestObserver interfaces. This is used within the NetworkMonitor feature
|
||||
|
|
Загрузка…
Ссылка в новой задаче