// 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; };