2020-06-03 02:51:13 +03:00
|
|
|
/* 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.interfaces;
|
|
|
|
const Cr = Components.results;
|
|
|
|
const Cu = Components.utils;
|
|
|
|
|
|
|
|
const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
|
|
|
|
|
|
|
|
const helper = new Helper();
|
|
|
|
|
|
|
|
class NetworkMonitor {
|
|
|
|
constructor(rootDocShell, frameTree) {
|
|
|
|
this._frameTree = frameTree;
|
|
|
|
this._requestDetails = new Map();
|
|
|
|
|
|
|
|
this._eventListeners = [
|
|
|
|
helper.addObserver(this._onRequest.bind(this), 'http-on-opening-request'),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
_onRequest(channel) {
|
|
|
|
if (!(channel instanceof Ci.nsIHttpChannel))
|
|
|
|
return;
|
|
|
|
const httpChannel = channel.QueryInterface(Ci.nsIHttpChannel);
|
|
|
|
const loadContext = helper.getLoadContext(httpChannel);
|
|
|
|
if (!loadContext)
|
|
|
|
return;
|
2020-06-17 03:19:01 +03:00
|
|
|
try {
|
|
|
|
const window = loadContext.associatedWindow;
|
|
|
|
const frame = this._frameTree.frameForDocShell(window.docShell);
|
|
|
|
if (!frame)
|
|
|
|
return;
|
|
|
|
this._requestDetails.set(httpChannel.channelId, {
|
|
|
|
frameId: frame.id(),
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
// Accessing loadContext.associatedWindow sometimes throws.
|
|
|
|
}
|
2020-06-03 02:51:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
requestDetails(channelId) {
|
|
|
|
return this._requestDetails.get(channelId) || null;
|
|
|
|
}
|
|
|
|
|
|
|
|
dispose() {
|
|
|
|
this._requestDetails.clear();
|
|
|
|
helper.removeListeners(this._eventListeners);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var EXPORTED_SYMBOLS = ['NetworkMonitor'];
|
|
|
|
this.NetworkMonitor = NetworkMonitor;
|
|
|
|
|