From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ryan Manuel <ryanm@cypress.io>
Date: Thu, 4 Aug 2022 22:37:01 -0500
Subject: Create browser v8 snapshot file name fuse

By default, chromium sets up one v8 snapshot to be used in all v8 contexts. This patch allows consumers
to have a dedicated browser process v8 snapshot defined by the file `browser_v8_context_snapshot.bin`.

diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index bde1ca7a9d076d240056a38437615523f9fa2420..a3259377e3ceecfe181dc2b22a4a86e3aae46c36 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -279,8 +279,13 @@ void AsanProcessInfoCB(const char*, bool*) {
 }
 #endif  // defined(ADDRESS_SANITIZER)
 
-void LoadV8SnapshotFile(const base::CommandLine& command_line) {
+void LoadV8SnapshotFile(const raw_ptr<ContentMainDelegate> delegate, const base::CommandLine& command_line) {
   const gin::V8SnapshotFileType snapshot_type = GetSnapshotType(command_line);
+  std::string_view browser_v8_snapshot_file_name = delegate->GetBrowserV8SnapshotFilename();
+  if (!browser_v8_snapshot_file_name.empty()) {
+    gin::V8Initializer::LoadV8SnapshotFromFileName(browser_v8_snapshot_file_name, snapshot_type);
+    return;
+  }
 #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
   base::FileDescriptorStore& file_descriptor_store =
       base::FileDescriptorStore::GetInstance();
@@ -309,11 +314,12 @@ bool ShouldLoadV8Snapshot(const base::CommandLine& command_line,
 
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
-void LoadV8SnapshotIfNeeded(const base::CommandLine& command_line,
+void LoadV8SnapshotIfNeeded(const raw_ptr<ContentMainDelegate> delegate,
+                            const base::CommandLine& command_line,
                             const std::string& process_type) {
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   if (ShouldLoadV8Snapshot(command_line, process_type))
-    LoadV8SnapshotFile(command_line);
+    LoadV8SnapshotFile(delegate, command_line);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 }
 
@@ -989,7 +995,7 @@ int ContentMainRunnerImpl::Initialize(ContentMainParams params) {
     return TerminateForFatalInitializationError();
 #endif  // BUILDFLAG(IS_ANDROID) && (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE)
 
-  LoadV8SnapshotIfNeeded(command_line, process_type);
+  LoadV8SnapshotIfNeeded(delegate_, command_line, process_type);
 
   blink::TrialTokenValidator::SetOriginTrialPolicyGetter(
       base::BindRepeating([]() -> blink::OriginTrialPolicy* {
diff --git a/content/public/app/content_main_delegate.cc b/content/public/app/content_main_delegate.cc
index a5762a7ed48bb841a9a8a219f08e2f6703bd777a..991ce9ffa6fc89121d2fda3ece57ffa1f5af4a7c 100644
--- a/content/public/app/content_main_delegate.cc
+++ b/content/public/app/content_main_delegate.cc
@@ -4,6 +4,8 @@
 
 #include "content/public/app/content_main_delegate.h"
 
+#include <string_view>
+
 #include "base/check.h"
 #include "build/build_config.h"
 #include "content/public/browser/content_browser_client.h"
@@ -91,6 +93,10 @@ std::optional<int> ContentMainDelegate::PostEarlyInitialization(
   return std::nullopt;
 }
 
+std::string_view ContentMainDelegate::GetBrowserV8SnapshotFilename() {
+  return std::string_view();
+}
+
 ContentClient* ContentMainDelegate::CreateContentClient() {
   return new ContentClient();
 }
diff --git a/content/public/app/content_main_delegate.h b/content/public/app/content_main_delegate.h
index 592199d119cbfc382f94a380f78d82b36d97dd41..de428aeb9ca856d4031c4f4718c08e625c8f70e9 100644
--- a/content/public/app/content_main_delegate.h
+++ b/content/public/app/content_main_delegate.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <optional>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "build/build_config.h"
@@ -173,6 +174,8 @@ class CONTENT_EXPORT ContentMainDelegate {
   virtual bool ShouldHandleConsoleControlEvents();
 #endif
 
+  virtual std::string_view GetBrowserV8SnapshotFilename();
+
  protected:
   friend class ContentClientCreator;
   friend class ContentClientInitializer;
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
index 741eb0bfe9f624c3bb8edfe7dc8e36b19a281365..e7bae92bd94cf7bbadccf36e6cd7f87a2ae1f9ca 100644
--- a/gin/v8_initializer.cc
+++ b/gin/v8_initializer.cc
@@ -655,8 +655,7 @@ void V8Initializer::GetV8ExternalSnapshotData(const char** snapshot_data_out,
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
 
-// static
-void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
+void V8Initializer::LoadV8SnapshotFromFileName(std::string_view file_name, V8SnapshotFileType snapshot_file_type) {
   if (g_mapped_snapshot) {
     // TODO(crbug.com/40558459): Confirm not loading different type of snapshot
     // files in a process.
@@ -665,10 +664,17 @@ void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
 
   base::MemoryMappedFile::Region file_region;
   base::File file =
-      OpenV8File(GetSnapshotFileName(snapshot_file_type), &file_region);
+      OpenV8File(file_name.data(), &file_region);
   LoadV8SnapshotFromFile(std::move(file), &file_region, snapshot_file_type);
 }
 
+// static
+void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
+  const char* file_name = GetSnapshotFileName(snapshot_file_type);
+
+  LoadV8SnapshotFromFileName(file_name, snapshot_file_type);
+}
+
 // static
 void V8Initializer::LoadV8SnapshotFromFile(
     base::File snapshot_file,
diff --git a/gin/v8_initializer.h b/gin/v8_initializer.h
index cd7b010978f3f595263761e0692945667b9b3f89..328315aaa34fdd24d7b3dfe5373ec366cceaa124 100644
--- a/gin/v8_initializer.h
+++ b/gin/v8_initializer.h
@@ -7,6 +7,8 @@
 
 #include <stdint.h>
 
+#include <string_view>
+
 #include "base/files/file.h"
 #include "base/files/memory_mapped_file.h"
 #include "build/build_config.h"
@@ -42,6 +44,7 @@ class GIN_EXPORT V8Initializer {
                                         int* snapshot_size_out);
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+  static void LoadV8SnapshotFromFileName(std::string_view file_name, V8SnapshotFileType snapshot_file_type);
   // Load V8 snapshot from default resources, if they are available.
   static void LoadV8Snapshot(
       V8SnapshotFileType snapshot_file_type = V8SnapshotFileType::kDefault);
