scripting_api.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. // Copyright 2023 Microsoft, GmbH
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_BROWSER_EXTENSIONS_API_SCRIPTING_SCRIPTING_API_H_
  5. #define ELECTRON_SHELL_BROWSER_EXTENSIONS_API_SCRIPTING_SCRIPTING_API_H_
  6. #include <memory>
  7. #include <optional>
  8. #include <set>
  9. #include <string>
  10. #include <vector>
  11. #include "chrome/common/extensions/api/scripting.h"
  12. #include "extensions/browser/extension_function.h"
  13. #include "extensions/browser/script_executor.h"
  14. #include "extensions/browser/scripting_utils.h"
  15. #include "extensions/common/mojom/code_injection.mojom.h"
  16. #include "extensions/common/user_script.h"
  17. namespace extensions {
  18. class ScriptingExecuteScriptFunction : public ExtensionFunction {
  19. public:
  20. DECLARE_EXTENSION_FUNCTION("scripting.executeScript", SCRIPTING_EXECUTESCRIPT)
  21. ScriptingExecuteScriptFunction();
  22. ScriptingExecuteScriptFunction(const ScriptingExecuteScriptFunction&) =
  23. delete;
  24. ScriptingExecuteScriptFunction& operator=(
  25. const ScriptingExecuteScriptFunction&) = delete;
  26. // ExtensionFunction:
  27. ResponseAction Run() override;
  28. private:
  29. ~ScriptingExecuteScriptFunction() override;
  30. // Called when the resource files to be injected has been loaded.
  31. void DidLoadResources(std::vector<scripting::InjectedFileSource> file_sources,
  32. std::optional<std::string> load_error);
  33. // Triggers the execution of `sources` in the appropriate context.
  34. // Returns true on success; on failure, populates `error`.
  35. bool Execute(std::vector<mojom::JSSourcePtr> sources, std::string* error);
  36. // Invoked when script execution is complete.
  37. void OnScriptExecuted(std::vector<ScriptExecutor::FrameResult> frame_results);
  38. api::scripting::ScriptInjection injection_;
  39. };
  40. class ScriptingInsertCSSFunction : public ExtensionFunction {
  41. public:
  42. DECLARE_EXTENSION_FUNCTION("scripting.insertCSS", SCRIPTING_INSERTCSS)
  43. ScriptingInsertCSSFunction();
  44. ScriptingInsertCSSFunction(const ScriptingInsertCSSFunction&) = delete;
  45. ScriptingInsertCSSFunction& operator=(const ScriptingInsertCSSFunction&) =
  46. delete;
  47. // ExtensionFunction:
  48. ResponseAction Run() override;
  49. private:
  50. ~ScriptingInsertCSSFunction() override;
  51. // Called when the resource files to be injected has been loaded.
  52. void DidLoadResources(std::vector<scripting::InjectedFileSource> file_sources,
  53. std::optional<std::string> load_error);
  54. // Triggers the execution of `sources` in the appropriate context.
  55. // Returns true on success; on failure, populates `error`.
  56. bool Execute(std::vector<mojom::CSSSourcePtr> sources, std::string* error);
  57. // Called when the CSS insertion is complete.
  58. void OnCSSInserted(std::vector<ScriptExecutor::FrameResult> results);
  59. api::scripting::CSSInjection injection_;
  60. };
  61. class ScriptingRemoveCSSFunction : public ExtensionFunction {
  62. public:
  63. DECLARE_EXTENSION_FUNCTION("scripting.removeCSS", SCRIPTING_REMOVECSS)
  64. ScriptingRemoveCSSFunction();
  65. ScriptingRemoveCSSFunction(const ScriptingRemoveCSSFunction&) = delete;
  66. ScriptingRemoveCSSFunction& operator=(const ScriptingRemoveCSSFunction&) =
  67. delete;
  68. // ExtensionFunction:
  69. ResponseAction Run() override;
  70. private:
  71. ~ScriptingRemoveCSSFunction() override;
  72. // Called when the CSS removal is complete.
  73. void OnCSSRemoved(std::vector<ScriptExecutor::FrameResult> results);
  74. };
  75. class ScriptingRegisterContentScriptsFunction : public ExtensionFunction {
  76. public:
  77. DECLARE_EXTENSION_FUNCTION("scripting.registerContentScripts",
  78. SCRIPTING_REGISTERCONTENTSCRIPTS)
  79. ScriptingRegisterContentScriptsFunction();
  80. ScriptingRegisterContentScriptsFunction(
  81. const ScriptingRegisterContentScriptsFunction&) = delete;
  82. ScriptingRegisterContentScriptsFunction& operator=(
  83. const ScriptingRegisterContentScriptsFunction&) = delete;
  84. // ExtensionFunction:
  85. ResponseAction Run() override;
  86. private:
  87. ~ScriptingRegisterContentScriptsFunction() override;
  88. // Called when script files have been checked.
  89. void OnContentScriptFilesValidated(
  90. std::set<std::string> persistent_script_ids,
  91. scripting::ValidateScriptsResult result);
  92. // Called when content scripts have been registered.
  93. void OnContentScriptsRegistered(const std::optional<std::string>& error);
  94. };
  95. class ScriptingGetRegisteredContentScriptsFunction : public ExtensionFunction {
  96. public:
  97. DECLARE_EXTENSION_FUNCTION("scripting.getRegisteredContentScripts",
  98. SCRIPTING_GETREGISTEREDCONTENTSCRIPTS)
  99. ScriptingGetRegisteredContentScriptsFunction();
  100. ScriptingGetRegisteredContentScriptsFunction(
  101. const ScriptingGetRegisteredContentScriptsFunction&) = delete;
  102. ScriptingGetRegisteredContentScriptsFunction& operator=(
  103. const ScriptingGetRegisteredContentScriptsFunction&) = delete;
  104. // ExtensionFunction:
  105. ResponseAction Run() override;
  106. private:
  107. ~ScriptingGetRegisteredContentScriptsFunction() override;
  108. };
  109. class ScriptingUnregisterContentScriptsFunction : public ExtensionFunction {
  110. public:
  111. DECLARE_EXTENSION_FUNCTION("scripting.unregisterContentScripts",
  112. SCRIPTING_UNREGISTERCONTENTSCRIPTS)
  113. ScriptingUnregisterContentScriptsFunction();
  114. ScriptingUnregisterContentScriptsFunction(
  115. const ScriptingUnregisterContentScriptsFunction&) = delete;
  116. ScriptingUnregisterContentScriptsFunction& operator=(
  117. const ScriptingUnregisterContentScriptsFunction&) = delete;
  118. // ExtensionFunction:
  119. ResponseAction Run() override;
  120. private:
  121. ~ScriptingUnregisterContentScriptsFunction() override;
  122. // Called when content scripts have been unregistered.
  123. void OnContentScriptsUnregistered(const std::optional<std::string>& error);
  124. };
  125. class ScriptingUpdateContentScriptsFunction : public ExtensionFunction {
  126. public:
  127. DECLARE_EXTENSION_FUNCTION("scripting.updateContentScripts",
  128. SCRIPTING_UPDATECONTENTSCRIPTS)
  129. ScriptingUpdateContentScriptsFunction();
  130. ScriptingUpdateContentScriptsFunction(
  131. const ScriptingUpdateContentScriptsFunction&) = delete;
  132. ScriptingUpdateContentScriptsFunction& operator=(
  133. const ScriptingUpdateContentScriptsFunction&) = delete;
  134. // ExtensionFunction:
  135. ResponseAction Run() override;
  136. private:
  137. ~ScriptingUpdateContentScriptsFunction() override;
  138. // Returns a UserScript object by updating the `original_script` with the
  139. // `new_script` given delta. If the updated script cannot be parsed, populates
  140. // `parse_error` and returns nullptr.
  141. std::unique_ptr<UserScript> ApplyUpdate(
  142. std::set<std::string>* script_ids_to_persist,
  143. api::scripting::RegisteredContentScript& new_script,
  144. api::scripting::RegisteredContentScript& original_script,
  145. std::u16string* parse_error);
  146. // Called when script files have been checked.
  147. void OnContentScriptFilesValidated(
  148. std::set<std::string> persistent_script_ids,
  149. scripting::ValidateScriptsResult result);
  150. // Called when content scripts have been updated.
  151. void OnContentScriptsUpdated(const std::optional<std::string>& error);
  152. };
  153. } // namespace extensions
  154. #endif // ELECTRON_SHELL_BROWSER_EXTENSIONS_API_SCRIPTING_SCRIPTING_API_H_