// Hide console; or cancel some user actions
export const CANCEL = "cancel";
// Addons
export const ADDON_ENABLE = "addon.enable";
export const ADDON_DISABLE = "addon.disable";
export const ADDON_TOGGLE_ENABLED = "addon.toggle.enabled";
// Command
export const COMMAND_SHOW = "command.show";
export const COMMAND_SHOW_OPEN = "command.show.open";
export const COMMAND_SHOW_TABOPEN = "command.show.tabopen";
export const COMMAND_SHOW_WINOPEN = "command.show.winopen";
export const COMMAND_SHOW_BUFFER = "command.show.buffer";
export const COMMAND_SHOW_ADDBOOKMARK = "command.show.addbookmark";
// Scrolls
export const SCROLL_VERTICALLY = "scroll.vertically";
export const SCROLL_HORIZONALLY = "scroll.horizonally";
export const SCROLL_PAGES = "scroll.pages";
export const SCROLL_TOP = "scroll.top";
export const SCROLL_BOTTOM = "scroll.bottom";
export const SCROLL_HOME = "scroll.home";
export const SCROLL_END = "scroll.end";
// Follows
export const FOLLOW_START = "follow.start";
// Navigations
export const NAVIGATE_HISTORY_PREV = "navigate.history.prev";
export const NAVIGATE_HISTORY_NEXT = "navigate.history.next";
export const NAVIGATE_LINK_PREV = "navigate.link.prev";
export const NAVIGATE_LINK_NEXT = "navigate.link.next";
export const NAVIGATE_PARENT = "navigate.parent";
export const NAVIGATE_ROOT = "navigate.root";
// Focus
export const FOCUS_INPUT = "focus.input";
// Page
export const PAGE_SOURCE = "page.source";
export const PAGE_HOME = "page.home";
// Tabs
export const TAB_CLOSE = "tabs.close";
export const TAB_CLOSE_FORCE = "tabs.close.force";
export const TAB_CLOSE_RIGHT = "tabs.close.right";
export const TAB_REOPEN = "tabs.reopen";
export const TAB_PREV = "tabs.prev";
export const TAB_NEXT = "tabs.next";
export const TAB_FIRST = "tabs.first";
export const TAB_LAST = "tabs.last";
export const TAB_PREV_SEL = "tabs.prevsel";
export const TAB_RELOAD = "tabs.reload";
export const TAB_PIN = "tabs.pin";
export const TAB_UNPIN = "tabs.unpin";
export const TAB_TOGGLE_PINNED = "tabs.pin.toggle";
export const TAB_DUPLICATE = "tabs.duplicate";
export const TAB_TOGGLE_READER = "tabs.reader.toggle";
// Zooms
export const ZOOM_IN = "zoom.in";
export const ZOOM_OUT = "zoom.out";
export const ZOOM_NEUTRAL = "zoom.neutral";
// Url yank/paste
export const URLS_YANK = "urls.yank";
export const URLS_PASTE = "urls.paste";
// Find
export const FIND_START = "find.start";
export const FIND_NEXT = "find.next";
export const FIND_PREV = "find.prev";
// Mark
export const MARK_SET_PREFIX = "mark.set.prefix";
export const MARK_JUMP_PREFIX = "mark.jump.prefix";
// Repeat
export const REPEAT_LAST = "repeat.last";
// Internal
export const INTERNAL_OPEN_URL = "internal.open.url";
export interface CancelOperation {
type: typeof CANCEL;
}
export interface AddonEnableOperation {
type: typeof ADDON_ENABLE;
}
export interface AddonDisableOperation {
type: typeof ADDON_DISABLE;
}
export interface AddonToggleEnabledOperation {
type: typeof ADDON_TOGGLE_ENABLED;
}
export interface CommandShowOperation {
type: typeof COMMAND_SHOW;
}
export interface CommandShowOpenOperation {
type: typeof COMMAND_SHOW_OPEN;
alter: boolean;
}
export interface CommandShowTabopenOperation {
type: typeof COMMAND_SHOW_TABOPEN;
alter: boolean;
}
export interface CommandShowWinopenOperation {
type: typeof COMMAND_SHOW_WINOPEN;
alter: boolean;
}
export interface CommandShowBufferOperation {
type: typeof COMMAND_SHOW_BUFFER;
}
export interface CommandShowAddbookmarkOperation {
type: typeof COMMAND_SHOW_ADDBOOKMARK;
alter: boolean;
}
export interface ScrollVerticallyOperation {
type: typeof SCROLL_VERTICALLY;
count: number;
}
export interface ScrollHorizonallyOperation {
type: typeof SCROLL_HORIZONALLY;
count: number;
}
export interface ScrollPagesOperation {
type: typeof SCROLL_PAGES;
count: number;
}
export interface ScrollTopOperation {
type: typeof SCROLL_TOP;
}
export interface ScrollBottomOperation {
type: typeof SCROLL_BOTTOM;
}
export interface ScrollHomeOperation {
type: typeof SCROLL_HOME;
}
export interface ScrollEndOperation {
type: typeof SCROLL_END;
}
export interface FollowStartOperation {
type: typeof FOLLOW_START;
newTab: boolean;
background: boolean;
}
export interface NavigateHistoryPrevOperation {
type: typeof NAVIGATE_HISTORY_PREV;
}
export interface NavigateHistoryNextOperation {
type: typeof NAVIGATE_HISTORY_NEXT;
}
export interface NavigateLinkPrevOperation {
type: typeof NAVIGATE_LINK_PREV;
}
export interface NavigateLinkNextOperation {
type: typeof NAVIGATE_LINK_NEXT;
}
export interface NavigateParentOperation {
type: typeof NAVIGATE_PARENT;
}
export interface NavigateRootOperation {
type: typeof NAVIGATE_ROOT;
}
export interface FocusInputOperation {
type: typeof FOCUS_INPUT;
}
export interface PageSourceOperation {
type: typeof PAGE_SOURCE;
}
export interface PageHomeOperation {
type: typeof PAGE_HOME;
newTab: boolean;
}
export interface TabCloseOperation {
type: typeof TAB_CLOSE;
select?: "left" | "right";
}
export interface TabCloseForceOperation {
type: typeof TAB_CLOSE_FORCE;
}
export interface TabCloseRightOperation {
type: typeof TAB_CLOSE_RIGHT;
}
export interface TabReopenOperation {
type: typeof TAB_REOPEN;
}
export interface TabPrevOperation {
type: typeof TAB_PREV;
}
export interface TabNextOperation {
type: typeof TAB_NEXT;
}
export interface TabFirstOperation {
type: typeof TAB_FIRST;
}
export interface TabLastOperation {
type: typeof TAB_LAST;
}
export interface TabPrevSelOperation {
type: typeof TAB_PREV_SEL;
}
export interface TabReloadOperation {
type: typeof TAB_RELOAD;
cache: boolean;
}
export interface TabPinOperation {
type: typeof TAB_PIN;
}
export interface TabUnpinOperation {
type: typeof TAB_UNPIN;
}
export interface TabTogglePinnedOperation {
type: typeof TAB_TOGGLE_PINNED;
}
export interface TabDuplicateOperation {
type: typeof TAB_DUPLICATE;
}
export interface TabToggleReaderOperation {
type: typeof TAB_TOGGLE_READER;
}
export interface ZoomInOperation {
type: typeof ZOOM_IN;
}
export interface ZoomOutOperation {
type: typeof ZOOM_OUT;
}
export interface ZoomNeutralOperation {
type: typeof ZOOM_NEUTRAL;
}
export interface UrlsYankOperation {
type: typeof URLS_YANK;
}
export interface UrlsPasteOperation {
type: typeof URLS_PASTE;
newTab: boolean;
}
export interface FindStartOperation {
type: typeof FIND_START;
}
export interface FindNextOperation {
type: typeof FIND_NEXT;
}
export interface FindPrevOperation {
type: typeof FIND_PREV;
}
export interface MarkSetPrefixOperation {
type: typeof MARK_SET_PREFIX;
}
export interface MarkJumpPrefixOperation {
type: typeof MARK_JUMP_PREFIX;
}
export interface RepeatLastOperation {
type: typeof REPEAT_LAST;
}
export interface InternalOpenUrl {
type: typeof INTERNAL_OPEN_URL;
url: string;
newTab?: boolean;
newWindow?: boolean;
background?: boolean;
}
export type Operation =
| CancelOperation
| AddonEnableOperation
| AddonDisableOperation
| AddonToggleEnabledOperation
| CommandShowOperation
| CommandShowOpenOperation
| CommandShowTabopenOperation
| CommandShowWinopenOperation
| CommandShowBufferOperation
| CommandShowAddbookmarkOperation
| ScrollVerticallyOperation
| ScrollHorizonallyOperation
| ScrollPagesOperation
| ScrollTopOperation
| ScrollBottomOperation
| ScrollHomeOperation
| ScrollEndOperation
| FollowStartOperation
| NavigateHistoryPrevOperation
| NavigateHistoryNextOperation
| NavigateLinkPrevOperation
| NavigateLinkNextOperation
| NavigateParentOperation
| NavigateRootOperation
| FocusInputOperation
| PageSourceOperation
| PageHomeOperation
| TabCloseOperation
| TabCloseForceOperation
| TabCloseRightOperation
| TabReopenOperation
| TabPrevOperation
| TabNextOperation
| TabFirstOperation
| TabLastOperation
| TabPrevSelOperation
| TabReloadOperation
| TabPinOperation
| TabUnpinOperation
| TabTogglePinnedOperation
| TabDuplicateOperation
| TabToggleReaderOperation
| ZoomInOperation
| ZoomOutOperation
| ZoomNeutralOperation
| UrlsYankOperation
| UrlsPasteOperation
| FindStartOperation
| FindNextOperation
| FindPrevOperation
| MarkSetPrefixOperation
| MarkJumpPrefixOperation
| RepeatLastOperation
| InternalOpenUrl;
const assertOptionalBoolean = (obj: any, name: string) => {
if (
Object.prototype.hasOwnProperty.call(obj, name) &&
typeof obj[name] !== "boolean"
) {
throw new TypeError(
`Not a boolean parameter: '${name} (${typeof obj[name]})'`
);
}
};
const assertOptionalString = (obj: any, name: string, values?: string[]) => {
if (Object.prototype.hasOwnProperty.call(obj, name)) {
const value = obj[name];
if (typeof value !== "string") {
throw new TypeError(
`Not a string parameter: '${name}' (${typeof value})`
);
}
if (values && values.length && values.indexOf(value) === -1) {
// eslint-disable-next-line max-len
throw new TypeError(`Invalid parameter for '${name}': '${value}'`);
}
}
};
const assertRequiredNumber = (obj: any, name: string) => {
if (
!Object.prototype.hasOwnProperty.call(obj, name) ||
typeof obj[name] !== "number"
) {
throw new TypeError(`Missing number parameter: '${name}`);
}
};
const assertRequiredString = (obj: any, name: string) => {
if (
!Object.prototype.hasOwnProperty.call(obj, name) ||
typeof obj[name] !== "string"
) {
throw new TypeError(`Missing string parameter: '${name}`);
}
};
// eslint-disable-next-line complexity, max-lines-per-function
export const valueOf = (o: any): Operation => {
if (!Object.prototype.hasOwnProperty.call(o, "type")) {
throw new TypeError(`Missing 'type' field`);
}
switch (o.type) {
case COMMAND_SHOW_OPEN:
case COMMAND_SHOW_TABOPEN:
case COMMAND_SHOW_WINOPEN:
case COMMAND_SHOW_ADDBOOKMARK:
assertOptionalBoolean(o, "alter");
return { type: o.type, alter: Boolean(o.alter) };
case SCROLL_VERTICALLY:
case SCROLL_HORIZONALLY:
case SCROLL_PAGES:
assertRequiredNumber(o, "count");
return { type: o.type, count: Number(o.count) };
case FOLLOW_START:
assertOptionalBoolean(o, "newTab");
assertOptionalBoolean(o, "background");
return {
type: FOLLOW_START,
newTab: Boolean(typeof o.newTab === "undefined" ? false : o.newTab),
background: Boolean(
typeof o.background === "undefined" ? true : o.background
), // eslint-disable-line max-len
};
case PAGE_HOME:
assertOptionalBoolean(o, "newTab");
return {
type: PAGE_HOME,
newTab: Boolean(typeof o.newTab === "undefined" ? false : o.newTab),
};
case TAB_CLOSE:
assertOptionalString(o, "select", ["left", "right"]);
return {
type: TAB_CLOSE,
select: typeof o.select === "undefined" ? "right" : o.select,
};
case TAB_RELOAD:
assertOptionalBoolean(o, "cache");
return {
type: TAB_RELOAD,
cache: Boolean(typeof o.cache === "undefined" ? false : o.cache),
};
case URLS_PASTE:
assertOptionalBoolean(o, "newTab");
return {
type: URLS_PASTE,
newTab: Boolean(typeof o.newTab === "undefined" ? false : o.newTab),
};
case INTERNAL_OPEN_URL:
assertOptionalBoolean(o, "newTab");
assertOptionalBoolean(o, "newWindow");
assertOptionalBoolean(o, "background");
assertRequiredString(o, "url");
return {
type: INTERNAL_OPEN_URL,
url: o.url,
newTab: Boolean(typeof o.newTab === "undefined" ? false : o.newTab),
newWindow: Boolean(
typeof o.newWindow === "undefined" ? false : o.newWindow
), // eslint-disable-line max-len
background: Boolean(
typeof o.background === "undefined" ? true : o.background
), // eslint-disable-line max-len
};
case CANCEL:
case ADDON_ENABLE:
case ADDON_DISABLE:
case ADDON_TOGGLE_ENABLED:
case COMMAND_SHOW:
case COMMAND_SHOW_BUFFER:
case SCROLL_TOP:
case SCROLL_BOTTOM:
case SCROLL_HOME:
case SCROLL_END:
case NAVIGATE_HISTORY_PREV:
case NAVIGATE_HISTORY_NEXT:
case NAVIGATE_LINK_PREV:
case NAVIGATE_LINK_NEXT:
case NAVIGATE_PARENT:
case NAVIGATE_ROOT:
case FOCUS_INPUT:
case PAGE_SOURCE:
case TAB_CLOSE_FORCE:
case TAB_CLOSE_RIGHT:
case TAB_REOPEN:
case TAB_PREV:
case TAB_NEXT:
case TAB_FIRST:
case TAB_LAST:
case TAB_PREV_SEL:
case TAB_PIN:
case TAB_UNPIN:
case TAB_TOGGLE_PINNED:
case TAB_DUPLICATE:
case TAB_TOGGLE_READER:
case ZOOM_IN:
case ZOOM_OUT:
case ZOOM_NEUTRAL:
case URLS_YANK:
case FIND_START:
case FIND_NEXT:
case FIND_PREV:
case MARK_SET_PREFIX:
case MARK_JUMP_PREFIX:
case REPEAT_LAST:
return { type: o.type };
}
throw new TypeError("Unknown operation type: " + o.type);
};
export const isNRepeatable = (type: string): boolean => {
switch (type) {
case SCROLL_VERTICALLY:
case SCROLL_HORIZONALLY:
case SCROLL_PAGES:
case NAVIGATE_HISTORY_PREV:
case NAVIGATE_HISTORY_NEXT:
case NAVIGATE_PARENT:
case TAB_CLOSE:
case TAB_CLOSE_FORCE:
case TAB_CLOSE_RIGHT:
case TAB_REOPEN:
case TAB_PREV:
case TAB_NEXT:
case TAB_DUPLICATE:
case ZOOM_IN:
case ZOOM_OUT:
case URLS_PASTE:
case FIND_NEXT:
case FIND_PREV:
case REPEAT_LAST:
return true;
}
return false;
};