Source code
Revision control
Copy as Markdown
Other Tools
/* 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
"use strict";
const lazy = {};
ChromeUtils.defineESModuleGetters(
lazy,
{
NetworkUtils:
"resource://devtools/shared/network-observer/NetworkUtils.sys.mjs",
},
{ global: "contextual" }
);
const OBSERVER_TOPIC_BEFORE_STOP_REQUEST = "http-on-before-stop-request";
/**
* Watches for http-on-before-stop-request notifications in the content process
* to retrieve the decoded body size for network requests. The decoded body size
* is only correctly set in content processes, not in the parent process.
*/
class NetworkEventDecodedBodySizeWatcher {
/**
* Start watching for decoded body sizes for all network requests related to a
* given Target Actor.
*
* @param TargetActor targetActor
* The target actor from which we should observe the decoded body sizes
* @param Object options
* Dictionary object with following attributes:
* - onAvailable: mandatory
* This will be called for each resource.
*/
async watch(targetActor, { onAvailable }) {
this.onDecodedBodySizeAvailable = onAvailable;
this.targetActor = targetActor;
Services.obs.addObserver(this, OBSERVER_TOPIC_BEFORE_STOP_REQUEST);
}
/**
* Stop watching for decoded body sizes related to a given Target Actor.
*/
destroy() {
Services.obs.removeObserver(this, OBSERVER_TOPIC_BEFORE_STOP_REQUEST);
}
observe(subject, topic) {
if (topic !== OBSERVER_TOPIC_BEFORE_STOP_REQUEST) {
return;
}
let channel;
try {
channel = subject.QueryInterface(Ci.nsIHttpChannel);
} catch (e) {
return;
}
if (!channel.decodedBodySize) {
// decodedBodySize is only set via the compression converter stats, so it is
// 0 for non-compressed responses. Rely on parent process data for those.
return;
}
if (
!lazy.NetworkUtils.matchRequest(channel, {
targetActor: this.targetActor,
})
) {
return;
}
this.onDecodedBodySizeAvailable([
{
resourceId: channel.channelId,
decodedBodySize: channel.decodedBodySize,
},
]);
}
}
module.exports = NetworkEventDecodedBodySizeWatcher;