// Copyright (c) 2025 Salesforce, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ELECTRON_SHELL_BROWSER_PRELOAD_SCRIPT_H_ #define ELECTRON_SHELL_BROWSER_PRELOAD_SCRIPT_H_ #include #include "base/containers/fixed_flat_map.h" #include "base/files/file_path.h" #include "base/uuid.h" #include "gin/converter.h" #include "shell/common/gin_converters/file_path_converter.h" #include "shell/common/gin_helper/dictionary.h" namespace electron { struct PreloadScript { enum class ScriptType { kWebFrame, kServiceWorker }; std::string id; ScriptType script_type; base::FilePath file_path; // If set, use the deprecated validation behavior of Session.setPreloads bool deprecated = false; }; } // namespace electron namespace gin { using electron::PreloadScript; template <> struct Converter { static v8::Local ToV8(v8::Isolate* isolate, const PreloadScript::ScriptType& in) { using Val = PreloadScript::ScriptType; static constexpr auto Lookup = base::MakeFixedFlatMap({ {Val::kWebFrame, "frame"}, {Val::kServiceWorker, "service-worker"}, }); return StringToV8(isolate, Lookup.at(in)); } static bool FromV8(v8::Isolate* isolate, v8::Local val, PreloadScript::ScriptType* out) { using Val = PreloadScript::ScriptType; static constexpr auto Lookup = base::MakeFixedFlatMap({ {"frame", Val::kWebFrame}, {"service-worker", Val::kServiceWorker}, }); return FromV8WithLookup(isolate, val, Lookup, out); } }; template <> struct Converter { static v8::Local ToV8(v8::Isolate* isolate, const PreloadScript& script) { gin::Dictionary dict(isolate, v8::Object::New(isolate)); dict.Set("filePath", script.file_path.AsUTF8Unsafe()); dict.Set("id", script.id); dict.Set("type", script.script_type); return ConvertToV8(isolate, dict).As(); } static bool FromV8(v8::Isolate* isolate, v8::Local val, PreloadScript* out) { gin_helper::Dictionary options; if (!ConvertFromV8(isolate, val, &options)) return false; if (PreloadScript::ScriptType script_type; options.Get("type", &script_type)) { out->script_type = script_type; } else { return false; } if (base::FilePath file_path; options.Get("filePath", &file_path)) { out->file_path = file_path; } else { return false; } if (std::string id; options.Get("id", &id)) { out->id = id; } else { out->id = base::Uuid::GenerateRandomV4().AsLowercaseString(); } if (bool deprecated; options.Get("_deprecated", &deprecated)) { out->deprecated = deprecated; } return true; } }; } // namespace gin #endif // ELECTRON_SHELL_BROWSER_PRELOAD_SCRIPT_H_