create_browser_v8_snapshot_file_name_fuse.patch 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Ryan Manuel <[email protected]>
  3. Date: Thu, 4 Aug 2022 22:37:01 -0500
  4. Subject: Create browser v8 snapshot file name fuse
  5. By default, chromium sets up one v8 snapshot to be used in all v8 contexts. This patch allows consumers
  6. to have a dedicated browser process v8 snapshot defined by the file `browser_v8_context_snapshot.bin`.
  7. diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
  8. index f143dbf39d011153c83a4d4c0b9afc54bb839ab9..2563c7c0abc4c5eae2ec27bb0bbde398fc977d42 100644
  9. --- a/content/app/content_main_runner_impl.cc
  10. +++ b/content/app/content_main_runner_impl.cc
  11. @@ -45,6 +45,7 @@
  12. #include "base/process/memory.h"
  13. #include "base/process/process.h"
  14. #include "base/process/process_handle.h"
  15. +#include "base/strings/string_piece.h"
  16. #include "base/strings/string_number_conversions.h"
  17. #include "base/strings/string_util.h"
  18. #include "base/task/single_thread_task_runner.h"
  19. @@ -281,8 +282,13 @@ void AsanProcessInfoCB(const char*, bool*) {
  20. }
  21. #endif // defined(ADDRESS_SANITIZER)
  22. -void LoadV8SnapshotFile(const base::CommandLine& command_line) {
  23. +void LoadV8SnapshotFile(const raw_ptr<ContentMainDelegate> delegate, const base::CommandLine& command_line) {
  24. const gin::V8SnapshotFileType snapshot_type = GetSnapshotType(command_line);
  25. + base::StringPiece browser_v8_snapshot_file_name = delegate->GetBrowserV8SnapshotFilename();
  26. + if (!browser_v8_snapshot_file_name.empty()) {
  27. + gin::V8Initializer::LoadV8SnapshotFromFileName(browser_v8_snapshot_file_name, snapshot_type);
  28. + return;
  29. + }
  30. #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
  31. base::FileDescriptorStore& file_descriptor_store =
  32. base::FileDescriptorStore::GetInstance();
  33. @@ -311,11 +317,12 @@ bool ShouldLoadV8Snapshot(const base::CommandLine& command_line,
  34. #endif // V8_USE_EXTERNAL_STARTUP_DATA
  35. -void LoadV8SnapshotIfNeeded(const base::CommandLine& command_line,
  36. +void LoadV8SnapshotIfNeeded(const raw_ptr<ContentMainDelegate> delegate,
  37. + const base::CommandLine& command_line,
  38. const std::string& process_type) {
  39. #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
  40. if (ShouldLoadV8Snapshot(command_line, process_type))
  41. - LoadV8SnapshotFile(command_line);
  42. + LoadV8SnapshotFile(delegate, command_line);
  43. #endif // V8_USE_EXTERNAL_STARTUP_DATA
  44. }
  45. @@ -994,7 +1001,7 @@ int ContentMainRunnerImpl::Initialize(ContentMainParams params) {
  46. return TerminateForFatalInitializationError();
  47. #endif // BUILDFLAG(IS_ANDROID) && (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE)
  48. - LoadV8SnapshotIfNeeded(command_line, process_type);
  49. + LoadV8SnapshotIfNeeded(delegate_, command_line, process_type);
  50. blink::TrialTokenValidator::SetOriginTrialPolicyGetter(
  51. base::BindRepeating([]() -> blink::OriginTrialPolicy* {
  52. diff --git a/content/public/app/content_main_delegate.cc b/content/public/app/content_main_delegate.cc
  53. index a5762a7ed48bb841a9a8a219f08e2f6703bd777a..a3905996445e1cb0d566cad31c409b5dd82e8365 100644
  54. --- a/content/public/app/content_main_delegate.cc
  55. +++ b/content/public/app/content_main_delegate.cc
  56. @@ -5,6 +5,7 @@
  57. #include "content/public/app/content_main_delegate.h"
  58. #include "base/check.h"
  59. +#include "base/strings/string_piece.h"
  60. #include "build/build_config.h"
  61. #include "content/public/browser/content_browser_client.h"
  62. #include "content/public/common/content_client.h"
  63. @@ -91,6 +92,10 @@ std::optional<int> ContentMainDelegate::PostEarlyInitialization(
  64. return std::nullopt;
  65. }
  66. +base::StringPiece ContentMainDelegate::GetBrowserV8SnapshotFilename() {
  67. + return base::StringPiece();
  68. +}
  69. +
  70. ContentClient* ContentMainDelegate::CreateContentClient() {
  71. return new ContentClient();
  72. }
  73. diff --git a/content/public/app/content_main_delegate.h b/content/public/app/content_main_delegate.h
  74. index f482ce44b4339e0cf2a57a6a4f9db4d1be5fa178..d6fd25ccd747a7a0620f103cb0f101d3137348fa 100644
  75. --- a/content/public/app/content_main_delegate.h
  76. +++ b/content/public/app/content_main_delegate.h
  77. @@ -10,6 +10,7 @@
  78. #include <string>
  79. #include <vector>
  80. +#include "base/strings/string_piece.h"
  81. #include "build/build_config.h"
  82. #include "content/common/content_export.h"
  83. #include "content/public/common/main_function_params.h"
  84. @@ -176,6 +177,8 @@ class CONTENT_EXPORT ContentMainDelegate {
  85. virtual bool ShouldHandleConsoleControlEvents();
  86. #endif
  87. + virtual base::StringPiece GetBrowserV8SnapshotFilename();
  88. +
  89. protected:
  90. friend class ContentClientCreator;
  91. friend class ContentClientInitializer;
  92. diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
  93. index cafbc4e6f6425853ad8cd3166a341453bfb8b9f4..d9448ee36a997a81082b960e01f3bbbd6e0d4340 100644
  94. --- a/gin/v8_initializer.cc
  95. +++ b/gin/v8_initializer.cc
  96. @@ -598,8 +598,7 @@ void V8Initializer::GetV8ExternalSnapshotData(const char** snapshot_data_out,
  97. #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
  98. -// static
  99. -void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
  100. +void V8Initializer::LoadV8SnapshotFromFileName(base::StringPiece file_name, V8SnapshotFileType snapshot_file_type) {
  101. if (g_mapped_snapshot) {
  102. // TODO(crbug.com/40558459): Confirm not loading different type of snapshot
  103. // files in a process.
  104. @@ -608,10 +607,17 @@ void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
  105. base::MemoryMappedFile::Region file_region;
  106. base::File file =
  107. - OpenV8File(GetSnapshotFileName(snapshot_file_type), &file_region);
  108. + OpenV8File(file_name.data(), &file_region);
  109. LoadV8SnapshotFromFile(std::move(file), &file_region, snapshot_file_type);
  110. }
  111. +// static
  112. +void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
  113. + const char* file_name = GetSnapshotFileName(snapshot_file_type);
  114. +
  115. + LoadV8SnapshotFromFileName(file_name, snapshot_file_type);
  116. +}
  117. +
  118. // static
  119. void V8Initializer::LoadV8SnapshotFromFile(
  120. base::File snapshot_file,
  121. diff --git a/gin/v8_initializer.h b/gin/v8_initializer.h
  122. index dd9899c3e0dbadfc0074ffce87d51193e1c963cb..25c747ee645d845a0abfaf63cc66595319df4b51 100644
  123. --- a/gin/v8_initializer.h
  124. +++ b/gin/v8_initializer.h
  125. @@ -9,6 +9,7 @@
  126. #include "base/files/file.h"
  127. #include "base/files/memory_mapped_file.h"
  128. +#include "base/strings/string_piece.h"
  129. #include "build/build_config.h"
  130. #include "gin/array_buffer.h"
  131. #include "gin/gin_export.h"
  132. @@ -42,6 +43,7 @@ class GIN_EXPORT V8Initializer {
  133. int* snapshot_size_out);
  134. #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
  135. + static void LoadV8SnapshotFromFileName(base::StringPiece file_name, V8SnapshotFileType snapshot_file_type);
  136. // Load V8 snapshot from default resources, if they are available.
  137. static void LoadV8Snapshot(
  138. V8SnapshotFileType snapshot_file_type = V8SnapshotFileType::kDefault);