mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
* chore: bump chromium in DEPS to 142.0.7401.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* 6911185: Reland "Send touch moves async immediately after scroll starts."
https://chromium-review.googlesource.com/c/chromium/src/+/6911185
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6906887: mac: click through content area in main window
https://chromium-review.googlesource.com/c/chromium/src/+/6906887
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6916667: Expose helper to eliminate duplicate recipes.
https://chromium-review.googlesource.com/c/chromium/src/+/6916667
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6909842: Switch LegacyRenderWidgetHostHWND from atlcrack.h to msg_util.h.
https://chromium-review.googlesource.com/c/chromium/src/+/6909842
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6884056: Remove the SecKeychain implementation for the Keychain interface
https://chromium-review.googlesource.com/c/chromium/src/+/6884056
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6904906: Remove `WTF::` in renderer/core/[p-x].*/
https://chromium-review.googlesource.com/c/chromium/src/+/6904906
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6556585: [persistent_cache]: PersistentCache for CodeCache
https://chromium-review.googlesource.com/c/chromium/src/+/6556585
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6904864: Layout: Support abort on the text placeholder layout
https://chromium-review.googlesource.com/c/chromium/src/+/6904864
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: fixup patch indices
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: bump chromium in DEPS to 142.0.7402.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* fixup! 6556585: [persistent_cache]: PersistentCache for CodeCache
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: fixup patch indices
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6905244: [api] Remove deprecated `GetIsolate`
https://chromium-review.googlesource.com/c/v8/v8/+/6905244
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6897694: Remove NativeTheme::UserHasContrastPreference().
https://chromium-review.googlesource.com/c/chromium/src/+/6897694
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6897477: Remove GetPlatformHighContrastColorScheme() and enum.
https://chromium-review.googlesource.com/c/chromium/src/+/6897477
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6918198: Reland "Rename display::Screen::GetScreen() to display::Screen::Get()"
https://chromium-review.googlesource.com/c/chromium/src/+/6918198
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6907147: [LNA] add use counter for websocket mixed-content issues
https://chromium-review.googlesource.com/c/chromium/src/+/6907147
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6914538: Replace WTF::String with blink::String
https://chromium-review.googlesource.com/c/website/+/6914538
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6892538: [video pip] Allow touchscreen users to toggle live caption
https://chromium-review.googlesource.com/c/chromium/src/+/6892538
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: fix patch
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: bump chromium in DEPS to 142.0.7403.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* build: remove ninja logs
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: fixup patch indices
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6920670: [PDF] Change pdf_extension_util to return dictionaries
https://chromium-review.googlesource.com/c/chromium/src/+/6920670
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6917864: Devirtualize and inline various NativeTheme getters.
https://chromium-review.googlesource.com/c/chromium/src/+/6917864
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6920873: [PDF] Simplify PDFDocumentHelperClient::OnSaveURL()
https://chromium-review.googlesource.com/c/chromium/src/+/6920873
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* build: don't kill blink/web_tests
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6923655: Roll libc++ from 954086abf121 to b87b2bb112f8 (4 revisions)
https://chromium-review.googlesource.com/c/chromium/src/+/6923655
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6905242: Reland "[CSP] Clarify report-only console messages."
https://chromium-review.googlesource.com/c/chromium/src/+/6905242
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* fixup! 6897694: Remove NativeTheme::UserHasContrastPreference().
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: bump chromium in DEPS to 142.0.7405.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* 6910012: [LNA] Enable LNA enforcement by default
https://chromium-review.googlesource.com/c/chromium/src/+/6910012
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6929444: Combine GetInstanceForXXX() implementations.
https://chromium-review.googlesource.com/c/chromium/src/+/6929444
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6927873: Rename native_widget_types.h -> native_ui_types.h
https://chromium-review.googlesource.com/c/chromium/src/+/6927873
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6853978: Init perfetto really early in WebView
https://chromium-review.googlesource.com/c/chromium/src/+/6853978
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6874886: Use only one picker observer to avoid getting duplicate notifications
https://chromium-review.googlesource.com/c/chromium/src/+/6874886
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: fixup patch indices
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* fix: Protocol complex inline dtor
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: bump chromium in DEPS to 142.0.7407.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* chore: bump chromium in DEPS to 142.0.7409.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* chore: bump chromium in DEPS to 142.0.7411.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* chore: bump chromium in DEPS to 142.0.7413.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* fixup! 6905242: Reland "[CSP] Clarify report-only console messages."
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6927233: Remove NativeTheme "use dark colors" bit.
https://chromium-review.googlesource.com/c/chromium/src/+/6927233
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: fixup patch indices
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* 6899206: [PermissionOptions] Multi-state permission subscriptions & setting changes
https://chromium-review.googlesource.com/c/chromium/src/+/6899206
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
* chore: bump chromium in DEPS to 142.0.7415.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* 6936895: [headless] Remove headless flag from views::Widget class
https://chromium-review.googlesource.com/c/chromium/src/+/6936895
We should probably followup on this to see if there is a way to do this without reverting this CL.
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* 6937023: Reland "Use new DBus type system in dbus_xdg::Request"
https://chromium-review.googlesource.com/c/chromium/src/+/6937023
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* chore: update patches
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* 6944749: Add GN visibility list to //components/os_crypt/sync
https://chromium-review.googlesource.com/c/chromium/src/+/6944749
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* Further replace sub_capture_target_version with CaptureVersion
https://chromium-review.googlesource.com/c/chromium/src/+/6935455
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* fixup for lint
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* chore: update filenames.libcxx.gni
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
* chore: bump chromium in DEPS to 142.0.7417.0
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
* 6944136: Reorder NativeTheme headers/.cc files.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6944136
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* 6939701: [DSSC][4] Make FSVCI objects aware of their capture-version-source
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6939701
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* 6944404: Remove extraneous callback call
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6944404
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* 6936124: [FPF-CI]: Introduce blink::NoiseToken for fingerprinting protection
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6936124
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* chore: update patches
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* fixup! 6927233: Remove NativeTheme "use dark colors" bit.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6927233
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* fixup! 6917864: Devirtualize and inline various NativeTheme getters.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6917864
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* 6937588: Add initial OsSettingsProvider object, supplying caret blink interval.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6937588
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* fixup! 6905242: Reland "[CSP] Clarify report-only console messages."
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6905242
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* 6907515: Replace SingletonHwndObserver with a CallbackList on SingletonHwnd.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6907515
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* 6910482: [Save to Drive] Implement retry functionality
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6910482
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* fixup! 6927233: Remove NativeTheme "use dark colors" bit.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6927233
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
* Revert "build: remove ninja logs"
This reverts commit 72874740fd.
Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>
* test: fix flakey test picked from PR 48205
Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>
* chore: update patches
---------
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>
455 lines
20 KiB
Diff
455 lines
20 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cheng Zhao <zcbenz@gmail.com>
|
|
Date: Thu, 14 Dec 2023 21:16:53 +0900
|
|
Subject: Enable V8 code cache for custom schemes
|
|
|
|
Add a new category in ContentClient::AddAdditionalSchemes which allows
|
|
embedders to make custom schemes allow V8 code cache.
|
|
|
|
Chromium CL: https://chromium-review.googlesource.com/c/chromium/src/+/5019665
|
|
|
|
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc
|
|
index b798ae06446d68fe74e7fef3ade515e9c77f1f73..0b0ecebef9e34986a95e4d9f3b52fcce19f2d686 100644
|
|
--- a/content/browser/code_cache/generated_code_cache.cc
|
|
+++ b/content/browser/code_cache/generated_code_cache.cc
|
|
@@ -8,6 +8,7 @@
|
|
#include <string_view>
|
|
|
|
#include "base/compiler_specific.h"
|
|
+#include "base/containers/contains.h"
|
|
#include "base/feature_list.h"
|
|
#include "base/functional/bind.h"
|
|
#include "base/functional/callback_helpers.h"
|
|
@@ -31,6 +32,7 @@
|
|
#include "net/http/http_cache.h"
|
|
#include "third_party/blink/public/common/scheme_registry.h"
|
|
#include "url/gurl.h"
|
|
+#include "url/url_util.h"
|
|
|
|
using storage::BigIOBuffer;
|
|
|
|
@@ -53,39 +55,55 @@ void CheckValidResource(const GURL& resource_url,
|
|
GeneratedCodeCache::CodeCacheType cache_type) {
|
|
// If the resource url is invalid don't cache the code.
|
|
DCHECK(resource_url.is_valid());
|
|
- bool resource_url_is_chrome_or_chrome_untrusted =
|
|
+ // There are 3 kind of URL scheme compatible for the `resource_url`.
|
|
+ // 1. http: and https: URLs.
|
|
+ // 2. chrome: and chrome-untrusted: URLs.
|
|
+ // 3. URLs whose scheme are allowed by the content/ embedder.
|
|
+ const bool resource_url_http = resource_url.SchemeIsHTTPOrHTTPS();
|
|
+ const bool resource_url_webui =
|
|
resource_url.SchemeIs(content::kChromeUIScheme) ||
|
|
resource_url.SchemeIs(content::kChromeUIUntrustedScheme);
|
|
- DCHECK(resource_url.SchemeIsHTTPOrHTTPS() ||
|
|
- resource_url_is_chrome_or_chrome_untrusted ||
|
|
- blink::CommonSchemeRegistry::IsExtensionScheme(resource_url.scheme()));
|
|
-
|
|
- // The chrome and chrome-untrusted schemes are only used with the WebUI
|
|
- // code cache type.
|
|
- DCHECK_EQ(resource_url_is_chrome_or_chrome_untrusted,
|
|
- cache_type == GeneratedCodeCache::kWebUIJavaScript);
|
|
+ const bool resource_url_embedder =
|
|
+ base::Contains(url::GetCodeCacheSchemes(), resource_url.scheme());
|
|
+ DCHECK(resource_url_http || resource_url_webui || resource_url_embedder);
|
|
}
|
|
|
|
void CheckValidContext(const GURL& origin_lock,
|
|
GeneratedCodeCache::CodeCacheType cache_type) {
|
|
- // |origin_lock| should be either empty or should have
|
|
- // Http/Https/chrome/chrome-untrusted schemes and it should not be a URL with
|
|
- // opaque origin. Empty origin_locks are allowed when the renderer is not
|
|
- // locked to an origin.
|
|
- bool origin_lock_is_chrome_or_chrome_untrusted =
|
|
+ // |origin_lock| should be either empty or should have code cache allowed
|
|
+ // schemes (http/https/chrome/chrome-untrusted or other custom schemes added
|
|
+ // by url::AddCodeCacheScheme), and it should not be a URL with opaque
|
|
+ // origin. Empty origin_locks are allowed when the renderer is not locked to
|
|
+ // an origin.
|
|
+ const bool origin_lock_empty = origin_lock.is_empty();
|
|
+ const bool origin_lock_for_http = origin_lock.SchemeIsHTTPOrHTTPS();
|
|
+ const bool origin_lock_for_webui =
|
|
origin_lock.SchemeIs(content::kChromeUIScheme) ||
|
|
origin_lock.SchemeIs(content::kChromeUIUntrustedScheme);
|
|
- DCHECK(
|
|
- origin_lock.is_empty() ||
|
|
- ((origin_lock.SchemeIsHTTPOrHTTPS() ||
|
|
- origin_lock_is_chrome_or_chrome_untrusted ||
|
|
- blink::CommonSchemeRegistry::IsExtensionScheme(origin_lock.scheme())) &&
|
|
- !url::Origin::Create(origin_lock).opaque()));
|
|
-
|
|
- // The chrome and chrome-untrusted schemes are only used with the WebUI
|
|
- // code cache type.
|
|
- DCHECK_EQ(origin_lock_is_chrome_or_chrome_untrusted,
|
|
- cache_type == GeneratedCodeCache::kWebUIJavaScript);
|
|
+
|
|
+ const bool origin_lock_for_embedder =
|
|
+ base::Contains(url::GetCodeCacheSchemes(), origin_lock.scheme());
|
|
+
|
|
+ DCHECK(origin_lock_empty || ((origin_lock_for_http || origin_lock_for_webui ||
|
|
+ origin_lock_for_embedder) &&
|
|
+ !url::Origin::Create(origin_lock).opaque()));
|
|
+
|
|
+ // The webui schemes are only used with their dedicated code cache type.
|
|
+ switch (cache_type) {
|
|
+ case GeneratedCodeCache::kJavaScript:
|
|
+ case GeneratedCodeCache::kWebAssembly:
|
|
+ DCHECK(!origin_lock_for_webui);
|
|
+ break;
|
|
+ case GeneratedCodeCache::kWebUIJavaScript:
|
|
+ DCHECK(origin_lock_for_webui);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ // The custom schemes share the cache type with http(s).
|
|
+ if (origin_lock_for_embedder) {
|
|
+ DCHECK(cache_type == GeneratedCodeCache::kJavaScript ||
|
|
+ cache_type == GeneratedCodeCache::kWebAssembly);
|
|
+ }
|
|
}
|
|
|
|
// Generates the cache key for the given |resource_url|, |origin_lock| and
|
|
diff --git a/content/browser/code_cache/generated_code_cache.h b/content/browser/code_cache/generated_code_cache.h
|
|
index a01f0d96ef33ce9460a851b072b7ceed5227dee3..f7e39b28cc0ba2251123925c01083a7935f46f56 100644
|
|
--- a/content/browser/code_cache/generated_code_cache.h
|
|
+++ b/content/browser/code_cache/generated_code_cache.h
|
|
@@ -51,12 +51,14 @@ class CONTENT_EXPORT GeneratedCodeCache {
|
|
// Cache type. Used for collecting statistics for JS and Wasm in separate
|
|
// buckets.
|
|
enum CodeCacheType {
|
|
- // JavaScript from http(s) pages.
|
|
+ // JavaScript from pages of http(s) schemes or custom schemes registered by
|
|
+ // url::AddCodeCacheScheme.
|
|
kJavaScript,
|
|
|
|
- // WebAssembly from http(s) pages. This cache allows more total size and
|
|
- // more size per item than the JavaScript cache, since some
|
|
- // WebAssembly programs are very large.
|
|
+ // WebAssembly from pages of http(s) schemes or custom schemes registered by
|
|
+ // url::AddCodeCacheScheme. This cache allows more total size and more size
|
|
+ // per item than the JavaScript cache, since some WebAssembly programs are
|
|
+ // very large.
|
|
kWebAssembly,
|
|
|
|
// JavaScript from chrome and chrome-untrusted pages. The resource URLs are
|
|
diff --git a/content/browser/code_cache/generated_code_cache_browsertest.cc b/content/browser/code_cache/generated_code_cache_browsertest.cc
|
|
index 28556e56f2fd591c46ce6f48d39eb907876a499d..f5737ba60fb9e182459066ffa62c7c589f379954 100644
|
|
--- a/content/browser/code_cache/generated_code_cache_browsertest.cc
|
|
+++ b/content/browser/code_cache/generated_code_cache_browsertest.cc
|
|
@@ -16,17 +16,22 @@
|
|
#include "base/time/time.h"
|
|
#include "content/browser/code_cache/generated_code_cache_context.h"
|
|
#include "content/browser/renderer_host/code_cache_host_impl.h"
|
|
+#include "content/browser/storage_partition_impl.h"
|
|
#include "content/browser/web_contents/web_contents_impl.h"
|
|
#include "content/common/renderer.mojom.h"
|
|
+#include "content/common/url_schemes.h"
|
|
#include "content/public/browser/browser_context.h"
|
|
+#include "content/public/browser/browser_thread.h"
|
|
#include "content/public/browser/render_process_host.h"
|
|
#include "content/public/browser/storage_partition.h"
|
|
#include "content/public/test/browser_test.h"
|
|
#include "content/public/test/browser_test_utils.h"
|
|
#include "content/public/test/content_browser_test.h"
|
|
#include "content/public/test/content_browser_test_utils.h"
|
|
+#include "content/public/test/test_browser_context.h"
|
|
#include "content/shell/browser/shell.h"
|
|
#include "content/test/content_browser_test_utils_internal.h"
|
|
+#include "content/test/test_content_client.h"
|
|
#include "net/base/features.h"
|
|
#include "net/dns/mock_host_resolver.h"
|
|
#include "third_party/blink/public/common/features.h"
|
|
@@ -37,6 +42,8 @@ namespace content {
|
|
|
|
namespace {
|
|
|
|
+const std::string kCodeCacheScheme = "test-code-cache";
|
|
+
|
|
bool SupportsSharedWorker() {
|
|
return base::FeatureList::IsEnabled(blink::features::kSharedWorker);
|
|
}
|
|
@@ -1044,4 +1051,82 @@ IN_PROC_BROWSER_TEST_F(LocalCompileHintsBrowserTest, LocalCompileHints) {
|
|
}
|
|
}
|
|
|
|
+class CodeCacheInCustomSchemeBrowserTest : public ContentBrowserTest,
|
|
+ public TestContentClient {
|
|
+ public:
|
|
+ CodeCacheInCustomSchemeBrowserTest() {
|
|
+ SetContentClient(this);
|
|
+ ReRegisterContentSchemesForTests();
|
|
+ }
|
|
+
|
|
+ ~CodeCacheInCustomSchemeBrowserTest() override { SetContentClient(nullptr); }
|
|
+
|
|
+ private:
|
|
+ void AddAdditionalSchemes(Schemes* schemes) override {
|
|
+ schemes->standard_schemes.push_back(kCodeCacheScheme);
|
|
+ schemes->code_cache_schemes.push_back(kCodeCacheScheme);
|
|
+ }
|
|
+
|
|
+ url::ScopedSchemeRegistryForTests scheme_registry_;
|
|
+};
|
|
+
|
|
+IN_PROC_BROWSER_TEST_F(CodeCacheInCustomSchemeBrowserTest,
|
|
+ AllowedCustomSchemeCanGenerateCodeCache) {
|
|
+ StoragePartitionImpl* partition =
|
|
+ static_cast<StoragePartitionImpl*>(shell()
|
|
+ ->web_contents()
|
|
+ ->GetBrowserContext()
|
|
+ ->GetDefaultStoragePartition());
|
|
+ scoped_refptr<GeneratedCodeCacheContext> context =
|
|
+ partition->GetGeneratedCodeCacheContext();
|
|
+ EXPECT_NE(context, nullptr);
|
|
+
|
|
+ GURL url(kCodeCacheScheme + "://host4/script.js");
|
|
+ GURL origin(kCodeCacheScheme + "://host1:1/");
|
|
+ ASSERT_TRUE(url.is_valid());
|
|
+ ASSERT_TRUE(origin.is_valid());
|
|
+ std::string data("SomeData");
|
|
+
|
|
+ // Add a code cache entry for the custom scheme.
|
|
+ base::test::TestFuture<void> add_entry_future;
|
|
+ GeneratedCodeCacheContext::RunOrPostTask(
|
|
+ context.get(), FROM_HERE,
|
|
+ base::BindOnce(
|
|
+ [](scoped_refptr<GeneratedCodeCacheContext> context, const GURL& url,
|
|
+ const GURL& origin, const std::string& data,
|
|
+ base::OnceClosure callback) {
|
|
+ context->generated_js_code_cache()->WriteEntry(
|
|
+ url, origin, net::NetworkIsolationKey(), base::Time::Now(),
|
|
+ std::vector<uint8_t>(data.begin(), data.end()));
|
|
+ GetUIThreadTaskRunner({})->PostTask(FROM_HERE, std::move(callback));
|
|
+ },
|
|
+ context, url, origin, data, add_entry_future.GetCallback()));
|
|
+ ASSERT_TRUE(add_entry_future.Wait());
|
|
+
|
|
+ // Get the code cache entry.
|
|
+ base::test::TestFuture<std::string> get_entry_future;
|
|
+ GeneratedCodeCacheContext::RunOrPostTask(
|
|
+ context.get(), FROM_HERE,
|
|
+ base::BindOnce(
|
|
+ [](scoped_refptr<GeneratedCodeCacheContext> context, const GURL& url,
|
|
+ const GURL& origin,
|
|
+ base::OnceCallback<void(std::string)> callback) {
|
|
+ context->generated_js_code_cache()->FetchEntry(
|
|
+ url, origin, net::NetworkIsolationKey(),
|
|
+ base::BindOnce(
|
|
+ [](base::OnceCallback<void(std::string)> callback,
|
|
+ const base::Time& response_time,
|
|
+ mojo_base::BigBuffer buffer) {
|
|
+ std::string data(buffer.data(),
|
|
+ buffer.data() + buffer.size());
|
|
+ GetUIThreadTaskRunner({})->PostTask(
|
|
+ FROM_HERE, base::BindOnce(std::move(callback), data));
|
|
+ },
|
|
+ std::move(callback)));
|
|
+ },
|
|
+ context, url, origin, get_entry_future.GetCallback()));
|
|
+ ASSERT_TRUE(get_entry_future.Wait());
|
|
+ ASSERT_EQ(data, get_entry_future.Get<0>());
|
|
+}
|
|
+
|
|
} // namespace content
|
|
diff --git a/content/browser/renderer_host/code_cache_host_impl.cc b/content/browser/renderer_host/code_cache_host_impl.cc
|
|
index 7b4408f3480bd062ab9221f524633c177a212790..8d283d84b0817a937845b221bb13c6ed12bfade6 100644
|
|
--- a/content/browser/renderer_host/code_cache_host_impl.cc
|
|
+++ b/content/browser/renderer_host/code_cache_host_impl.cc
|
|
@@ -7,6 +7,7 @@
|
|
#include <string_view>
|
|
#include <utility>
|
|
|
|
+#include "base/containers/contains.h"
|
|
#include "base/feature_list.h"
|
|
#include "base/functional/bind.h"
|
|
#include "base/functional/callback_helpers.h"
|
|
@@ -36,6 +37,7 @@
|
|
#include "third_party/blink/public/mojom/loader/code_cache.mojom-data-view.h"
|
|
#include "url/gurl.h"
|
|
#include "url/origin.h"
|
|
+#include "url/url_util.h"
|
|
|
|
using blink::mojom::CacheStorageError;
|
|
|
|
@@ -55,6 +57,11 @@ GeneratedCodeCache::CodeCacheType MojoCacheTypeToCodeCacheType(
|
|
}
|
|
}
|
|
|
|
+bool ProcessLockURLIsCodeCacheScheme(const ProcessLock& process_lock) {
|
|
+ return base::Contains(url::GetCodeCacheSchemes(),
|
|
+ process_lock.GetProcessLockURL().scheme());
|
|
+}
|
|
+
|
|
bool CheckSecurityForAccessingCodeCacheData(
|
|
const GURL& resource_url,
|
|
int render_process_id,
|
|
@@ -65,39 +72,56 @@ bool CheckSecurityForAccessingCodeCacheData(
|
|
|
|
// Code caching is only allowed for http(s) and chrome/chrome-untrusted
|
|
// scripts. Furthermore, there is no way for http(s) pages to load chrome or
|
|
+ // Code caching is only allowed for scripts from:
|
|
+ // 1. http: and https: schemes.
|
|
+ // 2. chrome: and chrome-untrusted: schemes.
|
|
+ // 3. Schemes registered by content/ embedder via url::AddCodeCacheScheme.
|
|
+ //
|
|
+ // Furthermore, we know there are no way for http(s) pages to load chrome or
|
|
// chrome-untrusted scripts, so any http(s) page attempting to store data
|
|
// about a chrome or chrome-untrusted script would be an indication of
|
|
// suspicious activity.
|
|
- if (resource_url.SchemeIs(content::kChromeUIScheme) ||
|
|
- resource_url.SchemeIs(content::kChromeUIUntrustedScheme)) {
|
|
- if (!process_lock.IsLockedToSite()) {
|
|
- // We can't tell for certain whether this renderer is doing something
|
|
- // malicious, but we don't trust it enough to store data.
|
|
- return false;
|
|
- }
|
|
+ if (resource_url.SchemeIsHTTPOrHTTPS()) {
|
|
if (process_lock.MatchesScheme(url::kHttpScheme) ||
|
|
process_lock.MatchesScheme(url::kHttpsScheme)) {
|
|
- if (operation == CodeCacheHostImpl::Operation::kWrite) {
|
|
+ return true;
|
|
+ }
|
|
+ // Pages in custom schemes like isolated-app: are allowed to load http(s)
|
|
+ // resources.
|
|
+ if (ProcessLockURLIsCodeCacheScheme(process_lock)) {
|
|
+ return true;
|
|
+ }
|
|
+ // It is possible for WebUI pages to include open-web content, but such
|
|
+ // usage is rare and we've decided that reasoning about security is easier
|
|
+ // if the WebUI code cache includes only WebUI scripts.
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ if (resource_url.SchemeIs(content::kChromeUIScheme) ||
|
|
+ resource_url.SchemeIs(content::kChromeUIUntrustedScheme)) {
|
|
+ if (process_lock.MatchesScheme(content::kChromeUIScheme) ||
|
|
+ process_lock.MatchesScheme(content::kChromeUIUntrustedScheme)) {
|
|
+ return true;
|
|
+ }
|
|
+ if (operation == CodeCacheHostImpl::Operation::kWrite) {
|
|
+ if (process_lock.MatchesScheme(url::kHttpScheme) ||
|
|
+ process_lock.MatchesScheme(url::kHttpsScheme)) {
|
|
mojo::ReportBadMessage("HTTP(S) pages cannot cache WebUI code");
|
|
}
|
|
+ if (ProcessLockURLIsCodeCacheScheme(process_lock)) {
|
|
+ mojo::ReportBadMessage(
|
|
+ "Page whose scheme are allowed by content/ embedders cannot cache "
|
|
+ "WebUI code. Did the embedder misconfigured content/?");
|
|
+ }
|
|
return false;
|
|
}
|
|
// Other schemes which might successfully load chrome or chrome-untrusted
|
|
// scripts, such as the PDF viewer, are unsupported but not considered
|
|
- // dangerous.
|
|
- return process_lock.MatchesScheme(content::kChromeUIScheme) ||
|
|
- process_lock.MatchesScheme(content::kChromeUIUntrustedScheme);
|
|
+ // dangerous. Similarly, the process might not be locked to a site.
|
|
+ return false;
|
|
}
|
|
- if (resource_url.SchemeIsHTTPOrHTTPS() ||
|
|
- blink::CommonSchemeRegistry::IsExtensionScheme(resource_url.scheme())) {
|
|
- if (process_lock.MatchesScheme(content::kChromeUIScheme) ||
|
|
- process_lock.MatchesScheme(content::kChromeUIUntrustedScheme)) {
|
|
- // It is possible for WebUI pages to include open-web content, but such
|
|
- // usage is rare and we've decided that reasoning about security is easier
|
|
- // if the WebUI code cache includes only WebUI scripts.
|
|
- return false;
|
|
- }
|
|
- return true;
|
|
+ if (base::Contains(url::GetCodeCacheSchemes(), resource_url.scheme())) {
|
|
+ return ProcessLockURLIsCodeCacheScheme(process_lock);
|
|
}
|
|
|
|
if (operation == CodeCacheHostImpl::Operation::kWrite) {
|
|
@@ -530,6 +554,7 @@ std::optional<GURL> CodeCacheHostImpl::GetSecondaryKeyForCodeCache(
|
|
process_lock.MatchesScheme(url::kHttpsScheme) ||
|
|
process_lock.MatchesScheme(content::kChromeUIScheme) ||
|
|
process_lock.MatchesScheme(content::kChromeUIUntrustedScheme) ||
|
|
+ ProcessLockURLIsCodeCacheScheme(process_lock) ||
|
|
blink::CommonSchemeRegistry::IsExtensionScheme(
|
|
process_lock.GetProcessLockURL().scheme())) {
|
|
return process_lock.GetProcessLockURL();
|
|
diff --git a/content/common/url_schemes.cc b/content/common/url_schemes.cc
|
|
index 225e017909b8869231b870eaaf161a0b5e93e2a0..846a5251429630b8528a84a3d67ed56cb28df5a1 100644
|
|
--- a/content/common/url_schemes.cc
|
|
+++ b/content/common/url_schemes.cc
|
|
@@ -102,6 +102,14 @@ void RegisterContentSchemes(bool should_lock_registry) {
|
|
for (auto& scheme : schemes.empty_document_schemes)
|
|
url::AddEmptyDocumentScheme(scheme.c_str());
|
|
|
|
+ for (auto& scheme : schemes.code_cache_schemes) {
|
|
+ CHECK_NE(scheme, kChromeUIScheme);
|
|
+ CHECK_NE(scheme, kChromeUIUntrustedScheme);
|
|
+ CHECK_NE(scheme, url::kHttpScheme);
|
|
+ CHECK_NE(scheme, url::kHttpsScheme);
|
|
+ url::AddCodeCacheScheme(scheme.c_str());
|
|
+ }
|
|
+
|
|
#if BUILDFLAG(IS_ANDROID)
|
|
if (schemes.allow_non_standard_schemes_in_origins)
|
|
url::EnableNonStandardSchemesForAndroidWebView();
|
|
diff --git a/content/public/common/content_client.h b/content/public/common/content_client.h
|
|
index 52f16979b05b692ef72762d0cbc16bcb361b047e..b658ebeb9c572158b27d94af56331be8cbb519e6 100644
|
|
--- a/content/public/common/content_client.h
|
|
+++ b/content/public/common/content_client.h
|
|
@@ -139,6 +139,9 @@ class CONTENT_EXPORT ContentClient {
|
|
// Registers a URL scheme as strictly empty documents, allowing them to
|
|
// commit synchronously.
|
|
std::vector<std::string> empty_document_schemes;
|
|
+ // Registers a URL scheme whose js and wasm scripts have V8 code cache
|
|
+ // enabled.
|
|
+ std::vector<std::string> code_cache_schemes;
|
|
// Registers a URL scheme as extension scheme.
|
|
std::vector<std::string> extension_schemes;
|
|
// Registers a URL scheme with a predefined default custom handler.
|
|
diff --git a/url/url_util.cc b/url/url_util.cc
|
|
index f77ce7f6de0a183debfdf272aa17c35c8307c480..54cbc57dc5217447cdf2895d6918e27001a39b7e 100644
|
|
--- a/url/url_util.cc
|
|
+++ b/url/url_util.cc
|
|
@@ -136,6 +136,9 @@ struct SchemeRegistry {
|
|
kMaterializedViewScheme,
|
|
};
|
|
|
|
+ // Embedder schemes that have V8 code cache enabled in js and wasm scripts.
|
|
+ std::vector<std::string> code_cache_schemes = {};
|
|
+
|
|
// Schemes with a predefined default custom handler.
|
|
std::vector<SchemeWithHandler> predefined_handler_schemes;
|
|
|
|
@@ -694,6 +697,15 @@ const std::vector<std::string>& GetEmptyDocumentSchemes() {
|
|
return GetSchemeRegistry().empty_document_schemes;
|
|
}
|
|
|
|
+void AddCodeCacheScheme(const char* new_scheme) {
|
|
+ DoAddScheme(new_scheme,
|
|
+ &GetSchemeRegistryWithoutLocking()->code_cache_schemes);
|
|
+}
|
|
+
|
|
+const std::vector<std::string>& GetCodeCacheSchemes() {
|
|
+ return GetSchemeRegistry().code_cache_schemes;
|
|
+}
|
|
+
|
|
void AddPredefinedHandlerScheme(const char* new_scheme, const char* handler) {
|
|
DoAddSchemeWithHandler(
|
|
new_scheme, handler,
|
|
diff --git a/url/url_util.h b/url/url_util.h
|
|
index 50c273fe9c2007ec5ac6675726ce0ae9811af9e2..5f7352ff5eba9c548aaaea63f75e9551c81ce305 100644
|
|
--- a/url/url_util.h
|
|
+++ b/url/url_util.h
|
|
@@ -115,6 +115,15 @@ COMPONENT_EXPORT(URL) const std::vector<std::string>& GetCSPBypassingSchemes();
|
|
COMPONENT_EXPORT(URL) void AddEmptyDocumentScheme(const char* new_scheme);
|
|
COMPONENT_EXPORT(URL) const std::vector<std::string>& GetEmptyDocumentSchemes();
|
|
|
|
+// Adds an application-defined scheme to the list of schemes that have V8 code
|
|
+// cache enabled for the js and wasm scripts.
|
|
+// The WebUI schemes (chrome/chrome-untrusted) do not belong to this list, as
|
|
+// they are treated as a separate cache type for security purpose.
|
|
+// The http(s) schemes do not belong to this list neither, they always have V8
|
|
+// code cache enabled.
|
|
+COMPONENT_EXPORT(URL) void AddCodeCacheScheme(const char* new_scheme);
|
|
+COMPONENT_EXPORT(URL) const std::vector<std::string>& GetCodeCacheSchemes();
|
|
+
|
|
// Adds a scheme with a predefined default handler.
|
|
//
|
|
// This pair of strings must be normalized protocol handler parameters as
|