forked from mirrors/gecko-dev
In order to rewrite the Gecko Profiler add-on as a WebExtension, we need an API for the profiler which allows us to control the nsIProfiler, and symbolicate the stacks that it provides. This is the implementation of the simpler parts of that API. TODO: - Support profiling of remote targets through a new devtools API. - Support the dump_syms breakpad code which was asm.js in the old extension by directly calling into native code. - Figure out a faster way to send the large volume of data from getSymbols all the way from our extension down to the content process and then into the page's context. MozReview-Commit-ID: JzDbV4l2eXd --HG-- extra : rebase_source : fee9acfaa522372c22c61f9b0f1cab13d5da2a86
233 lines
6.6 KiB
JavaScript
233 lines
6.6 KiB
JavaScript
"use strict";
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(global, "EventEmitter",
|
|
"resource://devtools/shared/event-emitter.js");
|
|
|
|
// This function is pretty tightly tied to Extension.jsm.
|
|
// Its job is to fill in the |tab| property of the sender.
|
|
function getSender(extension, target, sender) {
|
|
let tabId;
|
|
if ("tabId" in sender) {
|
|
// The message came from a privileged extension page running in a tab. In
|
|
// that case, it should include a tabId property (which is filled in by the
|
|
// page-open listener below).
|
|
tabId = sender.tabId;
|
|
delete sender.tabId;
|
|
} else if (target instanceof Ci.nsIDOMXULElement) {
|
|
tabId = tabTracker.getBrowserData(target).tabId;
|
|
}
|
|
|
|
if (tabId) {
|
|
let tab = extension.tabManager.get(tabId, null);
|
|
if (tab) {
|
|
sender.tab = tab.convert();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Used by Extension.jsm
|
|
global.tabGetSender = getSender;
|
|
|
|
/* eslint-disable mozilla/balanced-listeners */
|
|
extensions.on("uninstall", (msg, extension) => {
|
|
if (extension.uninstallURL) {
|
|
let browser = windowTracker.topWindow.gBrowser;
|
|
browser.addTab(extension.uninstallURL, {relatedToCurrent: true});
|
|
}
|
|
});
|
|
|
|
extensions.on("page-shutdown", (type, context) => {
|
|
if (context.viewType == "tab") {
|
|
if (context.extension.id !== context.xulBrowser.contentPrincipal.addonId) {
|
|
// Only close extension tabs.
|
|
// This check prevents about:addons from closing when it contains a
|
|
// WebExtension as an embedded inline options page.
|
|
return;
|
|
}
|
|
let {gBrowser} = context.xulBrowser.ownerGlobal;
|
|
if (gBrowser) {
|
|
let nativeTab = gBrowser.getTabForBrowser(context.xulBrowser);
|
|
if (nativeTab) {
|
|
gBrowser.removeTab(nativeTab);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
/* eslint-enable mozilla/balanced-listeners */
|
|
/* eslint-enable mozilla/balanced-listeners */
|
|
|
|
global.openOptionsPage = (extension) => {
|
|
let window = windowTracker.topWindow;
|
|
if (!window) {
|
|
return Promise.reject({message: "No browser window available"});
|
|
}
|
|
|
|
if (extension.manifest.options_ui.open_in_tab) {
|
|
window.switchToTabHavingURI(extension.manifest.options_ui.page, true);
|
|
return Promise.resolve();
|
|
}
|
|
|
|
let viewId = `addons://detail/${encodeURIComponent(extension.id)}/preferences`;
|
|
|
|
return window.BrowserOpenAddonsMgr(viewId);
|
|
};
|
|
|
|
extensions.registerModules({
|
|
bookmarks: {
|
|
url: "chrome://browser/content/ext-bookmarks.js",
|
|
schema: "chrome://browser/content/schemas/bookmarks.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["bookmarks"],
|
|
],
|
|
},
|
|
browserAction: {
|
|
url: "chrome://browser/content/ext-browserAction.js",
|
|
schema: "chrome://browser/content/schemas/browser_action.json",
|
|
scopes: ["addon_parent"],
|
|
manifest: ["browser_action"],
|
|
paths: [
|
|
["browserAction"],
|
|
],
|
|
},
|
|
browsingData: {
|
|
url: "chrome://browser/content/ext-browsingData.js",
|
|
schema: "chrome://browser/content/schemas/browsing_data.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["browsingData"],
|
|
],
|
|
},
|
|
chrome_settings_overrides: {
|
|
url: "chrome://browser/content/ext-chrome-settings-overrides.js",
|
|
scopes: [],
|
|
schema: "chrome://browser/content/schemas/chrome_settings_overrides.json",
|
|
manifest: ["chrome_settings_overrides"],
|
|
},
|
|
commands: {
|
|
url: "chrome://browser/content/ext-commands.js",
|
|
schema: "chrome://browser/content/schemas/commands.json",
|
|
scopes: ["addon_parent"],
|
|
manifest: ["commands"],
|
|
paths: [
|
|
["commands"],
|
|
],
|
|
},
|
|
contextMenus: {
|
|
url: "chrome://browser/content/ext-contextMenus.js",
|
|
schema: "chrome://browser/content/schemas/context_menus.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["contextMenus"],
|
|
],
|
|
},
|
|
devtools: {
|
|
url: "chrome://browser/content/ext-devtools.js",
|
|
schema: "chrome://browser/content/schemas/devtools.json",
|
|
scopes: ["devtools_parent"],
|
|
manifest: ["devtools_page"],
|
|
paths: [
|
|
["devtools"],
|
|
],
|
|
},
|
|
devtools_inspectedWindow: {
|
|
url: "chrome://browser/content/ext-devtools-inspectedWindow.js",
|
|
schema: "chrome://browser/content/schemas/devtools_inspected_window.json",
|
|
scopes: ["devtools_parent"],
|
|
paths: [
|
|
["devtools", "inspectedWindow"],
|
|
],
|
|
},
|
|
devtools_network: {
|
|
url: "chrome://browser/content/ext-devtools-network.js",
|
|
schema: "chrome://browser/content/schemas/devtools_network.json",
|
|
scopes: ["devtools_parent"],
|
|
paths: [
|
|
["devtools", "network"],
|
|
],
|
|
},
|
|
devtools_panels: {
|
|
url: "chrome://browser/content/ext-devtools-panels.js",
|
|
schema: "chrome://browser/content/schemas/devtools_panels.json",
|
|
scopes: ["devtools_parent"],
|
|
paths: [
|
|
["devtools", "panels"],
|
|
],
|
|
},
|
|
history: {
|
|
url: "chrome://browser/content/ext-history.js",
|
|
schema: "chrome://browser/content/schemas/history.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["history"],
|
|
],
|
|
},
|
|
omnibox: {
|
|
url: "chrome://browser/content/ext-omnibox.js",
|
|
schema: "chrome://browser/content/schemas/omnibox.json",
|
|
scopes: ["addon_parent"],
|
|
manifest: ["omnibox"],
|
|
paths: [
|
|
["omnibox"],
|
|
],
|
|
},
|
|
pageAction: {
|
|
url: "chrome://browser/content/ext-pageAction.js",
|
|
schema: "chrome://browser/content/schemas/page_action.json",
|
|
scopes: ["addon_parent"],
|
|
manifest: ["page_action"],
|
|
paths: [
|
|
["pageAction"],
|
|
],
|
|
},
|
|
geckoProfiler: {
|
|
url: "chrome://browser/content/ext-geckoProfiler.js",
|
|
schema: "chrome://browser/content/schemas/geckoProfiler.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["geckoProfiler"],
|
|
],
|
|
},
|
|
sessions: {
|
|
url: "chrome://browser/content/ext-sessions.js",
|
|
schema: "chrome://browser/content/schemas/sessions.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["sessions"],
|
|
],
|
|
},
|
|
sidebarAction: {
|
|
url: "chrome://browser/content/ext-sidebarAction.js",
|
|
schema: "chrome://browser/content/schemas/sidebar_action.json",
|
|
scopes: ["addon_parent"],
|
|
manifest: ["sidebar_action"],
|
|
paths: [
|
|
["sidebarAction"],
|
|
],
|
|
},
|
|
tabs: {
|
|
url: "chrome://browser/content/ext-tabs.js",
|
|
schema: "chrome://browser/content/schemas/tabs.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["tabs"],
|
|
],
|
|
},
|
|
urlOverrides: {
|
|
url: "chrome://browser/content/ext-url-overrides.js",
|
|
schema: "chrome://browser/content/schemas/url_overrides.json",
|
|
scopes: ["addon_parent"],
|
|
manifest: ["chrome_url_overrides"],
|
|
paths: [
|
|
["urlOverrides"],
|
|
],
|
|
},
|
|
windows: {
|
|
url: "chrome://browser/content/ext-windows.js",
|
|
schema: "chrome://browser/content/schemas/windows.json",
|
|
scopes: ["addon_parent"],
|
|
paths: [
|
|
["windows"],
|
|
],
|
|
},
|
|
});
|