//////////////////////////////////////////////////////
// BEWARE: DO NOT EDIT MANUALLY! Changes will be lost!
//////////////////////////////////////////////////////

import { Events } from "./events";

/**
 * Namespace: browser.declarativeContent
 */
export namespace DeclarativeContent {
    /**
     * See <a href="https://developer.mozilla.org/en-US/docs/Web/API/ImageData">https://developer.mozilla.
     * org/en-US/docs/Web/API/ImageData</a>.
     */
    interface ImageDataType extends ImageData {
        [s: string]: unknown;
    }

    /**
     * Matches the state of a web page based on various criteria.
     */
    interface PageStateMatcher {
        /**
         * Matches if the conditions of the <code>UrlFilter</code> are fulfilled for the top-level URL of the page.
         * Optional.
         */
        pageUrl?: Events.UrlFilter;

        /**
         * Matches if all of the CSS selectors in the array match displayed elements in a frame with the same origin as the page's
         * main frame. All selectors in this array must be <a href="http://www.w3.org/TR/selectors4/#compound">
         * compound selectors</a> to speed up matching. Note: Listing hundreds of CSS selectors or listing CSS selectors that match
         * hundreds of times per page can slow down web sites.
         * Optional.
         */
        css?: string[];

        /**
         * Matches if the bookmarked state of the page is equal to the specified value. Requres the <a
         * href='/docs/extensions/develop/concepts/declare-permissions'>bookmarks permission</a>.
         * Optional.
         */
        isBookmarked?: boolean;
    }

    /**
     * Please use ShowAction.
     */
    type ShowPageAction = never;

    /**
     * A declarative event action that sets the extension's toolbar $(ref:action action) to an enabled state while the
     * corresponding conditions are met. This action can be used without <a
     * href="/docs/extensions/develop/concepts/declare-permissions#host-permissions">host permissions</a>.
     * If the extension has the <a href="/docs/extensions/develop/concepts/activeTab">activeTab</a> permission,
     * clicking the page action grants access to the active tab.<p>On pages where the conditions are not met the extension's
     * toolbar action will be grey-scale, and clicking it will open the context menu, instead of triggering the action.</p>
     */
    interface ShowAction {
        [s: string]: unknown;
    }

    /**
     * Declarative event action that sets the n-<abbr title="device-independent pixel">dip</abbr>
     * square icon for the extension's $(ref:pageAction page action) or $(ref:browserAction browser action)
     * while the corresponding conditions are met. This action can be used without <a
     * href="/docs/extensions/develop/concepts/declare-permissions#host-permissions">host permissions</a>,
     * but the extension must have a page or browser action.<p>Exactly one of <code>imageData</code> or <code>path</code>
     * must be specified. Both are dictionaries mapping a number of pixels to an image representation.
     * The image representation in <code>imageData</code> is an <a href="https://developer.mozilla.
     * org/en-US/docs/Web/API/ImageData">ImageData</a> object; for example, from a <code>canvas</code> element,
     * while the image representation in <code>path</code> is the path to an image file relative to the extension's manifest.
     * If <code>scale</code> screen pixels fit into a device-independent pixel, the <code>scale * n</code> icon is used.
     * If that scale is missing, another image is resized to the required size.</p>
     */
    interface SetIcon {
        /**
         * Either an <code>ImageData</code> object or a dictionary {size -> ImageData} representing an icon to be set.
         * If the icon is specified as a dictionary, the image used is chosen depending on the screen's pixel density.
         * If the number of image pixels that fit into one screen space unit equals <code>scale</code>,
         * then an image with size <code>scale * n</code> is selected, where <i>n</i> is the size of the icon in the UI.
         * At least one image must be specified. Note that <code>details.imageData = foo</code> is equivalent to <code>details.
         * imageData = {'16': foo}</code>.
         * Optional.
         */
        imageData?: ImageDataType | SetIconImageDataC2Type;
    }

    /**
     * Declarative event action that injects a content script. <p><b>WARNING:</b> This action is still experimental and is not
     * supported on stable builds of Chrome.</p>
     */
    interface RequestContentScript {
        /**
         * Names of CSS files to be injected as a part of the content script.
         * Optional.
         */
        css?: string[];

        /**
         * Names of JavaScript files to be injected as a part of the content script.
         * Optional.
         */
        js?: string[];

        /**
         * Whether the content script runs in all frames of the matching page, or in only the top frame. Default is <code>
         * false</code>.
         * Optional.
         */
        allFrames?: boolean;

        /**
         * Whether to insert the content script on <code>about:blank</code> and <code>about:srcdoc</code>. Default is <code>
         * false</code>.
         * Optional.
         */
        matchAboutBlank?: boolean;
    }

    interface Rule<TCondition, TAction> {
        /**
         * List of conditions that can trigger the actions.
         */
        conditions: TCondition[];

        /**
         * List of actions that are triggered if one of the conditions is fulfilled.
         */
        actions: TAction[];
    }

    /**
     * An object which allows the addition and removal of rules for declarative content.
     */
    interface RuleEvent<TCondition, TAction> {
        /**
         * Registers rules to handle events.
         *
         * @param rules Rules to be registered. These do not replace previously registered rules.
         */
        addRules(rules: Array<Rule<TCondition, TAction>>): void;

        /**
         * Fetches currently registered rules.
         *
         * @param rules Optional. Rule ids to fetch.
         * @param callback Optional. Called when rules have been fetched.
         */
        getRules(rules?: string[], callback?: (rules: Array<Rule<TCondition, TAction>>) => void): void;

        /**
         * Unregisters currently registered rules.
         *
         * @param rules Optional. Rule ids to be unregistered.
         * @param callback Optional. Called when rules were unregistered.
         */
        removeRules(rules?: string[], callback?: () => void): void;
    }

    interface SetIconImageDataC2Type {
        [s: string]: unknown;
    }

    interface Static {
        PageStateMatcher: { new(options?: PageStateMatcher): PageStateMatcher };

        ShowAction: { new(options?: ShowAction): ShowAction };

        SetIcon: { new(options?: SetIcon): SetIcon };

        RequestContentScript: { new(options?: RequestContentScript): RequestContentScript };

        onPageChanged: RuleEvent<PageStateMatcher, RequestContentScript | SetIcon | ShowPageAction | ShowAction>;
    }
}
