|  | // 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_COMMON_API_SCRIPTS_INTERNAL_SCRIPT_SERIALIZATION_H_ | 
|  | #define EXTENSIONS_COMMON_API_SCRIPTS_INTERNAL_SCRIPT_SERIALIZATION_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "extensions/common/api/scripts_internal.h" | 
|  | #include "extensions/common/user_script.h" | 
|  |  | 
|  | namespace extensions { | 
|  | class Extension; | 
|  |  | 
|  | namespace script_serialization { | 
|  |  | 
|  | // Converts a list of file names into a list of `ScriptSource`s. | 
|  | std::vector<api::scripts_internal::ScriptSource> GetSourcesFromFileNames( | 
|  | std::vector<std::string> file_names); | 
|  |  | 
|  | // Serialized the given `user_script`. This is guaranteed to succeed (assuming | 
|  | // `user_script` is valid). | 
|  | api::scripts_internal::SerializedUserScript SerializeUserScript( | 
|  | const UserScript& user_script); | 
|  |  | 
|  | // Additional options for parsing user scripts. | 
|  | struct SerializedUserScriptParseOptions { | 
|  | // If populated, used in the error message. | 
|  | std::optional<int> index_for_error; | 
|  | // If true, indicates the extension can execute scripts on every page without | 
|  | // additional permission (this should only be true for special extensions like | 
|  | // ChromeVox). | 
|  | bool can_execute_script_everywhere = false; | 
|  | // If true, `<all_urls>` match patterns will also match chrome:-scheme URLs. | 
|  | bool all_urls_includes_chrome_urls = false; | 
|  | }; | 
|  |  | 
|  | // Attempts to deserialize `serialized_script` into a new `UserScript`. This can | 
|  | // fail if `serialized_script` has invalid values for parsed types (e.g., | 
|  | // match patterns). `allowed_in_incognito` indicates if the corresponding | 
|  | // extension (and thus, user script) is allowed in incognito mode. | 
|  | // If `error_out` is provided, it will be populated on failure. | 
|  | // If `wants_file_access_out` is provided, it will be populated with whether the | 
|  | // extension wants file access according to the patterns in the serialized | 
|  | // script. | 
|  | // TODO(devlin): It'd be nice to use std::optional here, but UserScripts are | 
|  | // currently passed by pointer a lot. | 
|  | std::unique_ptr<UserScript> ParseSerializedUserScript( | 
|  | const api::scripts_internal::SerializedUserScript& serialized_script, | 
|  | const Extension& extension, | 
|  | bool allowed_in_incognito, | 
|  | std::u16string* error_out = nullptr, | 
|  | bool* wants_file_access_out = nullptr, | 
|  | SerializedUserScriptParseOptions parse_options = {}); | 
|  |  | 
|  | }  // namespace script_serialization | 
|  | }  // namespace extensions | 
|  |  | 
|  | #endif  // EXTENSIONS_COMMON_API_SCRIPTS_INTERNAL_SCRIPT_SERIALIZATION_H_ |