910e62b5创建于 1月15日历史提交
// 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.

#ifndef EXTENSIONS_BROWSER_API_USER_SCRIPTS_USER_SCRIPTS_API_H_
#define EXTENSIONS_BROWSER_API_USER_SCRIPTS_USER_SCRIPTS_API_H_

#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_function_histogram_value.h"
#include "extensions/browser/scripting_utils.h"
#include "extensions/common/api/user_scripts.h"

namespace extensions {

class UserScriptsRegisterFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.register", USERSCRIPTS_REGISTER)

  UserScriptsRegisterFunction() = default;
  UserScriptsRegisterFunction(const UserScriptsRegisterFunction&) = delete;
  const UserScriptsRegisterFunction& operator=(
      const UserScriptsRegisterFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsRegisterFunction() override = default;

  // Called when user script files have been validated.
  void OnUserScriptFilesValidated(scripting::ValidateScriptsResult result);

  // Called when user scripts have been registered.
  void OnUserScriptsRegistered(const std::optional<std::string>& error);
};

class UserScriptsGetScriptsFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.getScripts", USERSCRIPTS_GETSCRIPTS)

  UserScriptsGetScriptsFunction() = default;
  UserScriptsGetScriptsFunction(const UserScriptsRegisterFunction&) = delete;
  const UserScriptsGetScriptsFunction& operator=(
      const UserScriptsGetScriptsFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsGetScriptsFunction() override = default;
};

class UserScriptsUnregisterFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.unregister", USERSCRIPTS_UNREGISTER)

  UserScriptsUnregisterFunction() = default;
  UserScriptsUnregisterFunction(const UserScriptsUnregisterFunction&) = delete;
  const UserScriptsUnregisterFunction& operator=(
      const UserScriptsUnregisterFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsUnregisterFunction() override = default;

  // Called when user scripts have been unregistered..
  void OnUserScriptsUnregistered(const std::optional<std::string>& error);
};

class UserScriptsUpdateFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.update", USERSCRIPTS_UPDATE)

  UserScriptsUpdateFunction() = default;
  UserScriptsUpdateFunction(const UserScriptsUpdateFunction&) = delete;
  const UserScriptsUpdateFunction& operator=(const UserScriptsUpdateFunction&) =
      delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsUpdateFunction() override = default;

  // Returns a UserScript object by updating the `original_script` with the
  // `new_script` given delta. If the updated script cannot be parsed, populates
  // `parse_error` and returns nullptr.
  std::unique_ptr<UserScript> ApplyUpdate(
      api::user_scripts::RegisteredUserScript& new_script,
      api::user_scripts::RegisteredUserScript& original_script,
      std::u16string* parse_error);

  // Called when user script files have been validated.
  void OnUserScriptFilesValidated(scripting::ValidateScriptsResult result);

  // Called when user scripts have been updated..
  void OnUserScriptsUpdated(const std::optional<std::string>& error);
};

class UserScriptsExecuteFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.execute", USERSCRIPTS_EXECUTE)

  UserScriptsExecuteFunction() = default;
  UserScriptsExecuteFunction(const UserScriptsExecuteFunction&) = delete;
  const UserScriptsExecuteFunction& operator=(
      const UserScriptsExecuteFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsExecuteFunction() override = default;

  // Called when the resource files to be injected has been loaded.
  void DidLoadResources(ScriptExecutor* script_executor,
                        ScriptExecutor::FrameScope frame_scope,
                        std::set<int> frame_ids,
                        std::vector<std::optional<mojom::JSSourcePtr>> sources,
                        std::vector<scripting::InjectedFileSource> file_sources,
                        std::optional<std::string> load_error);

  // Triggers the execution of `sources` in the appropriate context.
  void Execute(std::vector<std::optional<mojom::JSSourcePtr>> sources,
               ScriptExecutor* script_executor,
               ScriptExecutor::FrameScope frame_scope,
               std::set<int> frame_ids,
               std::string* error);

  // Invoked when script execution is complete.
  void OnScriptExecuted(std::vector<ScriptExecutor::FrameResult> frame_results);

  api::user_scripts::UserScriptInjection injection_;
};

class UserScriptsConfigureWorldFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.configureWorld",
                             USERSCRIPTS_CONFIGUREWORLD)

  UserScriptsConfigureWorldFunction() = default;
  UserScriptsConfigureWorldFunction(const UserScriptsConfigureWorldFunction&) =
      delete;
  const UserScriptsConfigureWorldFunction& operator=(
      const UserScriptsConfigureWorldFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsConfigureWorldFunction() override = default;
};

class UserScriptsGetWorldConfigurationsFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.getWorldConfigurations",
                             USERSCRIPTS_GETWORLDCONFIGURATIONS)

  UserScriptsGetWorldConfigurationsFunction() = default;
  UserScriptsGetWorldConfigurationsFunction(
      const UserScriptsGetWorldConfigurationsFunction&) = delete;
  const UserScriptsGetWorldConfigurationsFunction& operator=(
      const UserScriptsGetWorldConfigurationsFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsGetWorldConfigurationsFunction() override = default;
};

class UserScriptsResetWorldConfigurationFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("userScripts.resetWorldConfiguration",
                             USERSCRIPTS_RESETWORLDCONFIGURATION)

  UserScriptsResetWorldConfigurationFunction() = default;
  UserScriptsResetWorldConfigurationFunction(
      const UserScriptsResetWorldConfigurationFunction&) = delete;
  const UserScriptsResetWorldConfigurationFunction& operator=(
      const UserScriptsResetWorldConfigurationFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~UserScriptsResetWorldConfigurationFunction() override = default;
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_API_USER_SCRIPTS_USER_SCRIPTS_API_H_