chromium/extensions/common/api/user_scripts.idl

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>userScripts</code> API to execute user scripts in the User
// Scripts context.
namespace userScripts {
  // The JavaScript world for a user script to execute within.
  enum ExecutionWorld {
    // Specifies the execution environment of the DOM, which is the execution
    // environment shared with the host page's JavaScript.
    MAIN,
    // Specifies the execution environment that is specific to user scripts and
    // is exempt from the page's CSP.
    USER_SCRIPT
  };

  // The source of the script to inject.
  dictionary ScriptSource {
    // A string containing the JavaScript code to inject. Exactly one of
    // <code>file</code> or <code>code</code> must be specified.
    DOMString? code;
    // The path of the JavaScript file to inject relative to the extension's
    // root directory. Exactly one of <code>file</code> or <code>code</code>
    // must be specified.
    DOMString? file;
  };

  // Describes a user script to be injected into a web page registered through
  // this API. The script is injected into a page if its URL matches any of
  // "matches" or "include_globs" patterns, and the URL doesn't match
  // "exclude_matches" and "exclude_globs" patterns.
  dictionary RegisteredUserScript {
    // If true, it will inject into all frames, even if the frame is not the
    // top-most frame in the tab. Each frame is checked independently for URL
    // requirements; it will not inject into child frames if the URL
    // requirements are not met. Defaults to false, meaning that only the top
    // frame is matched.
    boolean? allFrames;
    // Excludes pages that this user script would otherwise be injected into.
    // See <a href="develop/concepts/match-patterns">Match Patterns</a> for more details on
    // the syntax of these strings.
    DOMString[]? excludeMatches;
    // The ID of the user script specified in the API call. This property must
    // not start with a '_' as it's reserved as a prefix for generated script
    // IDs.
    DOMString id;
    // Specifies wildcard patterns for pages this user script will be injected
    // into.
    DOMString[]? includeGlobs;
    // Specifies wildcard patterns for pages this user script will NOT be
    // injected into.
    DOMString[]? excludeGlobs;
    // The list of ScriptSource objects defining sources of scripts to be
    // injected into matching pages.
    ScriptSource[] js;
    // Specifies which pages this user script will be injected into. See
    // <a href="develop/concepts/match-patterns">Match Patterns</a> for more details on the
    // syntax of these strings. This property must be specified for
    // ${ref:register}.
    DOMString[]? matches;
    // Specifies when JavaScript files are injected into the web page. The
    // preferred and default value is <code>document_idle</code>.
    extensionTypes.RunAt? runAt;
    // The JavaScript execution environment to run the script in. The default is
    // <code>`USER_SCRIPT`</code>.
    ExecutionWorld? world;

    // If specified, specifies a specific user script world ID to execute in.
    // Only valid if `world` is omitted or is `USER_SCRIPT`. If omitted, the
    // script will execute in the default user script world.
    // Values with leading underscores (`_`) are reserved.
    // TODO(https://crbug.com/331680187): Remove nodoc.
    [nodoc] DOMString? worldId;
  };

  // An object used to filter user scripts for ${ref:getScripts}.
  dictionary UserScriptFilter {
    // $(ref:getScripts) only returns scripts with the IDs specified in this
    // list.
    DOMString[]? ids;
  };

  // An object used to update the <code>`USER_SCRIPT`</code> world
  // configuration. If a property is not specified, it will reset it to its
  // default value.
  dictionary WorldProperties{
    // Specifies the ID of the specific user script world to update.
    // If not provided, updates the properties of the default user script world.
    // Values with leading underscores (`_`) are reserved.
    // TODO(https://crbug.com/331680187): Remove nodoc.
    [nodoc] DOMString? worldId;

    // Specifies the world csp. The default is the <code>`ISOLATED`</code>
    // world csp.
    DOMString? csp;

    // Specifies whether messaging APIs are exposed. The default is
    // <code>false</code>.
    boolean? messaging;
  };

  callback RegisterCallback = void();

  callback GetScriptsCallback = void(RegisteredUserScript[] scripts);

  callback UnregisterCallback = void();

  callback UpdateCallback = void();

  callback ConfigureWorldCallback = void();

  callback GetAllWorldConfigurationsCallback = void(WorldProperties[] worlds);

  callback ResetWorldConfigurationCallback = void();

  interface Functions {
    // Registers one or more user scripts for this extension.
    // |scripts|: Contains a list of user scripts to be registered.
    // |callback|: Called once scripts have been fully registered or if an error
    // has ocurred.
    static void register(
        RegisteredUserScript[] scripts,
        optional RegisterCallback callback);

    // Returns all dynamically-registered user scripts for this extension.
    // |filter|: If specified, this method returns only the user scripts that
    // match it.
    // |callback|: Called once scripts have been fully registered or if an error
    // occurs.
    static void getScripts(
        optional UserScriptFilter filter,
        GetScriptsCallback callback);

    // Unregisters all dynamically-registered user scripts for this extension.
    // |filter|: If specified, this method unregisters only the user scripts
    // that match it.
    // |callback|: Called once scripts have been fully unregistered or if an
    // error ocurs
    static void unregister(
        optional UserScriptFilter filter,
        UnregisterCallback callback);

    // Updates one or more user scripts for this extension.
    // |scripts|: Contains a list of user scripts to be updated. A property is
    // only updated for the existing script if it is specified in this object.
    // If there are errors during script parsing/file validation, or if the IDs
    // specified do not correspond to a fully registered script, then no scripts
    // are updated.
    // |callback|: Called once scripts have been fully updated or if an error
    // occurs.
    static void update(
        RegisteredUserScript[] scripts,
        optional UpdateCallback callback);

    // Configures the <code>`USER_SCRIPT`</code> execution environment.
    // |properties|: Contains the user script world configuration.
    // |callback|: Called once world hase been configured.
    static void configureWorld(
        WorldProperties properties,
        optional ConfigureWorldCallback callback);

    // Retrieves all registered world configurations.
    // |callback|: Called with the registered world configurations.
    // TODO(https://crbug.com/331680187): Remove nodoc.
    [nodoc] static void getWorldConfigurations(
        GetAllWorldConfigurationsCallback callback);

    // Resets the configuration for a user script world. Any scripts that inject
    // into the world with the specified ID will use the default world
    // configuration.
    // |worldId|: The ID of the user script world to reset. If omitted, resets
    // the default world's configuration.
    // |callback|: Called when the configuration is reset.
    // TODO(https://crbug.com/331680187): Remove nodoc.
    [nodoc] static void resetWorldConfiguration(
        optional DOMString worldId,
        ResetWorldConfigurationCallback callback);
  };
};