diff options
Diffstat (limited to 'browser/extensions/report-site-issue/experimentalAPIs/tabExtras.js')
-rw-r--r-- | browser/extensions/report-site-issue/experimentalAPIs/tabExtras.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/browser/extensions/report-site-issue/experimentalAPIs/tabExtras.js b/browser/extensions/report-site-issue/experimentalAPIs/tabExtras.js new file mode 100644 index 0000000000..12ccd91e05 --- /dev/null +++ b/browser/extensions/report-site-issue/experimentalAPIs/tabExtras.js @@ -0,0 +1,99 @@ +/* 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; +} |