web-ext-types
Version:
TypeScript type definitions for WebExtensions
1,989 lines (1,768 loc) • 56.3 kB
TypeScript
// 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/.
interface EvListener<T extends Function> {
addListener: (callback: T) => void;
removeListener: (listener: T) => void;
hasListener: (listener: T) => boolean;
}
type Listener<T> = EvListener<(arg: T) => void>;
declare namespace browser.alarms {
type Alarm = {
name: string;
scheduledTime: number;
periodInMinutes?: number;
};
type When = {
when?: number;
periodInMinutes?: number;
};
type DelayInMinutes = {
delayInMinutes?: number;
periodInMinutes?: number;
};
function create(name?: string, alarmInfo?: When | DelayInMinutes): void;
function get(name?: string): Promise<Alarm | undefined>;
function getAll(): Promise<Alarm[]>;
function clear(name?: string): Promise<boolean>;
function clearAll(): Promise<boolean>;
const onAlarm: Listener<Alarm>;
}
declare namespace browser.bookmarks {
type BookmarkTreeNodeUnmodifiable = "managed";
type BookmarkTreeNodeType = "bookmark" | "folder" | "separator";
type BookmarkTreeNode = {
id: string;
parentId?: string;
index?: number;
url?: string;
title: string;
dateAdded?: number;
dateGroupModified?: number;
unmodifiable?: BookmarkTreeNodeUnmodifiable;
children?: BookmarkTreeNode[];
type?: BookmarkTreeNodeType;
};
type CreateDetails = {
parentId?: string;
index?: number;
title?: string;
type?: BookmarkTreeNodeType;
url?: string;
};
function create(bookmark: CreateDetails): Promise<BookmarkTreeNode>;
function get(idOrIdList: string | string[]): Promise<BookmarkTreeNode[]>;
function getChildren(id: string): Promise<BookmarkTreeNode[]>;
function getRecent(numberOfItems: number): Promise<BookmarkTreeNode[]>;
function getSubTree(id: string): Promise<[BookmarkTreeNode]>;
function getTree(): Promise<[BookmarkTreeNode]>;
type Destination =
| {
parentId: string;
index?: number;
}
| {
index: number;
parentId?: string;
};
function move(
id: string,
destination: Destination
): Promise<BookmarkTreeNode>;
function remove(id: string): Promise<void>;
function removeTree(id: string): Promise<void>;
function search(
query:
| string
| {
query?: string;
url?: string;
title?: string;
}
): Promise<BookmarkTreeNode[]>;
function update(
id: string,
changes: { title: string; url: string }
): Promise<BookmarkTreeNode>;
const onCreated: EvListener<(id: string, bookmark: BookmarkTreeNode) => void>;
const onRemoved: EvListener<
(
id: string,
removeInfo: {
parentId: string;
index: number;
node: BookmarkTreeNode;
}
) => void
>;
const onChanged: EvListener<
(
id: string,
changeInfo: {
title: string;
url?: string;
}
) => void
>;
const onMoved: EvListener<
(
id: string,
moveInfo: {
parentId: string;
index: number;
oldParentId: string;
oldIndex: number;
}
) => void
>;
}
declare namespace browser.browserAction {
type ColorArray = [number, number, number, number];
type ImageDataType = ImageData;
function setTitle(details: { title: string | null; tabId?: number }): void;
function getTitle(details: { tabId?: number }): Promise<string>;
type IconViaPath = {
path: string | { [size: number]: string };
tabId?: number;
};
type IconViaImageData = {
imageData: ImageDataType | { [size: number]: ImageDataType };
tabId?: number;
};
type IconReset = {
imageData?: {} | null;
path?: {} | null;
tabId?: number;
};
function setIcon(
details: IconViaPath | IconViaImageData | IconReset
): Promise<void>;
function setPopup(details: { popup: string | null; tabId?: number }): void;
function getPopup(details: { tabId?: number }): Promise<string>;
function openPopup(): Promise<void>;
function setBadgeText(details: { text: string | null; tabId?: number }): void;
function getBadgeText(details: { tabId?: number }): Promise<string>;
function setBadgeBackgroundColor(details: {
color: string | ColorArray | null;
tabId?: number;
}): void;
function getBadgeBackgroundColor(details: {
tabId?: number;
}): Promise<ColorArray>;
function setBadgeTextColor(details: {
color: string | ColorArray;
tabId?: number;
}): void;
function setBadgeTextColor(details: {
color: string | ColorArray;
windowId?: number;
}): void;
function setBadgeTextColor(details: { color: null; tabId?: number }): void;
function getBadgeTextColor(details: { tabId?: string }): Promise<ColorArray>;
function getBadgeTextColor(details: {
windowId?: string;
}): Promise<ColorArray>;
function enable(tabId?: number): void;
function disable(tabId?: number): void;
const onClicked: Listener<browser.tabs.Tab>;
}
declare namespace browser.browsingData {
type DataTypeSet = {
cache?: boolean;
cookies?: boolean;
downloads?: boolean;
fileSystems?: boolean;
formData?: boolean;
history?: boolean;
indexedDB?: boolean;
localStorage?: boolean;
passwords?: boolean;
pluginData?: boolean;
serverBoundCertificates?: boolean;
serviceWorkers?: boolean;
};
type DataRemovalOptions = {
since?: number;
originTypes?: { unprotectedWeb: boolean };
};
type ExtraDataRemovalOptions = {
hostnames?: string[]
}
function remove(
removalOptions: DataRemovalOptions,
dataTypes: DataTypeSet
): Promise<void>;
function removeCache(removalOptions?: DataRemovalOptions): Promise<void>;
function removeCookies(removalOptions: DataRemovalOptions & ExtraDataRemovalOptions): Promise<void>;
function removeLocalStorage(removalOptions: DataRemovalOptions & ExtraDataRemovalOptions): Promise<void>;
function removeDownloads(removalOptions: DataRemovalOptions): Promise<void>;
function removeFormData(removalOptions: DataRemovalOptions): Promise<void>;
function removeHistory(removalOptions: DataRemovalOptions): Promise<void>;
function removePasswords(removalOptions: DataRemovalOptions): Promise<void>;
function removePluginData(removalOptions: DataRemovalOptions): Promise<void>;
function settings(): Promise<{
options: DataRemovalOptions;
dataToRemove: DataTypeSet;
dataRemovalPermitted: DataTypeSet;
}>;
}
declare namespace browser.commands {
type Command = {
name?: string;
description?: string;
shortcut?: string;
};
function getAll(): Promise<Command[]>;
const onCommand: Listener<string>;
}
declare namespace browser.menus {
type ContextType =
| "all"
| "audio"
| "bookmarks"
| "browser_action"
| "editable"
| "frame"
| "image"
// | "launcher" unsupported
| "link"
| "page"
| "page_action"
| "password"
| "selection"
| "tab"
| "tools_menu"
| "video";
type ItemType = "normal" | "checkbox" | "radio" | "separator";
type OnClickData = {
bookmarkId?: string;
checked?: boolean;
editable: boolean;
frameId?: number;
frameUrl?: string;
linkText?: string;
linkUrl?: string;
mediaType?: string;
menuItemId: number | string;
modifiers: string[];
pageUrl?: string;
parentMenuItemId?: number | string;
selectionText?: string;
srcUrl?: string;
targetElementId?: number;
wasChecked?: boolean;
};
const ACTION_MENU_TOP_LEVEL_LIMIT: number;
function create(
createProperties: {
checked?: boolean;
command?:
| "_execute_browser_action"
| "_execute_page_action"
| "_execute_sidebar_action";
contexts?: ContextType[];
documentUrlPatterns?: string[];
enabled?: boolean;
icons?: object;
id?: string;
onclick?: (info: OnClickData, tab: browser.tabs.Tab) => void;
parentId?: number | string;
targetUrlPatterns?: string[];
title?: string;
type?: ItemType;
visible?: boolean;
},
callback?: () => void
): number | string;
function getTargetElement(targetElementId: number): object | null;
function refresh(): Promise<void>;
function remove(menuItemId: number | string): Promise<void>;
function removeAll(): Promise<void>;
function update(
id: number | string,
updateProperties: {
checked?: boolean;
command?:
| "_execute_browser_action"
| "_execute_page_action"
| "_execute_sidebar_action";
contexts?: ContextType[];
documentUrlPatterns?: string[];
enabled?: boolean;
onclick?: (info: OnClickData, tab: browser.tabs.Tab) => void;
parentId?: number | string;
targetUrlPatterns?: string[];
title?: string;
type?: ItemType;
visible?: boolean;
}
): Promise<void>;
const onClicked: EvListener<
(info: OnClickData, tab: browser.tabs.Tab) => void
>;
const onHidden: EvListener<() => void>;
const onShown: EvListener<(info: OnClickData, tab: browser.tabs.Tab) => void>;
}
declare namespace browser.contextualIdentities {
type IdentityColor =
| "blue"
| "turquoise"
| "green"
| "yellow"
| "orange"
| "red"
| "pink"
| "purple";
type IdentityIcon =
| "fingerprint"
| "briefcase"
| "dollar"
| "cart"
| "circle";
type ContextualIdentity = {
cookieStoreId: string;
color: IdentityColor;
icon: IdentityIcon;
name: string;
};
function create(details: {
name: string;
color: IdentityColor;
icon: IdentityIcon;
}): Promise<ContextualIdentity>;
function get(cookieStoreId: string): Promise<ContextualIdentity | null>;
function query(details: { name?: string }): Promise<ContextualIdentity[]>;
function update(
cookieStoreId: string,
details: {
name: string;
color: IdentityColor;
icon: IdentityIcon;
}
): Promise<ContextualIdentity>;
function remove(cookieStoreId: string): Promise<ContextualIdentity | null>;
}
declare namespace browser.cookies {
type Cookie = {
name: string;
value: string;
domain: string;
hostOnly: boolean;
path: string;
secure: boolean;
httpOnly: boolean;
session: boolean;
firstPartyDomain?: string;
sameSite: SameSiteStatus
expirationDate?: number;
storeId: string;
};
type CookieStore = {
id: string;
incognito: boolean;
tabIds: number[];
};
type SameSiteStatus =
| 'no_restriction'
| 'lax'
| 'strict'
type OnChangedCause =
| "evicted"
| "expired"
| "explicit"
| "expired_overwrite"
| "overwrite";
function get(details: {
url: string;
name: string;
storeId?: string;
firstPartyDomain?: string;
}): Promise<Cookie | null>;
function getAll(details: {
url?: string;
name?: string;
domain?: string;
path?: string;
secure?: boolean;
session?: boolean;
storeId?: string;
firstPartyDomain?: string;
}): Promise<Cookie[]>;
function set(details: {
url: string;
name?: string;
domain?: string;
path?: string;
secure?: boolean;
httpOnly?: boolean;
expirationDate?: number;
storeId?: string;
firstPartyDomain?: string;
}): Promise<Cookie>;
function remove(details: {
url: string;
name: string;
storeId?: string;
firstPartyDomain?: string;
}): Promise<Cookie | null>;
function getAllCookieStores(): Promise<CookieStore[]>;
const onChanged: Listener<{
removed: boolean;
cookie: Cookie;
cause: OnChangedCause;
}>;
}
declare namespace browser.contentScripts {
type RegisteredContentScriptOptions = {
allFrames?: boolean;
css?: ({ file: string } | { code: string })[];
excludeGlobs?: string[];
excludeMatches?: string[];
includeGlobs?: string[];
js?: ({ file: string } | { code: string })[];
matchAboutBlank?: boolean;
matches: string[];
runAt?: "document_start" | "document_end" | "document_idle";
};
type RegisteredContentScript = {
unregister: () => void;
};
function register(
contentScriptOptions: RegisteredContentScriptOptions
): Promise<RegisteredContentScript>;
}
declare namespace browser.devtools.inspectedWindow {
const tabId: number;
function eval(
expression: string
): Promise<
[
any,
| { isException: boolean; value: string }
| { isError: boolean; code: string }
]
>;
function reload(reloadOptions?: {
ignoreCache?: boolean;
userAgent?: string;
injectedScript?: string;
}): void;
}
declare namespace browser.devtools.network {
const onNavigated: Listener<string>;
}
declare namespace browser.devtools.panels {
type ExtensionPanel = {
onShown: Listener<Window>;
onHidden: Listener<void>;
};
function create(
title: string,
iconPath: string,
pagePath: string
): Promise<ExtensionPanel>;
}
declare namespace browser.downloads {
type FilenameConflictAction = "uniquify" | "overwrite" | "prompt";
type InterruptReason =
| "FILE_FAILED"
| "FILE_ACCESS_DENIED"
| "FILE_NO_SPACE"
| "FILE_NAME_TOO_LONG"
| "FILE_TOO_LARGE"
| "FILE_VIRUS_INFECTED"
| "FILE_TRANSIENT_ERROR"
| "FILE_BLOCKED"
| "FILE_SECURITY_CHECK_FAILED"
| "FILE_TOO_SHORT"
| "NETWORK_FAILED"
| "NETWORK_TIMEOUT"
| "NETWORK_DISCONNECTED"
| "NETWORK_SERVER_DOWN"
| "NETWORK_INVALID_REQUEST"
| "SERVER_FAILED"
| "SERVER_NO_RANGE"
| "SERVER_BAD_CONTENT"
| "SERVER_UNAUTHORIZED"
| "SERVER_CERT_PROBLEM"
| "SERVER_FORBIDDEN"
| "USER_CANCELED"
| "USER_SHUTDOWN"
| "CRASH";
type DangerType =
| "file"
| "url"
| "content"
| "uncommon"
| "host"
| "unwanted"
| "safe"
| "accepted";
type State = "in_progress" | "interrupted" | "complete";
type DownloadItem = {
id: number;
url: string;
referrer: string;
filename: string;
incognito: boolean;
danger: string;
mime: string;
startTime: string;
endTime?: string;
estimatedEndTime?: string;
state: string;
paused: boolean;
canResume: boolean;
error?: string;
bytesReceived: number;
totalBytes: number;
fileSize: number;
exists: boolean;
byExtensionId?: string;
byExtensionName?: string;
};
type Delta<T> = {
current?: T;
previous?: T;
};
type StringDelta = Delta<string>;
type DoubleDelta = Delta<number>;
type BooleanDelta = Delta<boolean>;
type DownloadTime = Date | string | number;
type DownloadQuery = {
query?: string[];
startedBefore?: DownloadTime;
startedAfter?: DownloadTime;
endedBefore?: DownloadTime;
endedAfter?: DownloadTime;
totalBytesGreater?: number;
totalBytesLess?: number;
filenameRegex?: string;
urlRegex?: string;
limit?: number;
orderBy?: string;
id?: number;
url?: string;
filename?: string;
danger?: DangerType;
mime?: string;
startTime?: string;
endTime?: string;
state?: State;
paused?: boolean;
error?: InterruptReason;
bytesReceived?: number;
totalBytes?: number;
fileSize?: number;
exists?: boolean;
};
function download(options: {
url: string;
filename?: string;
conflictAction?: string;
saveAs?: boolean;
method?: string;
headers?: { [key: string]: string };
body?: string;
}): Promise<number>;
function search(query: DownloadQuery): Promise<DownloadItem[]>;
function pause(downloadId: number): Promise<void>;
function resume(downloadId: number): Promise<void>;
function cancel(downloadId: number): Promise<void>;
// unsupported: function getFileIcon(downloadId: number, options?: { size?: number }):
// Promise<string>;
function open(downloadId: number): Promise<void>;
function show(downloadId: number): Promise<void>;
function showDefaultFolder(): void;
function erase(query: DownloadQuery): Promise<number[]>;
function removeFile(downloadId: number): Promise<void>;
// unsupported: function acceptDanger(downloadId: number): Promise<void>;
// unsupported: function drag(downloadId: number): Promise<void>;
// unsupported: function setShelfEnabled(enabled: boolean): void;
const onCreated: Listener<DownloadItem>;
const onErased: Listener<number>;
const onChanged: Listener<{
id: number;
url?: StringDelta;
filename?: StringDelta;
danger?: StringDelta;
mime?: StringDelta;
startTime?: StringDelta;
endTime?: StringDelta;
state?: StringDelta;
canResume?: BooleanDelta;
paused?: BooleanDelta;
error?: StringDelta;
totalBytes?: DoubleDelta;
fileSize?: DoubleDelta;
exists?: BooleanDelta;
}>;
}
declare namespace browser.events {
type UrlFilter = {
hostContains?: string;
hostEquals?: string;
hostPrefix?: string;
hostSuffix?: string;
pathContains?: string;
pathEquals?: string;
pathPrefix?: string;
pathSuffix?: string;
queryContains?: string;
queryEquals?: string;
queryPrefix?: string;
querySuffix?: string;
urlContains?: string;
urlEquals?: string;
urlMatches?: string;
originAndPathMatches?: string;
urlPrefix?: string;
urlSuffix?: string;
schemes?: string[];
ports?: Array<number | number[]>;
};
}
declare namespace browser.extension {
type ViewType = "tab" | "notification" | "popup";
const lastError: string | null;
const inIncognitoContext: boolean;
function getURL(path: string): string;
function getViews(fetchProperties?: {
type?: ViewType;
windowId?: number;
}): Window[];
function getBackgroundPage(): Window;
function isAllowedIncognitoAccess(): Promise<boolean>;
function isAllowedFileSchemeAccess(): Promise<boolean>;
// unsupported: events as they are deprecated
}
declare namespace browser.extensionTypes {
type ImageFormat = "jpeg" | "png";
type ImageDetails = {
format: ImageFormat;
quality: number;
};
type RunAt = "document_start" | "document_end" | "document_idle";
type InjectDetails = {
allFrames?: boolean;
code?: string;
file?: string;
frameId?: number;
matchAboutBlank?: boolean;
runAt?: RunAt;
};
type InjectDetailsCSS = InjectDetails & { cssOrigin?: "user" | "author" };
}
declare namespace browser.find {
type FindOptions = {
tabid: number;
caseSensitive: boolean;
entireWord: boolean;
includeRangeData: boolean;
includeRectData: boolean;
};
type FindResults = {
count: number;
rangeData?: RangeData[];
rectData?: RectData[];
};
type RangeData = {
framePos: number;
startTextNodePos: number;
endTextNodePos: number;
startOffset: number;
endOffset: number;
text: string;
};
type RectData = {
rectsAndTexts: RectsAndTexts;
text: string;
};
type RectsAndTexts = {
rectList: RectItem[];
textList: string[];
};
type RectItem = {
top: number;
left: number;
bottom: number;
right: number;
};
function find(query: string, object?: FindOptions): Promise<FindResults>;
function highlightResults(): void;
function removeHighlighting(): void;
}
declare namespace browser.history {
type TransitionType =
| "link"
| "typed"
| "auto_bookmark"
| "auto_subframe"
| "manual_subframe"
| "generated"
| "auto_toplevel"
| "form_submit"
| "reload"
| "keyword"
| "keyword_generated";
type HistoryItem = {
id: string;
url?: string;
title?: string;
lastVisitTime?: number;
visitCount?: number;
typedCount?: number;
};
type VisitItem = {
id: string;
visitId: string;
VisitTime?: number;
refferingVisitId: string;
transition: TransitionType;
};
function search(query: {
text: string;
startTime?: number | string | Date;
endTime?: number | string | Date;
maxResults?: number;
}): Promise<HistoryItem[]>;
function getVisits(details: { url: string }): Promise<VisitItem[]>;
function addUrl(details: {
url: string;
title?: string;
transition?: TransitionType;
visitTime?: number | string | Date;
}): Promise<void>;
function deleteUrl(details: { url: string }): Promise<void>;
function deleteRange(range: {
startTime: number | string | Date;
endTime: number | string | Date;
}): Promise<void>;
function deleteAll(): Promise<void>;
const onVisited: Listener<HistoryItem>;
// TODO: Ensure that urls is not `urls: [string]` instead
const onVisitRemoved: Listener<{ allHistory: boolean; urls: string[] }>;
}
declare namespace browser.i18n {
type LanguageCode = string;
function getAcceptLanguages(): Promise<LanguageCode[]>;
function getMessage(
messageName: string,
substitutions?: string | string[]
): string;
function getUILanguage(): LanguageCode;
function detectLanguage(
text: string
): Promise<{
isReliable: boolean;
languages: { language: LanguageCode; percentage: number }[];
}>;
}
declare namespace browser.identity {
function getRedirectURL(): string;
function launchWebAuthFlow(details: {
url: string;
interactive: boolean;
}): Promise<string>;
}
declare namespace browser.idle {
type IdleState = "active" | "idle" /* unsupported: | "locked" */;
function queryState(detectionIntervalInSeconds: number): Promise<IdleState>;
function setDetectionInterval(intervalInSeconds: number): void;
const onStateChanged: Listener<IdleState>;
}
declare namespace browser.management {
type ExtensionInfo = {
description: string;
// unsupported: disabledReason: string,
enabled: boolean;
homepageUrl: string;
hostPermissions: string[];
icons: { size: number; url: string }[];
id: string;
installType: "admin" | "development" | "normal" | "sideload" | "other";
mayDisable: boolean;
name: string;
// unsupported: offlineEnabled: boolean,
optionsUrl: string;
permissions: string[];
shortName: string;
// unsupported: type: string,
updateUrl: string;
version: string;
// unsupported: versionName: string,
};
function getSelf(): Promise<ExtensionInfo>;
function uninstallSelf(options: {
showConfirmDialog: boolean;
dialogMessage: string;
}): Promise<void>;
}
declare namespace browser.notifications {
type TemplateType = "basic" /* | "image" | "list" | "progress" */;
type NotificationOptions = {
type: TemplateType;
message: string;
title: string;
iconUrl?: string;
};
function create(
id: string | null,
options: NotificationOptions
): Promise<string>;
function create(options: NotificationOptions): Promise<string>;
function clear(id: string): Promise<boolean>;
function getAll(): Promise<{ [key: string]: NotificationOptions }>;
const onClosed: Listener<string>;
const onClicked: Listener<string>;
}
declare namespace browser.omnibox {
type OnInputEnteredDisposition =
| "currentTab"
| "newForegroundTab"
| "newBackgroundTab";
type SuggestResult = {
content: string;
description: string;
};
function setDefaultSuggestion(suggestion: { description: string }): void;
const onInputStarted: Listener<void>;
const onInputChanged: EvListener<
(text: string, suggest: (arg: SuggestResult[]) => void) => void
>;
const onInputEntered: EvListener<
(text: string, disposition: OnInputEnteredDisposition) => void
>;
const onInputCancelled: Listener<void>;
}
declare namespace browser.pageAction {
type ImageDataType = ImageData;
function show(tabId: number): void;
function hide(tabId: number): void;
function setTitle(details: { tabId: number; title: string }): void;
function getTitle(details: { tabId: number }): Promise<string>;
function setIcon(details: {
tabId: number;
path?: string | object;
imageData?: ImageDataType;
}): Promise<void>;
function setPopup(details: { tabId: number; popup: string }): void;
function getPopup(details: { tabId: number }): Promise<string>;
const onClicked: Listener<browser.tabs.Tab>;
}
declare namespace browser.permissions {
type Permission =
| "activeTab"
| "alarms"
| "background"
| "bookmarks"
| "browsingData"
| "browserSettings"
| "clipboardRead"
| "clipboardWrite"
| "contextMenus"
| "contextualIdentities"
| "cookies"
| "downloads"
| "downloads.open"
| "find"
| "geolocation"
| "history"
| "identity"
| "idle"
| "management"
| "menus"
| "nativeMessaging"
| "notifications"
| "pkcs11"
| "privacy"
| "proxy"
| "sessions"
| "storage"
| "tabs"
| "theme"
| "topSites"
| "unlimitedStorage"
| "webNavigation"
| "webRequest"
| "webRequestBlocking";
type Permissions = {
origins?: string[];
permissions?: Permission[];
};
function contains(permissions: Permissions): Promise<boolean>;
function getAll(): Promise<Permissions>;
function remove(permissions: Permissions): Promise<boolean>;
function request(permissions: Permissions): Promise<boolean>;
// Not yet support in Edge and Firefox:
// const onAdded: Listener<Permissions>;
// const onRemoved: Listener<Permissions>;
}
declare namespace browser.runtime {
const lastError: string | null;
const id: string;
type Port = {
name: string;
disconnect(): void;
error: object;
onDisconnect: Listener<Port>;
onMessage: Listener<object>;
postMessage: <T = object>(message: T) => void;
sender?: runtime.MessageSender;
};
type MessageSender = {
tab?: browser.tabs.Tab;
frameId?: number;
id?: string;
url?: string;
tlsChannelId?: string;
};
type PlatformOs = "mac" | "win" | "android" | "cros" | "linux" | "openbsd";
type PlatformArch = "arm" | "x86-32" | "x86-64";
type PlatformNaclArch = "arm" | "x86-32" | "x86-64";
type PlatformInfo = {
os: PlatformOs;
arch: PlatformArch;
};
// type RequestUpdateCheckStatus = "throttled" | "no_update" | "update_available";
type OnInstalledReason =
| "install"
| "update"
| "chrome_update"
| "shared_module_update";
type OnRestartRequiredReason = "app_update" | "os_update" | "periodic";
type FirefoxSpecificProperties = {
id?: string;
strict_min_version?: string;
strict_max_version?: string;
update_url?: string;
};
type IconPath = { [urlName: string]: string } | string;
type Manifest = {
// Required
manifest_version: 2;
name: string;
version: string;
/** Required in Microsoft Edge */
author?: string;
// Optional
// ManifestBase
description?: string;
homepage_url?: string;
short_name?: string;
// WebExtensionManifest
background?: {
page: string;
scripts: string[];
persistent?: boolean;
};
content_scripts?: {
matches: string[];
exclude_matches?: string[];
include_globs?: string[];
exclude_globs?: string[];
css?: string[];
js?: string[];
all_frames?: boolean;
match_about_blank?: boolean;
run_at?: "document_start" | "document_end" | "document_idle";
}[];
content_security_policy?: string;
developer?: {
name?: string;
url?: string;
};
icons?: {
[imgSize: string]: string;
};
incognito?: "spanning" | "split" | "not_allowed";
optional_permissions?: browser.permissions.Permission[];
options_ui?: {
page: string;
browser_style?: boolean;
chrome_style?: boolean;
open_in_tab?: boolean;
};
permissions?: browser.permissions.Permission[];
web_accessible_resources?: string[];
// WebExtensionLangpackManifest
languages: {
[langCode: string]: {
chrome_resources: {
[resName: string]: string | { [urlName: string]: string };
};
version: string;
};
};
langpack_id?: string;
sources?: {
[srcName: string]: {
base_path: string;
paths?: string[];
};
};
// Extracted from components
browser_action?: {
default_title?: string;
default_icon?: IconPath;
theme_icons?: {
light: string;
dark: string;
size: number;
}[];
default_popup?: string;
browser_style?: boolean;
default_area?: "navbar" | "menupanel" | "tabstrip" | "personaltoolbar";
};
commands?: {
[keyName: string]: {
suggested_key?: {
default?: string;
mac?: string;
linux?: string;
windows?: string;
chromeos?: string;
android?: string;
ios?: string;
};
description?: string;
};
};
default_locale?: browser.i18n.LanguageCode;
devtools_page?: string;
omnibox?: {
keyword: string;
};
page_action?: {
default_title?: string;
default_icon?: IconPath;
default_popup?: string;
browser_style?: boolean;
show_matches?: string[];
hide_matches?: string[];
};
sidebar_action?: {
default_panel: string;
default_title?: string;
default_icon?: IconPath;
browser_style?: boolean;
};
// Firefox specific
applications?: {
gecko?: FirefoxSpecificProperties;
};
browser_specific_settings?: {
gecko?: FirefoxSpecificProperties;
};
experiment_apis?: any;
protocol_handlers?: {
name: string;
protocol: string;
uriTemplate: string;
};
// Opera specific
minimum_opera_version?: string;
// Chrome specific
action?: any;
automation?: any;
background_page?: any;
chrome_settings_overrides?: {
homepage?: string;
search_provider?: {
name: string;
search_url: string;
keyword?: string;
favicon_url?: string;
suggest_url?: string;
instant_url?: string;
is_default?: string;
image_url?: string;
search_url_post_params?: string;
instant_url_post_params?: string;
image_url_post_params?: string;
alternate_urls?: string[];
prepopulated_id?: number;
};
};
chrome_ui_overrides?: {
bookmarks_ui?: {
remove_bookmark_shortcut?: true;
remove_button?: true;
};
};
chrome_url_overrides?: {
newtab?: string;
bookmarks?: string;
history?: string;
};
content_capabilities?: any;
converted_from_user_script?: any;
current_locale?: any;
declarative_net_request?: any;
event_rules?: any[];
export?: {
whitelist?: string[];
};
externally_connectable?: {
ids?: string[];
matches?: string[];
accepts_tls_channel_id?: boolean;
};
file_browser_handlers?: {
id: string;
default_title: string;
file_filters: string[];
}[];
file_system_provider_capabilities?: {
source: "file" | "device" | "network";
configurable?: boolean;
multiple_mounts?: boolean;
watchable?: boolean;
};
import?: {
id: string;
minimum_version?: string;
}[];
input_components?: any;
key?: string;
minimum_chrome_version?: string;
nacl_modules?: {
path: string;
mime_type: string;
}[];
oauth2?: any;
offline_enabled?: boolean;
options_page?: string;
platforms?: any;
requirements?: any;
sandbox?: {
pages: string[];
content_security_policy?: string;
}[];
signature?: any;
spellcheck?: any;
storage?: {
managed_schema: string;
};
system_indicator?: any;
tts_engine?: {
voice: {
voice_name: string;
lang?: string;
gender?: "male" | "female";
event_types: (
| "start"
| "word"
| "sentence"
| "marker"
| "end"
| "error")[];
}[];
};
update_url?: string;
version_name?: string;
};
function getBackgroundPage(): Promise<Window>;
function openOptionsPage(): Promise<void>;
function getManifest(): Manifest;
function getURL(path: string): string;
function setUninstallURL(url: string): Promise<void>;
function reload(): void;
// Will not exist: https://bugzilla.mozilla.org/show_bug.cgi?id=1314922
// function RequestUpdateCheck(): Promise<RequestUpdateCheckStatus>;
function connect(
connectInfo?: { name?: string; includeTlsChannelId?: boolean }
): Port;
function connect(
extensionId?: string,
connectInfo?: { name?: string; includeTlsChannelId?: boolean }
): Port;
function connectNative(application: string): Port;
function sendMessage<T = any, U = any>(message: T): Promise<U>;
function sendMessage<T = any, U = any>(
message: T,
options: { includeTlsChannelId?: boolean; toProxyScript?: boolean }
): Promise<U>;
function sendMessage<T = any, U = any>(
extensionId: string,
message: T
): Promise<U>;
function sendMessage<T = any, U = any>(
extensionId: string,
message: T,
options?: { includeTlsChannelId?: boolean; toProxyScript?: boolean }
): Promise<U>;
function sendNativeMessage(
application: string,
message: object
): Promise<object | void>;
function getPlatformInfo(): Promise<PlatformInfo>;
function getBrowserInfo(): Promise<{
name: string;
vendor: string;
version: string;
buildID: string;
}>;
// Unsupported: https://bugzilla.mozilla.org/show_bug.cgi?id=1339407
// function getPackageDirectoryEntry(): Promise<any>;
const onStartup: Listener<void>;
const onInstalled: Listener<{
reason: OnInstalledReason;
previousVersion?: string;
id?: string;
}>;
// Unsupported
// const onSuspend: Listener<void>;
// const onSuspendCanceled: Listener<void>;
// const onBrowserUpdateAvailable: Listener<void>;
// const onRestartRequired: Listener<OnRestartRequiredReason>;
const onUpdateAvailable: Listener<{ version: string }>;
const onConnect: Listener<Port>;
const onConnectExternal: Listener<Port>;
type onMessagePromise = (
message: object,
sender: MessageSender,
sendResponse: (response: object) => boolean
) => Promise<void>;
type onMessageBool = (
message: object,
sender: MessageSender,
sendResponse: (response: object) => Promise<void>
) => boolean;
type onMessageVoid = (
message: object,
sender: MessageSender,
sendResponse: (response: object) => Promise<void>
) => void;
type onMessageEvent = onMessagePromise | onMessageBool | onMessageVoid;
const onMessage: EvListener<onMessageEvent>;
const onMessageExternal: EvListener<onMessageEvent>;
}
declare namespace browser.sessions {
type Filter = { maxResults?: number };
type Session = {
lastModified: number;
tab: browser.tabs.Tab;
window: browser.windows.Window;
};
const MAX_SESSION_RESULTS: number;
function getRecentlyClosed(filter?: Filter): Promise<Session[]>;
function restore(sessionId: string): Promise<Session>;
function setTabValue(
tabId: number,
key: string,
value: string | object
): Promise<void>;
function getTabValue(
tabId: number,
key: string
): Promise<void | string | object>;
function removeTabValue(tabId: number, key: string): Promise<void>;
function setWindowValue(
windowId: number,
key: string,
value: string | object
): Promise<void>;
function getWindowValue(
windowId: number,
key: string
): Promise<void | string | object>;
function removeWindowValue(windowId: number, key: string): Promise<void>;
const onChanged: EvListener<() => void>;
}
declare namespace browser.sidebarAction {
type ImageDataType = ImageData;
function setPanel(details: { panel: string; tabId?: number }): void;
function getPanel(details: { tabId?: number }): Promise<string>;
function setTitle(details: { title: string; tabId?: number }): void;
function getTitle(details: { tabId?: number }): Promise<string>;
type IconViaPath = {
path: string | { [index: number]: string };
tabId?: number;
};
type IconViaImageData = {
imageData: ImageDataType | { [index: number]: ImageDataType };
tabId?: number;
};
function setIcon(details: IconViaPath | IconViaImageData): Promise<void>;
function open(): Promise<void>;
function close(): Promise<void>;
}
declare namespace browser.storage {
// Non-firefox implementations don't accept all these types
type StorageValue =
| string
| number
| boolean
| null
| undefined
| RegExp
| ArrayBuffer
| Uint8ClampedArray
| Uint8Array
| Uint16Array
| Uint32Array
| Int8Array
| Int16Array
| Int32Array
| Float32Array
| Float64Array
| DataView
| StorageArray
| StorageMap
| StorageSet
| StorageObject;
// The Index signature makes casting to/from classes or interfaces a pain.
// Custom types are OK.
interface StorageObject {
[key: string]: StorageValue;
}
// These have to be interfaces rather than types to avoid a circular
// definition of StorageValue
interface StorageArray extends Array<StorageValue> {}
interface StorageMap extends Map<StorageValue, StorageValue> {}
interface StorageSet extends Set<StorageValue> {}
interface Get {
<T extends StorageObject>(keys?: string | string[] | null): Promise<T>;
/* <T extends StorageObject>(keys: T): Promise<{[K in keyof T]: T[K]}>; */
<T extends StorageObject>(keys: T): Promise<T>;
}
type StorageArea = {
get: Get;
// unsupported: getBytesInUse: (keys: string|string[]|null) => Promise<number>,
set: (keys: StorageObject) => Promise<void>;
remove: (keys: string | string[]) => Promise<void>;
clear: () => Promise<void>;
};
type StorageChange = {
oldValue?: any;
newValue?: any;
};
const sync: StorageArea;
const local: StorageArea;
// unsupported: const managed: StorageArea;
type ChangeDict = { [field: string]: StorageChange };
type StorageName = "sync" | "local" /* |"managed" */;
const onChanged: EvListener<
(changes: ChangeDict, areaName: StorageName) => void
>;
}
declare namespace browser.tabs {
type MutedInfoReason = "capture" | "extension" | "user";
type MutedInfo = {
muted: boolean;
extensionId?: string;
reason: MutedInfoReason;
};
// TODO: Specify PageSettings properly.
type PageSettings = object;
type Tab = {
active: boolean;
audible?: boolean;
autoDiscardable?: boolean;
cookieStoreId?: string;
discarded?: boolean;
favIconUrl?: string;
height?: number;
hidden: boolean;
highlighted: boolean;
id?: number;
incognito: boolean;
index: number;
isArticle: boolean;
isInReaderMode: boolean;
lastAccessed: number;
mutedInfo?: MutedInfo;
openerTabId?: number;
pinned: boolean;
selected: boolean;
sessionId?: string;
status?: string;
title?: string;
url?: string;
width?: number;
windowId: number;
};
type TabStatus = "loading" | "complete";
type WindowType = "normal" | "popup" | "panel" | "devtools";
type ZoomSettingsMode = "automatic" | "disabled" | "manual";
type ZoomSettingsScope = "per-origin" | "per-tab";
type ZoomSettings = {
defaultZoomFactor?: number;
mode?: ZoomSettingsMode;
scope?: ZoomSettingsScope;
};
const TAB_ID_NONE: number;
function connect(
tabId: number,
connectInfo?: { name?: string; frameId?: number }
): browser.runtime.Port;
function create(createProperties: {
active?: boolean;
cookieStoreId?: string;
index?: number;
openerTabId?: number;
pinned?: boolean;
// deprecated: selected: boolean,
url?: string;
windowId?: number;
}): Promise<Tab>;
function captureTab(
tabId?: number,
options?: browser.extensionTypes.ImageDetails
): Promise<string>;
function captureVisibleTab(
windowId?: number,
options?: browser.extensionTypes.ImageDetails
): Promise<string>;
function detectLanguage(tabId?: number): Promise<string>;
function duplicate(tabId: number): Promise<Tab>;
function executeScript(
tabId: number | undefined,
details: browser.extensionTypes.InjectDetails
): Promise<object[]>;
function get(tabId: number): Promise<Tab>;
// deprecated: function getAllInWindow(): x;
function getCurrent(): Promise<Tab>;
// deprecated: function getSelected(windowId?: number): Promise<browser.tabs.Tab>;
function getZoom(tabId?: number): Promise<number>;
function getZoomSettings(tabId?: number): Promise<ZoomSettings>;
function hide(tabIds: number | number[]): Promise<number[]>;
// unsupported: function highlight(highlightInfo: {
// windowId?: number,
// tabs: number[]|number,
// }): Promise<browser.windows.Window>;
function insertCSS(
tabId: number | undefined,
details: browser.extensionTypes.InjectDetailsCSS
): Promise<void>;
function removeCSS(
tabId: number | undefined,
details: browser.extensionTypes.InjectDetails
): Promise<void>;
function move(
tabIds: number | number[],
moveProperties: {
windowId?: number;
index: number;
}
): Promise<Tab | Tab[]>;
function print(): Promise<void>;
function printPreview(): Promise<void>;
function query(queryInfo: {
active?: boolean;
audible?: boolean;
// unsupported: autoDiscardable?: boolean,
cookieStoreId?: string;
currentWindow?: boolean;
discarded?: boolean;
hidden?: boolean;
highlighted?: boolean;
index?: number;
muted?: boolean;
lastFocusedWindow?: boolean;
pinned?: boolean;
status?: TabStatus;
title?: string;
url?: string | string[];
windowId?: number;
windowType?: WindowType;
}): Promise<Tab[]>;
function reload(
tabId?: number,
reloadProperties?: { bypassCache?: boolean }
): Promise<void>;
function remove(tabIds: number | number[]): Promise<void>;
function saveAsPDF(
pageSettings: PageSettings
): Promise<"saved" | "replaced" | "canceled" | "not_saved" | "not_replaced">;
function sendMessage<T = any, U = object>(
tabId: number,
message: T,
options?: { frameId?: number }
): Promise<U | void>;
// deprecated: function sendRequest(): x;
function setZoom(
tabId: number | undefined,
zoomFactor: number
): Promise<void>;
function setZoomSettings(
tabId: number | undefined,
zoomSettings: ZoomSettings
): Promise<void>;
function show(tabIds: number | number[]): Promise<void>;
function toggleReaderMode(tabId?: number): Promise<void>;
function update(
tabId: number | undefined,
updateProperties: {
active?: boolean;
// unsupported: autoDiscardable?: boolean,
// unsupported: highlighted?: boolean,
// unsupported: hidden?: boolean;
loadReplace?: boolean;
muted?: boolean;
openerTabId?: number;
pinned?: boolean;
// deprecated: selected?: boolean,
url?: string;
}
): Promise<Tab>;
const onActivated: Listener<{ tabId: number; windowId: number }>;
const onAttached: EvListener<
(
tabId: number,
attachInfo: {
newWindowId: number;
newPosition: number;
}
) => void
>;
const onCreated: Listener<Tab>;
const onDetached: EvListener<
(
tabId: number,
detachInfo: {
oldWindowId: number;
oldPosition: number;
}
) => void
>;
const onHighlighted: Listener<{ windowId: number; tabIds: number[] }>;
const onMoved: EvListener<
(
tabId: number,
moveInfo: {
windowId: number;
fromIndex: number;
toIndex: number;
}
) => void
>;
const onRemoved: EvListener<
(
tabId: number,
removeInfo: {
windowId: number;
isWindowClosing: boolean;
}
) => void
>;
const onReplaced: EvListener<
(addedTabId: number, removedTabId: number) => void
>;
const onUpdated: EvListener<
(
tabId: number,
changeInfo: {
audible?: boolean;
discarded?: boolean;
favIconUrl?: string;
mutedInfo?: MutedInfo;
pinned?: boolean;
status?: string;
title?: string;
url?: string;
},
tab: Tab
) => void
>;
const onZoomChanged: Listener<{
tabId: number;
oldZoomFactor: number;
newZoomFactor: number;
zoomSettings: ZoomSettings;
}>;
}
declare namespace browser.topSites {
type MostVisitedURL = {
title: string;
url: string;
};
function get(): Promise<MostVisitedURL[]>;
}
declare namespace browser.webNavigation {
type TransitionType = "link" | "auto_subframe" | "form_submit" | "reload";
// unsupported: | "typed" | "auto_bookmark" | "manual_subframe"
// | "generated" | "start_page" | "keyword"
// | "keyword_generated";
type TransitionQualifier =
| "client_redirect"
| "server_redirect"
| "forward_back";
// unsupported: "from_address_bar";
function getFrame(details: {
tabId: number;
processId: number;
frameId: number;
}): Promise<{ errorOccured: boolean; url: string; parentFrameId: number }>;
function getAllFrames(details: {
tabId: number;
}): Promise<
{
errorOccured: boolean;
processId: number;
frameId: number;
parentFrameId: number;
url: string;
}[]
>;
interface NavListener<T> {
addListener: (
callback: (arg: T) => void,
filter?: {
url: browser.events.UrlFilter[];
}
) => void;
removeListener: (callback: (arg: T) => void) => void;
hasListener: (callback: (arg: T) => void) => boolean;
}
type DefaultNavListener = NavListener<{
tabId: number;
url: string;
processId: number;
frameId: number;
timeStamp: number;
}>;
type TransitionNavListener = NavListener<{
tabId: number;
url: string;
processId: number;
frameId: number;
timeStamp: number;
transitionType: TransitionType;
transitionQualifiers: TransitionQualifier[];
}>;
const onBeforeNavigate: NavListener<{
tabId: number;
url: string;
processId: number;
frameId: number;
parentFrameId: number;
timeStamp: number;
}>;
const onCommitted: TransitionNavListener;
const onCreatedNavigationTarget: NavListener<{
sourceFrameId: number;
// Unsupported: sourceProcessId: number,
sourceTabId: number;
tabId: number;
timeStamp: number;
url: string;
windowId: number;
}>;
const onDOMContentLoaded: DefaultNavListener;
const onCompleted: DefaultNavListener;
const onErrorOccurred: DefaultNavListener; // error field unsupported
const onReferenceFragmentUpdated: TransitionNavListener;
const onHistoryStateUpdated: TransitionNavListener;
}
declare namespace browser.webRequest {
type ResourceType =
| "main_frame"
| "sub_frame"
| "stylesheet"
| "script"
| "image"
| "object"
| "xmlhttprequest"
| "xbl"
| "xslt"
| "ping"
| "beacon"
| "xml_dtd"
| "font"
| "media"
| "websocket"
| "csp_report"
| "imageset"
| "web_manifest"
| "other";
type RequestFilter = {
urls: string[];
types?: ResourceType[];
tabId?: number;
windowId?: number;
};
type StreamFilter = {
onstart: (event: any) => void;
ondata: (event: { data: ArrayBuffer }) => void;
onstop: (event: any) => void;
onerror: (event: any) => void;
close(): void;
disconnect(): void;
resume(): void;
suspend(): void;
write(data: Uint8Array | ArrayBuffer): void;
error: string;
status:
| "uninitialized"
| "transferringdata"
| "finishedtransferringdata"
| "suspended"
| "closed"
| "disconnected"
| "failed";
};
type HttpHeaders = (
| { name: string; binaryValue: number[]; value?: string }
| { name: string; value: string; binaryValue?: number[] })[];
type BlockingResponse = {
cancel?: boolean;
redirectUrl?: string;
requestHeaders?: HttpHeaders;
responseHeaders?: HttpHeaders;
authCredentials?: { username: string; password: string };
};
type UploadData = {
bytes?: ArrayBuffer;
file?: string;
};
const MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES: number;
function handlerBehaviorChanged(): Promise<void>;
// TODO: Enforce the return result of the addListener call in the contract
// Use an intersection type for all the default properties
interface ReqListener<T, U> {
addListener: (
callback: (arg: T) => void,
filter: RequestFilter,
extraInfoSpec?: Array<U>
) => BlockingResponse | Promise<BlockingResponse>;
removeListener: (callback: (arg: T) => void) => void;
hasListener: (callback: (arg: T) => void) => boolean;
}
const onBeforeRequest: ReqListener<
{
requestId: string;
url: string;
method: string;
frameId: number;
parentFrameId: number;
requestBody?: {
error?: string;
formData?: { [key: string]: string[] };
raw?: UploadData[];
};
tabId: number;
type: ResourceType;
timeStamp: number;
originUrl: string;
},
"blocking" | "requestBody"
>;
const onBeforeSendHeaders: ReqListener<
{
requestId: string;
url: string;
method: string;
frameId: number;
parentFrameId: number;
tabId: number;
type: ResourceType;
timeStamp: number;
originUrl: string;
requestHeaders?: HttpHeaders;
},
"blocking" | "requestHeaders"
>;
const onSendHeaders: ReqListener<
{