forked from mirrors/gecko-dev
99 lines
2.7 KiB
JavaScript
99 lines
2.7 KiB
JavaScript
/* 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";
|
|
|
|
/* global ExtensionAPI, XPCOMUtils, Services */
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(
|
|
this,
|
|
"resProto",
|
|
"@mozilla.org/network/protocol;1?name=resource",
|
|
"nsISubstitutingProtocolHandler"
|
|
);
|
|
|
|
this.tabExtras = class extends ExtensionAPI {
|
|
constructor(extension) {
|
|
super(extension);
|
|
this._registerActorModule();
|
|
}
|
|
|
|
getAPI(context) {
|
|
const { tabManager } = context.extension;
|
|
return {
|
|
tabExtras: {
|
|
async getWebcompatInfo(tabId) {
|
|
const {
|
|
browser: { browsingContext },
|
|
incognito,
|
|
} = tabManager.get(tabId);
|
|
const actors = gatherActors("ReportSiteIssueHelper", browsingContext);
|
|
const promises = actors.map(actor => actor.sendQuery("GetLog"));
|
|
const logs = await Promise.all(promises);
|
|
const info = await actors[0].sendQuery("GetBlockingStatus");
|
|
info.hasMixedActiveContentBlocked = !!(
|
|
browsingContext.secureBrowserUI.state &
|
|
Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT
|
|
);
|
|
info.hasMixedDisplayContentBlocked = !!(
|
|
browsingContext.secureBrowserUI.state &
|
|
Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_DISPLAY_CONTENT
|
|
);
|
|
info.isPB = incognito;
|
|
info.log = logs
|
|
.flat()
|
|
.sort((a, b) => a.timeStamp - b.timeStamp)
|
|
.map(m => m.message);
|
|
return info;
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
onShutdown(isAppShutdown) {
|
|
this._unregisterActorModule();
|
|
}
|
|
|
|
_registerActorModule() {
|
|
resProto.setSubstitution(
|
|
"report-site-issue",
|
|
Services.io.newURI(
|
|
"experimentalAPIs/actors/",
|
|
null,
|
|
this.extension.rootURI
|
|
)
|
|
);
|
|
ChromeUtils.registerWindowActor("ReportSiteIssueHelper", {
|
|
child: {
|
|
moduleURI: "resource://report-site-issue/tabExtrasActor.jsm",
|
|
},
|
|
allFrames: true,
|
|
});
|
|
}
|
|
|
|
_unregisterActorModule() {
|
|
ChromeUtils.unregisterWindowActor("ReportSiteIssueHelper");
|
|
resProto.setSubstitution("report-site-issue", null);
|
|
}
|
|
};
|
|
|
|
function getActorForBrowsingContext(name, browsingContext) {
|
|
const windowGlobal = browsingContext.currentWindowGlobal;
|
|
return windowGlobal ? windowGlobal.getActor(name) : null;
|
|
}
|
|
|
|
function gatherActors(name, browsingContext) {
|
|
const list = [];
|
|
|
|
const actor = getActorForBrowsingContext(name, browsingContext);
|
|
if (actor) {
|
|
list.push(actor);
|
|
}
|
|
|
|
for (const child of browsingContext.children) {
|
|
list.push(...gatherActors(name, child));
|
|
}
|
|
|
|
return list;
|
|
}
|