ports/www/qt6-webengine/files/patch-security-rollup
Jason E. Hale 382d782806 www/qt6-webengine: Address multiple vulnerabilities
Includes security patches up to Chromium 131.0.6778.108.

MFH:		2024Q4
Security:	c2fd83e4-b450-11ef-b680-4ccc6adda413
2024-12-07 10:59:31 -05:00

2885 lines
139 KiB
Plaintext

Security fixes applied to the 118-based branch [1] after Qt 6.7.3 release.
Includes fixes between [2] and [3]. [4] has been redacted, since it disrupts
our main patches, is not a security fix, and only applies to iOS.
[1] https://code.qt.io/cgit/qt/qtwebengine-chromium.git/log/chromium?h=118-based
[2] https://code.qt.io/cgit/qt/qtwebengine-chromium.git/commit/chromium?h=118-based&id=45bdfbd7721749beea9abd18467465e4c9026559
[3] https://code.qt.io/cgit/qt/qtwebengine-chromium.git/commit/chromium?h=118-based&id=eb31082fcba2380e2cc5789aa707328050531e8d
[4] https://code.qt.io/cgit/qt/qtwebengine-chromium.git/commit/chromium?h=118-based&id=edb5aad8fc938acb291261ec123f5d25f615ddc7
diff --git a/chromium/base/mac/wrap_cg_display.h b/chromium/base/mac/wrap_cg_display.h
index a579ef1a900..8645627a3a1 100644
--- src/3rdparty/chromium/base/mac/wrap_cg_display.h
+++ src/3rdparty/chromium/base/mac/wrap_cg_display.h
@@ -12,6 +12,11 @@
#include <CoreGraphics/CoreGraphics.h>
+// Build fix for macOS SDK 15 and newer
+#if !defined(CG_AVAILABLE_BUT_DEPRECATED)
+#define CG_AVAILABLE_BUT_DEPRECATED(a,b,c)
+#endif
+
inline CGDisplayStreamRef __nullable wrapCGDisplayStreamCreate(
CGDirectDisplayID display,
size_t outputWidth,
diff --git a/chromium/base/metrics/field_trial.cc b/chromium/base/metrics/field_trial.cc
index 2b67eb59ba1..81243e649e8 100644
--- src/3rdparty/chromium/base/metrics/field_trial.cc
+++ src/3rdparty/chromium/base/metrics/field_trial.cc
@@ -1020,7 +1020,7 @@ std::string FieldTrialList::SerializeSharedMemoryRegionMetadata(
// Tell the child process the name of the inherited HANDLE.
uintptr_t uintptr_handle =
reinterpret_cast<uintptr_t>(shm.GetPlatformHandle());
- ss << uintptr_handle << ",";
+ ss << NumberToString(uintptr_handle) << ",";
if (launch_options->elevated) {
// Tell the child that it must open its parent and grab the handle.
ss << "p,";
@@ -1061,8 +1061,8 @@ std::string FieldTrialList::SerializeSharedMemoryRegionMetadata(
#endif
UnguessableToken guid = shm.GetGUID();
- ss << guid.GetHighForSerialization() << "," << guid.GetLowForSerialization();
- ss << "," << shm.GetSize();
+ ss << NumberToString(guid.GetHighForSerialization()) << "," << NumberToString(guid.GetLowForSerialization());
+ ss << "," << NumberToString(shm.GetSize());
return ss.str();
}
diff --git a/chromium/base/trace_event/trace_event_etw_export_win.cc b/chromium/base/trace_event/trace_event_etw_export_win.cc
index 04e2ab0b350..26f6b168373 100644
--- src/3rdparty/chromium/base/trace_event/trace_event_etw_export_win.cc
+++ src/3rdparty/chromium/base/trace_event/trace_event_etw_export_win.cc
@@ -426,8 +426,8 @@ bool TraceEventETWExport::IsCategoryGroupEnabled(
if (!instance->etw_provider_->IsEnabled())
return false;
- CStringTokenizer category_group_tokens(&*category_group_name.begin(),
- &*category_group_name.end(), ",");
+ CStringTokenizer category_group_tokens(category_group_name.data(),
+ category_group_name.data() + category_group_name.size(), ",");
while (category_group_tokens.GetNext()) {
StringPiece category_group_token = category_group_tokens.token_piece();
if (instance->IsCategoryEnabled(category_group_token)) {
diff --git a/chromium/components/viz/service/gl/gpu_service_impl.cc b/chromium/components/viz/service/gl/gpu_service_impl.cc
index 0156b748c38..bed248728cc 100644
--- src/3rdparty/chromium/components/viz/service/gl/gpu_service_impl.cc
+++ src/3rdparty/chromium/components/viz/service/gl/gpu_service_impl.cc
@@ -143,12 +143,6 @@ namespace viz {
namespace {
-// Whether to crash the GPU service on context loss when running in-process with
-// ANGLE.
-BASE_FEATURE(kCrashOnInProcessANGLEContextLoss,
- "CrashOnInProcessANGLEContextLoss",
- base::FEATURE_DISABLED_BY_DEFAULT);
-
// The names emitted for GPU initialization trace events.
// This code may be removed after the following investigation:
// crbug.com/1350257
@@ -671,16 +665,6 @@ void GpuServiceImpl::InitializeWithHost(
// initialized.
gl::DirectCompositionOverlayCapsMonitor::GetInstance()->AddObserver(this);
#endif
-
- if (in_host_process() &&
- gpu_channel_manager_->use_passthrough_cmd_decoder()) {
- // Check `kCrashOnInProcessANGLEContextLoss` to ensure registration within
- // the experiment - the check done at the time of MaybeExitOnContextLost()
- // doesn't cause clients in the enabled arm to become registered in the
- // experiment due to it being followed by an immediate crash.
- [[maybe_unused]] bool unused =
- base::FeatureList::IsEnabled(kCrashOnInProcessANGLEContextLoss);
- }
}
void GpuServiceImpl::Bind(
@@ -1063,24 +1047,6 @@ void GpuServiceImpl::MaybeExitOnContextLost(
DCHECK(main_runner_->BelongsToCurrentThread());
if (in_host_process()) {
- // When running with ANGLE, crash on a backend context loss if
- // `kCrashOnInProcessANGLEContextLoss` is enabled. This enables evaluation
- // of the hypothesis that as ANGLE is currently unable to recover from
- // context loss when running within Chrome, it is better to crash in this
- // case than enter into a loop of context loss events leading to undefined
- // behavior. Note that it *is* possible to recover from a context loss
- // event that was generated by Chrome rather than being due to an actual
- // backend context loss. In general, this is context losses where
- // `synthetic_loss is true - the one exception is if `context_lost_reason`
- // is `kMakeCurrentFailed`, which we regard as an unrecoverable context
- // loss even though `synthetic_loss` will be set to true.
- if (gpu_channel_manager_->use_passthrough_cmd_decoder() &&
- (!synthetic_loss ||
- context_lost_reason == gpu::error::kMakeCurrentFailed) &&
- base::FeatureList::IsEnabled(kCrashOnInProcessANGLEContextLoss)) {
- CHECK(false);
- }
-
// We can't restart the GPU process when running in the host process;
// instead, just hope for recovery from the context loss.
return;
diff --git a/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.cc b/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.cc
index ec3216d5f92..bb3602f58b9 100644
--- src/3rdparty/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.cc
+++ src/3rdparty/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.cc
@@ -54,32 +54,6 @@ using UserAction = FileSystemAccessPermissionContext::UserAction;
#endif
namespace {
-// Returns whether the specified extension receives special handling by the
-// Windows shell.
-bool IsShellIntegratedExtension(const base::FilePath::StringType& extension) {
- base::FilePath::StringType extension_lower = base::ToLowerASCII(extension);
-
- // .lnk and .scf files may be used to execute arbitrary code (see
- // https://nvd.nist.gov/vuln/detail/CVE-2010-2568 and
- // https://crbug.com/1227995, respectively). '.url' files can be used to read
- // arbitrary files (see https://crbug.com/1307930 and
- // https://crbug.com/1354518).
- if (extension_lower == FILE_PATH_LITERAL("lnk") ||
- extension_lower == FILE_PATH_LITERAL("scf") ||
- extension_lower == FILE_PATH_LITERAL("url")) {
- return true;
- }
-
- // Setting a file's extension to a CLSID may conceal its actual file type on
- // some Windows versions (see https://nvd.nist.gov/vuln/detail/CVE-2004-0420).
- if (!extension_lower.empty() &&
- (extension_lower.front() == FILE_PATH_LITERAL('{')) &&
- (extension_lower.back() == FILE_PATH_LITERAL('}'))) {
- return true;
- }
- return false;
-}
-
#if BUILDFLAG(IS_POSIX)
base::FilePath ReadSymbolicLink(const base::FilePath& path) {
DCHECK(!path.empty());
@@ -710,80 +684,13 @@ void FileSystemAccessDirectoryHandleImpl::AllEntriesReady(
file_system_access_error::Ok(), std::move(entries), has_more_entries);
}
-// static
-bool FileSystemAccessDirectoryHandleImpl::IsSafePathComponent(
- const std::string& name) {
- // This method is similar to net::IsSafePortablePathComponent, with a few
- // notable differences where the net version does not consider names safe
- // while here we do want to allow them. These cases are:
- // - Names starting with a '.'. These would be hidden files in most file
- // managers, but are something we explicitly want to support for the
- // File System Access API, for names like .git.
- // - Names that end in '.local'. For downloads writing to such files is
- // dangerous since it might modify what code is executed when an executable
- // is ran from the same directory. For the File System Access API this
- // isn't really a problem though, since if a website can write to a .local
- // file via a FileSystemDirectoryHandle they can also just modify the
- // executables in the directory directly.
- //
- // TODO(https://crbug.com/1154757): Unify this with
- // net::IsSafePortablePathComponent, with the result probably ending up in
- // base/i18n/file_util_icu.h.
-
- const base::FilePath component = storage::StringToFilePath(name);
- // Empty names, or names that contain path separators are invalid.
- if (component.empty() || component != component.BaseName() ||
- component != component.StripTrailingSeparators()) {
- return false;
- }
-
- std::u16string component16;
-#if BUILDFLAG(IS_WIN)
- component16.assign(component.value().begin(), component.value().end());
-#else
- std::string component8 = component.AsUTF8Unsafe();
- if (!base::UTF8ToUTF16(component8.c_str(), component8.size(), &component16)) {
- return false;
- }
-#endif
- // base::i18n::IsFilenameLegal blocks names that start with '.', so strip out
- // a leading '.' before passing it to that method.
- // TODO(mek): Consider making IsFilenameLegal more flexible to support this
- // use case.
- if (component16[0] == '.') {
- component16 = component16.substr(1);
- }
- if (!base::i18n::IsFilenameLegal(component16)) {
- return false;
- }
-
- base::FilePath::StringType extension = component.Extension();
- if (!extension.empty()) {
- extension.erase(extension.begin()); // Erase preceding '.'.
- }
- if (IsShellIntegratedExtension(extension)) {
- return false;
- }
-
- if (base::TrimString(component.value(), FILE_PATH_LITERAL("."),
- base::TRIM_TRAILING) != component.value()) {
- return false;
- }
-
- if (net::IsReservedNameOnWindows(component.value())) {
- return false;
- }
-
- return true;
-}
-
blink::mojom::FileSystemAccessErrorPtr
FileSystemAccessDirectoryHandleImpl::GetChildURL(
const std::string& basename,
storage::FileSystemURL* result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!IsSafePathComponent(basename)) {
+ if (!manager()->IsSafePathComponent(basename)) {
return file_system_access_error::FromStatus(
FileSystemAccessStatus::kInvalidArgument, "Name is not allowed.");
}
diff --git a/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.h b/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.h
index 7bbec9a39d9..98452fc1f56 100644
--- src/3rdparty/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.h
+++ src/3rdparty/chromium/content/browser/file_system_access/file_system_access_directory_handle_impl.h
@@ -84,14 +84,6 @@ class CONTENT_EXPORT FileSystemAccessDirectoryHandleImpl
const std::string& basename,
storage::FileSystemURL* result);
- // The File System Access API should not give access to files that might
- // trigger special handling from the operating system. This method is used to
- // validate that all paths passed to GetFileHandle/GetDirectoryHandle are safe
- // to be exposed to the web.
- // TODO(https://crbug.com/1154757): Merge this with
- // net::IsSafePortablePathComponent.
- static bool IsSafePathComponent(const std::string& name);
-
private:
// This method creates the file if it does not currently exists. I.e. it is
// the implementation for passing create=true to GetFile.
diff --git a/chromium/content/browser/file_system_access/file_system_access_handle_base.cc b/chromium/content/browser/file_system_access/file_system_access_handle_base.cc
index 5792ad95e45..44891c0b75c 100644
--- src/3rdparty/chromium/content/browser/file_system_access/file_system_access_handle_base.cc
+++ src/3rdparty/chromium/content/browser/file_system_access/file_system_access_handle_base.cc
@@ -217,7 +217,7 @@ void FileSystemAccessHandleBase::DoMove(
}
}
- if (!FileSystemAccessDirectoryHandleImpl::IsSafePathComponent(
+ if (!manager()->IsSafePathComponent(
new_entry_name)) {
std::move(callback).Run(file_system_access_error::FromStatus(
blink::mojom::FileSystemAccessStatus::kInvalidArgument));
@@ -250,7 +250,7 @@ void FileSystemAccessHandleBase::DoRename(
}
}
- if (!FileSystemAccessDirectoryHandleImpl::IsSafePathComponent(
+ if (!manager()->IsSafePathComponent(
new_entry_name)) {
std::move(callback).Run(file_system_access_error::FromStatus(
blink::mojom::FileSystemAccessStatus::kInvalidArgument));
diff --git a/chromium/content/browser/file_system_access/file_system_access_manager_impl.cc b/chromium/content/browser/file_system_access/file_system_access_manager_impl.cc
index faa3f12e452..c0d16224f11 100644
--- src/3rdparty/chromium/content/browser/file_system_access/file_system_access_manager_impl.cc
+++ src/3rdparty/chromium/content/browser/file_system_access/file_system_access_manager_impl.cc
@@ -15,9 +15,11 @@
#include "base/functional/bind.h"
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
+#include "base/i18n/file_util_icu.h"
#include "base/notreached.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
@@ -296,6 +298,32 @@ void DidCheckIfDefaultDirectoryExists(
}
}
+// Returns whether the specified extension receives special handling by the
+// Windows shell.
+bool IsShellIntegratedExtension(const base::FilePath::StringType& extension) {
+ base::FilePath::StringType extension_lower = base::ToLowerASCII(extension);
+
+ // .lnk and .scf files may be used to execute arbitrary code (see
+ // https://nvd.nist.gov/vuln/detail/CVE-2010-2568 and
+ // https://crbug.com/1227995, respectively). '.url' files can be used to read
+ // arbitrary files (see https://crbug.com/1307930 and
+ // https://crbug.com/1354518).
+ if (extension_lower == FILE_PATH_LITERAL("lnk") ||
+ extension_lower == FILE_PATH_LITERAL("scf") ||
+ extension_lower == FILE_PATH_LITERAL("url")) {
+ return true;
+ }
+
+ // Setting a file's extension to a CLSID may conceal its actual file type on
+ // some Windows versions (see https://nvd.nist.gov/vuln/detail/CVE-2004-0420).
+ if (!extension_lower.empty() &&
+ (extension_lower.front() == FILE_PATH_LITERAL('{')) &&
+ (extension_lower.back() == FILE_PATH_LITERAL('}'))) {
+ return true;
+ }
+ return false;
+}
+
} // namespace
FileSystemAccessManagerImpl::SharedHandleState::SharedHandleState(
@@ -1749,4 +1777,69 @@ FileSystemAccessManagerImpl::AsWeakPtr() {
return weak_factory_.GetWeakPtr();
}
+bool FileSystemAccessManagerImpl::IsSafePathComponent(
+ const std::string& name) {
+ // This method is similar to net::IsSafePortablePathComponent, with a few
+ // notable differences where the net version does not consider names safe
+ // while here we do want to allow them. These cases are:
+ // - Names starting with a '.'. These would be hidden files in most file
+ // managers, but are something we explicitly want to support for the
+ // File System Access API, for names like .git.
+ // - Names that end in '.local'. For downloads writing to such files is
+ // dangerous since it might modify what code is executed when an executable
+ // is ran from the same directory. For the File System Access API this
+ // isn't really a problem though, since if a website can write to a .local
+ // file via a FileSystemDirectoryHandle they can also just modify the
+ //
+ // TODO(crbug.com/40159607): Unify this with
+ // net::IsSafePortablePathComponent, with the result probably ending up in
+ // base/i18n/file_util_icu.h.
+
+ const base::FilePath component = storage::StringToFilePath(name);
+ // Empty names, or names that contain path separators are invalid.
+ if (component.empty() || component != component.BaseName() ||
+ component != component.StripTrailingSeparators()) {
+ return false;
+ }
+
+ std::u16string component16;
+#if BUILDFLAG(IS_WIN)
+ component16.assign(component.value().begin(), component.value().end());
+#else
+ std::string component8 = component.AsUTF8Unsafe();
+ if (!base::UTF8ToUTF16(component8.c_str(), component8.size(), &component16)) {
+ return false;
+ }
+#endif
+ // base::i18n::IsFilenameLegal blocks names that start with '.', so strip out
+ // a leading '.' before passing it to that method.
+ // TODO(mek): Consider making IsFilenameLegal more flexible to support this
+ // use case.
+ if (component16[0] == '.') {
+ component16 = component16.substr(1);
+ }
+ if (!base::i18n::IsFilenameLegal(component16)) {
+ return false;
+ }
+
+ base::FilePath::StringType extension = component.Extension();
+ if (!extension.empty()) {
+ extension.erase(extension.begin()); // Erase preceding '.'.
+ }
+ if (IsShellIntegratedExtension(extension)) {
+ return false;
+ }
+
+ if (base::TrimString(component.value(), FILE_PATH_LITERAL("."),
+ base::TRIM_TRAILING) != component.value()) {
+ return false;
+ }
+
+ if (net::IsReservedNameOnWindows(component.value())) {
+ return false;
+ }
+
+ return true;
+}
+
} // namespace content
diff --git a/chromium/content/browser/file_system_access/file_system_access_manager_impl.h b/chromium/content/browser/file_system_access/file_system_access_manager_impl.h
index 2b6828054b7..eeda10526b8 100644
--- src/3rdparty/chromium/content/browser/file_system_access/file_system_access_manager_impl.h
+++ src/3rdparty/chromium/content/browser/file_system_access/file_system_access_manager_impl.h
@@ -359,6 +359,14 @@ class CONTENT_EXPORT FileSystemAccessManagerImpl
void Shutdown();
+ // The File System Access API should not give access to files that might
+ // trigger special handling from the operating system. This method is used to
+ // validate that all paths passed to GetFileHandle/GetDirectoryHandle are safe
+ // to be exposed to the web.
+ // TODO(crbug.com/40159607): Merge this with
+ // net::IsSafePortablePathComponent.
+ bool IsSafePathComponent(const std::string& name);
+
// Invokes `method` on the correct sequence on the FileSystemOperationRunner,
// passing `args` and a callback to the method.
// The passed in `callback` is wrapped to make sure it is called on the
diff --git a/chromium/content/browser/renderer_host/cross_process_frame_connector.cc b/chromium/content/browser/renderer_host/cross_process_frame_connector.cc
index 00eb0fb1348..2944d939029 100644
--- src/3rdparty/chromium/content/browser/renderer_host/cross_process_frame_connector.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/cross_process_frame_connector.cc
@@ -60,10 +60,11 @@ CrossProcessFrameConnector::~CrossProcessFrameConnector() {
}
// Notify the view of this object being destroyed, if the view still exists.
- SetView(nullptr);
+ SetView(nullptr, /*allow_paint_holding=*/false);
}
-void CrossProcessFrameConnector::SetView(RenderWidgetHostViewChildFrame* view) {
+void CrossProcessFrameConnector::SetView(RenderWidgetHostViewChildFrame* view,
+ bool allow_paint_holding) {
// Detach ourselves from the previous |view_|.
if (view_) {
RenderWidgetHostViewBase* root_view = GetRootRenderWidgetHostView();
@@ -110,7 +111,7 @@ void CrossProcessFrameConnector::SetView(RenderWidgetHostViewChildFrame* view) {
if (frame_proxy_in_parent_renderer_ &&
frame_proxy_in_parent_renderer_->is_render_frame_proxy_live()) {
frame_proxy_in_parent_renderer_->GetAssociatedRemoteFrame()
- ->SetFrameSinkId(view_->GetFrameSinkId());
+ ->SetFrameSinkId(view_->GetFrameSinkId(), allow_paint_holding);
}
}
}
diff --git a/chromium/content/browser/renderer_host/cross_process_frame_connector.h b/chromium/content/browser/renderer_host/cross_process_frame_connector.h
index 05ecb60aebe..4436cd1fba7 100644
--- src/3rdparty/chromium/content/browser/renderer_host/cross_process_frame_connector.h
+++ src/3rdparty/chromium/content/browser/renderer_host/cross_process_frame_connector.h
@@ -100,7 +100,7 @@ class CONTENT_EXPORT CrossProcessFrameConnector {
// above.
RenderWidgetHostViewChildFrame* get_view_for_testing() { return view_; }
- void SetView(RenderWidgetHostViewChildFrame* view);
+ void SetView(RenderWidgetHostViewChildFrame* view, bool allow_paint_holding);
// Returns the parent RenderWidgetHostView or nullptr if it doesn't have one.
virtual RenderWidgetHostViewBase* GetParentRenderWidgetHostView();
diff --git a/chromium/content/browser/renderer_host/delegated_frame_host.cc b/chromium/content/browser/renderer_host/delegated_frame_host.cc
index 3ea56e0e536..499a23b5209 100644
--- src/3rdparty/chromium/content/browser/renderer_host/delegated_frame_host.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/delegated_frame_host.cc
@@ -503,7 +503,10 @@ void DelegatedFrameHost::ContinueDelegatedFrameEviction(
// preventing the FrameTree from being traversed. This could happen during
// navigation involving BFCache. This should not occur with
// features::kEvictSubtree.
- DCHECK(!surface_ids.empty() ||
+ // We do allow the surface ids to be empty if we
+ // don't have a local surface id, since that means we don't have memory
+ // allocated in viz.
+ DCHECK(!surface_ids.empty() || !local_surface_id_.is_valid() ||
!base::FeatureList::IsEnabled(features::kEvictSubtree));
if (!surface_ids.empty()) {
DCHECK(host_frame_sink_manager_);
diff --git a/chromium/content/browser/renderer_host/navigation_controller_impl.cc b/chromium/content/browser/renderer_host/navigation_controller_impl.cc
index db818eb83e9..084fd00eeae 100644
--- src/3rdparty/chromium/content/browser/renderer_host/navigation_controller_impl.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/navigation_controller_impl.cc
@@ -1826,6 +1826,7 @@ void NavigationControllerImpl::UpdateNavigationEntryDetails(
params.method, params.post_id, nullptr /* blob_url_loader_factory */,
ComputePolicyContainerPoliciesForFrameEntry(
rfh, request && request->IsSameDocument(),
+ request ? request->DidEncounterError() : false,
request ? request->common_params().url : params.url));
if (rfh->GetParent()) {
@@ -2288,6 +2289,7 @@ void NavigationControllerImpl::RendererDidNavigateNewSubframe(
}
std::unique_ptr<PolicyContainerPolicies> policy_container_policies =
ComputePolicyContainerPoliciesForFrameEntry(rfh, is_same_document,
+ request->DidEncounterError(),
request->GetURL());
bool protect_url_in_navigation_api = false;
if (is_same_document) {
@@ -4474,7 +4476,14 @@ std::unique_ptr<PolicyContainerPolicies>
NavigationControllerImpl::ComputePolicyContainerPoliciesForFrameEntry(
RenderFrameHostImpl* rfh,
bool is_same_document,
+ bool navigation_encountered_error,
const GURL& url) {
+ if (navigation_encountered_error) {
+ // We should never reload the policy container of an error page from
+ // history, see https://crbug.com/364773822.
+ return nullptr;
+ }
+
if (is_same_document) {
DCHECK(GetLastCommittedEntry());
FrameNavigationEntry* previous_frame_entry =
diff --git a/chromium/content/browser/renderer_host/navigation_controller_impl.h b/chromium/content/browser/renderer_host/navigation_controller_impl.h
index ba9be480a81..987963d4bf4 100644
--- src/3rdparty/chromium/content/browser/renderer_host/navigation_controller_impl.h
+++ src/3rdparty/chromium/content/browser/renderer_host/navigation_controller_impl.h
@@ -835,6 +835,7 @@ class CONTENT_EXPORT NavigationControllerImpl : public NavigationController {
std::unique_ptr<PolicyContainerPolicies>
ComputePolicyContainerPoliciesForFrameEntry(RenderFrameHostImpl* rfh,
bool is_same_document,
+ bool navigation_encountered_error,
const GURL& url);
// Adds details from a committed navigation to `entry` and the
diff --git a/chromium/content/browser/renderer_host/navigator.cc b/chromium/content/browser/renderer_host/navigator.cc
index e4cdb82d559..fd5e2eb26c3 100644
--- src/3rdparty/chromium/content/browser/renderer_host/navigator.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/navigator.cc
@@ -32,6 +32,7 @@
#include "content/browser/web_package/prefetched_signed_exchange_cache.h"
#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/browser/webui/web_ui_impl.h"
+#include "content/common/features.h"
#include "content/common/navigation_params_utils.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/content_browser_client.h"
@@ -516,17 +517,56 @@ void Navigator::DidNavigate(
// Store this information before DidNavigateFrame() potentially swaps RFHs.
url::Origin old_frame_origin = old_frame_host->GetLastCommittedOrigin();
+ // RenderFrameHostImpl::DidNavigate will update the url, and may cause the
+ // node to consider itself no longer on the initial empty document. Record
+ // whether we're leaving the initial empty document before that.
+ bool was_on_initial_empty_document =
+ frame_tree_node->is_on_initial_empty_document();
+
+ // Allow main frame paint holding in the following cases:
+ // - We don't have an animated transition. See crbug.com/360844863.
+ // - At least one of the following conditions is true:
+ // - This is a navigation from the initial document. This part helps with
+ // tests. See crbug.com/367623929.
+ // - This is a same origin navigation (or we're not limiting cross-origin
+ // paint holding)
+ // - There is a user activation. This means that the user interacted with
+ // the page. Commonly used attacks are done without user activation --
+ // which will not enable paint holding. However, if the user interacts
+ // with the page, we treat it as a valid case for paint holding.
+ // - The client allows non-activated cross origin paintholding, which is
+ // currently the case with webview.
+ //
+ // See https://issues.chromium.org/40942531 for reasons we limit paint
+ // holding.
+ ContentBrowserClient* client = GetContentClient()->browser();
+ const bool allow_main_frame_paint_holding =
+ (was_on_initial_empty_document ||
+ old_frame_origin.IsSameOriginWith(params.origin) ||
+ old_frame_host->HasStickyUserActivation() ||
+ client->AllowNonActivatedCrossOriginPaintHolding() ||
+ !base::FeatureList::IsEnabled(
+ kLimitCrossOriginNonActivatedPaintHolding));
+
+ // Only allow subframe paint holding for same origin.
+ const bool allow_subframe_paint_holding =
+ old_frame_origin.IsSameOriginWith(params.origin);
+
// DidNavigateFrame() must be called before replicating the new origin and
// other properties to proxies. This is because it destroys the subframes of
// the frame we're navigating from, which might trigger those subframes to
// run unload handlers. Those unload handlers should still see the old
// frame's origin. See https://crbug.com/825283.
+ const bool allow_paint_holding = frame_tree_node->IsMainFrame()
+ ? allow_main_frame_paint_holding
+ : allow_subframe_paint_holding;
+
frame_tree_node->render_manager()->DidNavigateFrame(
render_frame_host, navigation_request->common_params().has_user_gesture,
was_within_same_document,
navigation_request->browsing_context_group_swap()
.ShouldClearProxiesOnCommit(),
- navigation_request->commit_params().frame_policy);
+ navigation_request->commit_params().frame_policy, allow_paint_holding);
// The main frame, same site, and cross-site navigation checks for user
// activation mirror the checks in DocumentLoader::CommitNavigation() (note:
@@ -593,12 +633,6 @@ void Navigator::DidNavigate(
render_frame_host->GetPage().SetContentsMimeType(params.contents_mime_type);
}
- // RenderFrameHostImpl::DidNavigate will update the url, and may cause the
- // node to consider itself no longer on the initial empty document. Record
- // whether we're leaving the initial empty document before that.
- bool was_on_initial_empty_document =
- frame_tree_node->is_on_initial_empty_document();
-
render_frame_host->DidNavigate(params, navigation_request.get(),
was_within_same_document);
diff --git a/chromium/content/browser/renderer_host/render_frame_host_impl.cc b/chromium/content/browser/renderer_host/render_frame_host_impl.cc
index d1d0efb398b..a45f586a3c4 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_frame_host_impl.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/render_frame_host_impl.cc
@@ -8546,7 +8546,8 @@ void RenderFrameHostImpl::AdoptPortal(
->render_manager()
->GetRenderWidgetHostView()
->GetFrameSinkId();
- proxy_host->GetAssociatedRemoteFrame()->SetFrameSinkId(frame_sink_id);
+ // generally disallow paint holding for security reasons
+ proxy_host->GetAssociatedRemoteFrame()->SetFrameSinkId(frame_sink_id, /*allow_paint_holding*/ false);
std::move(callback).Run(
proxy_host->frame_tree_node()->current_replication_state().Clone(),
diff --git a/chromium/content/browser/renderer_host/render_frame_host_manager.cc b/chromium/content/browser/renderer_host/render_frame_host_manager.cc
index 9f5cddd99a0..91114140ea4 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_frame_host_manager.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/render_frame_host_manager.cc
@@ -731,10 +731,11 @@ void RenderFrameHostManager::DidNavigateFrame(
bool was_caused_by_user_gesture,
bool is_same_document_navigation,
bool clear_proxies_on_commit,
- const blink::FramePolicy& frame_policy) {
+ const blink::FramePolicy& frame_policy,
+ bool allow_paint_holding) {
CommitPendingIfNecessary(render_frame_host, was_caused_by_user_gesture,
- is_same_document_navigation,
- clear_proxies_on_commit);
+ is_same_document_navigation, clear_proxies_on_commit,
+ allow_paint_holding);
// Make sure any dynamic changes to this frame's sandbox flags and permissions
// policy that were made prior to navigation take effect. This should only
@@ -770,7 +771,8 @@ void RenderFrameHostManager::CommitPendingIfNecessary(
RenderFrameHostImpl* render_frame_host,
bool was_caused_by_user_gesture,
bool is_same_document_navigation,
- bool clear_proxies_on_commit) {
+ bool clear_proxies_on_commit,
+ bool allow_paint_holding) {
if (!speculative_render_frame_host_) {
// There's no speculative RenderFrameHost so it must be that the current
// RenderFrameHost completed a navigation.
@@ -784,7 +786,8 @@ void RenderFrameHostManager::CommitPendingIfNecessary(
if (render_frame_host == speculative_render_frame_host_.get()) {
// A cross-RenderFrameHost navigation completed, so show the new renderer.
CommitPending(std::move(speculative_render_frame_host_),
- std::move(stored_page_to_restore_), clear_proxies_on_commit);
+ std::move(stored_page_to_restore_), clear_proxies_on_commit,
+ allow_paint_holding);
if (GetNavigationQueueingFeatureLevel() >=
NavigationQueueingFeatureLevel::kAvoidRedundantCancellations) {
@@ -841,9 +844,26 @@ void RenderFrameHostManager::CommitPendingIfNecessary(
// output on prerender activation.
if (render_frame_host_->lifecycle_state() !=
LifecycleStateImpl::kPrerendering) {
- static_cast<RenderWidgetHostImpl*>(
- render_frame_host_->GetView()->GetRenderWidgetHost())
- ->StartNewContentRenderingTimeout();
+ auto* rwhi = static_cast<RenderWidgetHostImpl*>(
+ render_frame_host_->GetView()->GetRenderWidgetHost());
+
+ rwhi->StartNewContentRenderingTimeout();
+ // Force the timer to expire immediately if we don't allow main frame
+ // paint holding.
+ if (frame_tree_node_->IsMainFrame() && !allow_paint_holding) {
+ // We post task here, since this evicts a surface but the embedding of a
+ // new surface would be done in the same stack as this call. The
+ // ordering of whether the new surface has or has not yet been embedded
+ // differs for different platforms, and we always want the new surface
+ // to be embedded before we evict. Hence, we post a task. In practice
+ // this still disables paint holding unless this task is delayed for a
+ // long time.
+ GetUIThreadTaskRunner({})->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &RenderWidgetHostImpl::ForceFirstFrameAfterNavigationTimeout,
+ rwhi->GetWeakPtr()));
+ }
}
}
@@ -1467,7 +1487,8 @@ void RenderFrameHostManager::PerformEarlyRenderFrameHostSwapIfNeeded(
CommitPending(
std::move(speculative_render_frame_host_), nullptr,
- request->browsing_context_group_swap().ShouldClearProxiesOnCommit());
+ request->browsing_context_group_swap().ShouldClearProxiesOnCommit(),
+ /* allow_paint_holding */ false);
request->SetAssociatedRFHType(
NavigationRequest::AssociatedRenderFrameHostType::CURRENT);
@@ -4028,7 +4049,8 @@ void RenderFrameHostManager::SetRWHViewForInnerFrameTree(
RenderWidgetHostViewChildFrame* child_rwhv) {
DCHECK(IsMainFrameForInnerDelegate());
DCHECK(GetProxyToOuterDelegate());
- GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv, nullptr);
+ GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv, nullptr,
+ /*allow_paint_holding=*/false);
}
bool RenderFrameHostManager::InitRenderView(
@@ -4340,7 +4362,8 @@ RenderFrameHostManager::GetFrameTokenForSiteInstanceGroup(
void RenderFrameHostManager::CommitPending(
std::unique_ptr<RenderFrameHostImpl> pending_rfh,
std::unique_ptr<StoredPage> pending_stored_page,
- bool clear_proxies_on_commit) {
+ bool clear_proxies_on_commit,
+ bool allow_paint_holding) {
TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending",
"FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
CHECK(pending_rfh);
@@ -4593,9 +4616,10 @@ void RenderFrameHostManager::CommitPending(
// valid surface id, because it already has that surface embedded through
// `RenderFrameHostImpl::WillLeaveBackForwardCache` and the timeout that
// would be set here will clear that frame (incorrectly).
- if (is_main_frame && old_view && old_view != new_view) {
- // We should take the fallback if we're not coming from BFCache or if we
- // don't have a valid surface id to display.
+ if (is_main_frame && allow_paint_holding && old_view && old_view != new_view) {
+ // If allowed, we should take the fallback in any of the following cases:
+ // - We're not coming from BFCache
+ // - We don't have a valid surface id to display.
auto* render_widget_host_view_base =
static_cast<RenderWidgetHostViewBase*>(render_frame_host_->GetView());
should_take_fallback_content =
@@ -4730,7 +4754,7 @@ void RenderFrameHostManager::CommitPending(
if (proxy_to_parent_or_outer_delegate) {
proxy_to_parent_or_outer_delegate->SetChildRWHView(
static_cast<RenderWidgetHostViewChildFrame*>(new_view),
- old_size ? &*old_size : nullptr);
+ old_size ? &*old_size : nullptr, allow_paint_holding);
}
if (render_frame_host_->is_local_root()) {
@@ -5136,8 +5160,10 @@ void RenderFrameHostManager::CreateNewFrameForInnerDelegateAttachIfNecessary() {
// Swap in the speculative frame. It will later be replaced when
// WebContents::AttachToOuterWebContentsFrame is called.
speculative_render_frame_host_->SwapIn();
+
CommitPending(std::move(speculative_render_frame_host_), nullptr,
- false /* clear_proxies_on_commit */);
+ false /* clear_proxies_on_commit */,
+ /* allow_paint_holding */ false);
NotifyPrepareForInnerDelegateAttachComplete(true /* success */);
}
diff --git a/chromium/content/browser/renderer_host/render_frame_host_manager.h b/chromium/content/browser/renderer_host/render_frame_host_manager.h
index 9257b8c5f93..46acf6a9380 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_frame_host_manager.h
+++ src/3rdparty/chromium/content/browser/renderer_host/render_frame_host_manager.h
@@ -322,7 +322,8 @@ class CONTENT_EXPORT RenderFrameHostManager {
bool was_caused_by_user_gesture,
bool is_same_document_navigation,
bool clear_proxies_on_commit,
- const blink::FramePolicy& frame_policy);
+ const blink::FramePolicy& frame_policy,
+ bool allow_paint_holding);
// Called when this frame's opener is changed to the frame specified by
// |opener_frame_token| in |source_site_instance_group|'s process. This
@@ -971,15 +972,18 @@ class CONTENT_EXPORT RenderFrameHostManager {
// |clear_proxies_on_commit| Indicates if the proxies and opener must be
// removed during the commit. This can happen following some BrowsingInstance
// swaps, such as those for COOP.
+ // |allow_paint_holding| Indicates whether paint holding is allowed.
void CommitPending(std::unique_ptr<RenderFrameHostImpl> pending_rfh,
std::unique_ptr<StoredPage> pending_stored_page,
- bool clear_proxies_on_commit);
+ bool clear_proxies_on_commit,
+ bool allow_paint_holding);
// Helper to call CommitPending() in all necessary cases.
void CommitPendingIfNecessary(RenderFrameHostImpl* render_frame_host,
bool was_caused_by_user_gesture,
bool is_same_document_navigation,
- bool clear_proxies_on_commit);
+ bool clear_proxies_on_commit,
+ bool allow_paint_holding);
// Runs the unload handler in the old RenderFrameHost, after the new
// RenderFrameHost has committed. |old_render_frame_host| will either be
diff --git a/chromium/content/browser/renderer_host/render_frame_proxy_host.cc b/chromium/content/browser/renderer_host/render_frame_proxy_host.cc
index 2ac59af2958..6ac750e7155 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_frame_proxy_host.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -192,10 +192,10 @@ RenderFrameProxyHost::~RenderFrameProxyHost() {
TRACE_EVENT_END("navigation", perfetto::Track::FromPointer(this));
}
-void RenderFrameProxyHost::SetChildRWHView(
- RenderWidgetHostViewChildFrame* view,
- const gfx::Size* initial_frame_size) {
- cross_process_frame_connector_->SetView(view);
+void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostViewChildFrame* view,
+ const gfx::Size* initial_frame_size,
+ bool allow_paint_holding) {
+ cross_process_frame_connector_->SetView(view, allow_paint_holding);
if (initial_frame_size)
cross_process_frame_connector_->SetLocalFrameSize(*initial_frame_size);
}
diff --git a/chromium/content/browser/renderer_host/render_frame_proxy_host.h b/chromium/content/browser/renderer_host/render_frame_proxy_host.h
index 08c1d72af90..c63589a7c31 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_frame_proxy_host.h
+++ src/3rdparty/chromium/content/browser/renderer_host/render_frame_proxy_host.h
@@ -164,7 +164,8 @@ class CONTENT_EXPORT RenderFrameProxyHost
// receives its size from the parent via FrameHostMsg_UpdateResizeParams
// before it begins parsing the content.
void SetChildRWHView(RenderWidgetHostViewChildFrame* view,
- const gfx::Size* initial_frame_size);
+ const gfx::Size* initial_frame_size,
+ bool allow_paint_holding);
RenderViewHostImpl* GetRenderViewHost();
diff --git a/chromium/content/browser/renderer_host/render_widget_host_impl.cc b/chromium/content/browser/renderer_host/render_widget_host_impl.cc
index f27648e12c1..a337dd6a96b 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_widget_host_impl.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/render_widget_host_impl.cc
@@ -117,6 +117,7 @@
#include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
+#include "third_party/blink/public/common/widget/constants.h"
#include "third_party/blink/public/common/widget/visual_properties.h"
#include "third_party/blink/public/mojom/drag/drag.mojom.h"
#include "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom.h"
@@ -165,10 +166,6 @@ using blink::WebMouseWheelEvent;
namespace content {
namespace {
-// How long to wait for newly loaded content to send a compositor frame
-// before clearing previously displayed graphics.
-constexpr base::TimeDelta kNewContentRenderingDelay = base::Seconds(4);
-
constexpr gfx::Rect kInvalidScreenRect(std::numeric_limits<int>::max(),
std::numeric_limits<int>::max(),
0,
@@ -438,7 +435,7 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(
switches::kDisableHangMonitor)),
latency_tracker_(delegate_),
hung_renderer_delay_(kHungRendererDelay),
- new_content_rendering_delay_(kNewContentRenderingDelay),
+ new_content_rendering_delay_(blink::kNewContentRenderingDelay),
frame_token_message_queue_(std::move(frame_token_message_queue)),
render_frame_metadata_provider_(
#if BUILDFLAG(IS_MAC)
diff --git a/chromium/content/browser/renderer_host/render_widget_host_view_child_frame.cc b/chromium/content/browser/renderer_host/render_widget_host_view_child_frame.cc
index b190c86708d..632973c779e 100644
--- src/3rdparty/chromium/content/browser/renderer_host/render_widget_host_view_child_frame.cc
+++ src/3rdparty/chromium/content/browser/renderer_host/render_widget_host_view_child_frame.cc
@@ -406,7 +406,7 @@ void RenderWidgetHostViewChildFrame::Destroy() {
// have already been cleared when RenderWidgetHostViewBase notified its
// observers of our impending destruction.
if (frame_connector_) {
- frame_connector_->SetView(nullptr);
+ frame_connector_->SetView(nullptr, /*allow_paint_holding=*/false);
SetFrameConnector(nullptr);
}
diff --git a/chromium/content/common/features.cc b/chromium/content/common/features.cc
index 52443a0118c..e80454c2edd 100644
--- src/3rdparty/chromium/content/common/features.cc
+++ src/3rdparty/chromium/content/common/features.cc
@@ -59,6 +59,11 @@ BASE_FEATURE(kWindowOpenFileSelectFix,
"WindowOpenFileSelectFix",
base::FEATURE_ENABLED_BY_DEFAULT);
+// Flag guard for fix for crbug.com/40942531.
+BASE_FEATURE(kLimitCrossOriginNonActivatedPaintHolding,
+ "LimitCrossOriginNonActivatedPaintHolding",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
// Please keep features in alphabetical order.
} // namespace content
diff --git a/chromium/content/common/features.h b/chromium/content/common/features.h
index 5b5feb19663..92d7b515f86 100644
--- src/3rdparty/chromium/content/common/features.h
+++ src/3rdparty/chromium/content/common/features.h
@@ -72,6 +72,8 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kSpeculativeServiceWorkerStartup);
// Flag guard for fix for crbug.com/1414936.
CONTENT_EXPORT BASE_DECLARE_FEATURE(kWindowOpenFileSelectFix);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kLimitCrossOriginNonActivatedPaintHolding);
+
// Please keep features in alphabetical order.
} // namespace content
diff --git a/chromium/content/public/browser/content_browser_client.cc b/chromium/content/public/browser/content_browser_client.cc
index f30e5094533..59d3cc16e25 100644
--- src/3rdparty/chromium/content/public/browser/content_browser_client.cc
+++ src/3rdparty/chromium/content/public/browser/content_browser_client.cc
@@ -1593,4 +1593,8 @@ bool ContentBrowserClient::
return true;
}
+bool ContentBrowserClient::AllowNonActivatedCrossOriginPaintHolding() {
+ return false;
+}
+
} // namespace content
diff --git a/chromium/content/public/browser/content_browser_client.h b/chromium/content/public/browser/content_browser_client.h
index 3ae26ba017f..ded95892ab6 100644
--- src/3rdparty/chromium/content/public/browser/content_browser_client.h
+++ src/3rdparty/chromium/content/public/browser/content_browser_client.h
@@ -2619,6 +2619,10 @@ class CONTENT_EXPORT ContentBrowserClient {
// "Cache-control: no-store" header in BFCache.
virtual bool ShouldAllowBackForwardCacheForCacheControlNoStorePage(
content::BrowserContext* browser_context);
+
+ // Indicates whether this client allows paint holding in cross-origin
+ // navigations even if there was no user activation.
+ virtual bool AllowNonActivatedCrossOriginPaintHolding();
};
} // namespace content
diff --git a/chromium/content/renderer/media/media_factory.cc b/chromium/content/renderer/media/media_factory.cc
index a6859aa3532..3316f1aaedc 100644
--- src/3rdparty/chromium/content/renderer/media/media_factory.cc
+++ src/3rdparty/chromium/content/renderer/media/media_factory.cc
@@ -690,7 +690,7 @@ MediaFactory::CreateRendererFactorySelector(
media::ObserveOverlayStateCB observe_overlay_state_cb =
base::BindRepeating(&OverlayStateObserverImpl::Create,
- render_thread->GetOverlayStateServiceProvider());
+ base::RetainedRef(render_thread->GetOverlayStateServiceProvider()));
factory_selector->AddFactory(
RendererType::kMediaFoundation,
diff --git a/chromium/content/renderer/media/win/overlay_state_observer_impl.cc b/chromium/content/renderer/media/win/overlay_state_observer_impl.cc
index 7cb6729a1e2..1de0ddc46ab 100644
--- src/3rdparty/chromium/content/renderer/media/win/overlay_state_observer_impl.cc
+++ src/3rdparty/chromium/content/renderer/media/win/overlay_state_observer_impl.cc
@@ -16,7 +16,7 @@ OverlayStateObserverImpl::Create(
StateChangedCB state_changed_cb) {
if (overlay_state_service_provider) {
return base::WrapUnique(new OverlayStateObserverImpl(
- overlay_state_service_provider, mailbox, state_changed_cb));
+ overlay_state_service_provider, mailbox, std::move(state_changed_cb)));
}
return nullptr;
}
diff --git a/chromium/content/renderer/media/win/overlay_state_service_provider.h b/chromium/content/renderer/media/win/overlay_state_service_provider.h
index a1b97b4429f..491a44ba2ea 100644
--- src/3rdparty/chromium/content/renderer/media/win/overlay_state_service_provider.h
+++ src/3rdparty/chromium/content/renderer/media/win/overlay_state_service_provider.h
@@ -15,11 +15,19 @@ class GpuChannelHost;
namespace content {
-class OverlayStateServiceProvider {
+class OverlayStateServiceProvider
+ : public base::RefCountedThreadSafe<OverlayStateServiceProvider> {
public:
virtual bool RegisterObserver(
mojo::PendingRemote<gpu::mojom::OverlayStateObserver> pending_remote,
const gpu::Mailbox& mailbox) = 0;
+
+ protected:
+ friend class base::RefCountedThreadSafe<OverlayStateServiceProvider>;
+ OverlayStateServiceProvider() = default;
+ OverlayStateServiceProvider(const OverlayStateServiceProvider&) = delete;
+ OverlayStateServiceProvider& operator=(const OverlayStateServiceProvider&) =
+ delete;
virtual ~OverlayStateServiceProvider() = default;
};
@@ -29,7 +37,6 @@ class OverlayStateServiceProviderImpl : public OverlayStateServiceProvider {
public:
explicit OverlayStateServiceProviderImpl(
scoped_refptr<gpu::GpuChannelHost> channel);
- ~OverlayStateServiceProviderImpl() override;
bool RegisterObserver(
mojo::PendingRemote<gpu::mojom::OverlayStateObserver> pending_remote,
@@ -43,6 +50,7 @@ class OverlayStateServiceProviderImpl : public OverlayStateServiceProvider {
delete;
OverlayStateServiceProviderImpl& operator=(
const OverlayStateServiceProviderImpl&) = delete;
+ ~OverlayStateServiceProviderImpl() override;
scoped_refptr<gpu::GpuChannelHost> channel_;
};
diff --git a/chromium/content/renderer/render_thread_impl.cc b/chromium/content/renderer/render_thread_impl.cc
index 328ed025f6b..f44428ecb13 100644
--- src/3rdparty/chromium/content/renderer/render_thread_impl.cc
+++ src/3rdparty/chromium/content/renderer/render_thread_impl.cc
@@ -1268,7 +1268,7 @@ scoped_refptr<DCOMPTextureFactory> RenderThreadImpl::GetDCOMPTextureFactory() {
return dcomp_texture_factory_;
}
-OverlayStateServiceProvider*
+scoped_refptr<OverlayStateServiceProvider>
RenderThreadImpl::GetOverlayStateServiceProvider() {
DCHECK(IsMainThread());
// Only set 'overlay_state_service_provider_' if Media Foundation for clear
@@ -1282,11 +1282,12 @@ RenderThreadImpl::GetOverlayStateServiceProvider() {
return nullptr;
}
overlay_state_service_provider_ =
- std::make_unique<OverlayStateServiceProviderImpl>(std::move(channel));
+ base::MakeRefCounted<OverlayStateServiceProviderImpl>(
+ std::move(channel));
}
}
- return overlay_state_service_provider_.get();
+ return overlay_state_service_provider_;
}
#endif // BUILDFLAG(IS_WIN)
diff --git a/chromium/content/renderer/render_thread_impl.h b/chromium/content/renderer/render_thread_impl.h
index 0d91d61008a..1e3a986f9e7 100644
--- src/3rdparty/chromium/content/renderer/render_thread_impl.h
+++ src/3rdparty/chromium/content/renderer/render_thread_impl.h
@@ -265,7 +265,7 @@ class CONTENT_EXPORT RenderThreadImpl
// The OverlayStateService is only available where Media Foundation for
// clear is supported, otherwise GetOverlayStateServiceProvider will return
// nullptr.
- OverlayStateServiceProvider* GetOverlayStateServiceProvider();
+ scoped_refptr<OverlayStateServiceProvider> GetOverlayStateServiceProvider();
#endif
blink::WebVideoCaptureImplManager* video_capture_impl_manager() const {
@@ -530,7 +530,7 @@ class CONTENT_EXPORT RenderThreadImpl
#if BUILDFLAG(IS_WIN)
scoped_refptr<DCOMPTextureFactory> dcomp_texture_factory_;
- std::unique_ptr<OverlayStateServiceProviderImpl>
+ scoped_refptr<OverlayStateServiceProviderImpl>
overlay_state_service_provider_;
#endif
diff --git a/chromium/gpu/config/software_rendering_list.json b/chromium/gpu/config/software_rendering_list.json
index a2f6aa5f2cf..0878fb2599e 100644
--- src/3rdparty/chromium/gpu/config/software_rendering_list.json
+++ src/3rdparty/chromium/gpu/config/software_rendering_list.json
@@ -1396,23 +1396,6 @@
"accelerated_webgl2"
]
},
- {
- "id": 158,
- "description": "Canvas rendering issues with Intel drivers on Windows since 94-based: https://bugreports.qt.io/browse/QTBUG-104065",
- "cr_bugs": [1316442],
- "os": {
- "type": "win"
- },
- "exceptions": [
- {
- "gl_renderer": "ANGLE.*"
- }
- ],
- "vendor_id": "0x8086",
- "features": [
- "accelerated_2d_canvas"
- ]
- },
{
"id": 159,
"cr_bugs": [902247],
diff --git a/chromium/third_party/blink/common/widget/constants.cc b/chromium/third_party/blink/common/widget/constants.cc
index 212050c1221..2b27ca8d7e9 100644
--- src/3rdparty/chromium/third_party/blink/common/widget/constants.cc
+++ src/3rdparty/chromium/third_party/blink/common/widget/constants.cc
@@ -8,4 +8,6 @@ namespace blink {
const int kMinimumWindowSize = 100;
+const base::TimeDelta kNewContentRenderingDelay = base::Seconds(4);
+
} // namespace blink
diff --git a/chromium/third_party/blink/public/common/widget/constants.h b/chromium/third_party/blink/public/common/widget/constants.h
index 95749573237..69aedfbc137 100644
--- src/3rdparty/chromium/third_party/blink/public/common/widget/constants.h
+++ src/3rdparty/chromium/third_party/blink/public/common/widget/constants.h
@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_WIDGET_CONSTANTS_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_WIDGET_CONSTANTS_H_
+#include "base/time/time.h"
#include "third_party/blink/public/common/common_export.h"
namespace blink {
@@ -13,6 +14,9 @@ namespace blink {
// window object
BLINK_COMMON_EXPORT extern const int kMinimumWindowSize;
+// The timeout for clearing old paint for a cross-document navigation.
+BLINK_COMMON_EXPORT extern const base::TimeDelta kNewContentRenderingDelay;
+
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_WIDGET_CONSTANTS_H_
diff --git a/chromium/third_party/blink/public/mojom/frame/remote_frame.mojom b/chromium/third_party/blink/public/mojom/frame/remote_frame.mojom
index 4d891d46b67..e3c22c2059b 100644
--- src/3rdparty/chromium/third_party/blink/public/mojom/frame/remote_frame.mojom
+++ src/3rdparty/chromium/third_party/blink/public/mojom/frame/remote_frame.mojom
@@ -404,7 +404,11 @@ interface RemoteFrame {
// Notifies this remote frame that its associated compositing
// destination (RenderWidgetHostView) has changed.
- SetFrameSinkId(viz.mojom.FrameSinkId frame_sink_id);
+ //
+ // The embedder can keep using the painted content from the previous frame
+ // sink until the new frame sink produces a new frame, i.e., paint holding.
+ // `allow_paint_holding` is used to limit this to same-origin navigations.
+ SetFrameSinkId(viz.mojom.FrameSinkId frame_sink_id, bool allow_paint_holding);
// Notifies the remote frame that the process rendering the child frame's
// contents has terminated.
diff --git a/chromium/third_party/blink/renderer/core/dom/element_rare_data_vector.cc b/chromium/third_party/blink/renderer/core/dom/element_rare_data_vector.cc
index 5680187326b..66abc46ca6a 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/dom/element_rare_data_vector.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/dom/element_rare_data_vector.cc
@@ -45,12 +45,21 @@ ElementRareDataVector::~ElementRareDataVector() {
unsigned ElementRareDataVector::GetFieldIndex(FieldId field_id) const {
unsigned field_id_int = static_cast<unsigned>(field_id);
DCHECK(fields_bitfield_ & (static_cast<BitfieldType>(1) << field_id_int));
-#ifdef _MSC_VER
- return __popcnt(fields_bitfield_ &
- ~(~static_cast<BitfieldType>(0) << field_id_int));
-#else
+#if defined(__GNUC__) || defined(__clang__)
return __builtin_popcount(fields_bitfield_ &
~(~static_cast<BitfieldType>(0) << field_id_int));
+#elif _MSVC_LANG >= 202002L // C++20
+ return std::popcount(fields_bitfield_ &
+ ~(~static_cast<BitfieldType>(0) << field_id_int));
+#else
+ uint32_t v = (fields_bitfield_ &
+ ~(~static_cast<BitfieldType>(0) << field_id_int));
+ uint32_t c = v - ((v >> 1) & 0x55555555);
+ c = ((c >> 2) & 0x33333333) + (c & 0x33333333);
+ c = ((c >> 4) + c) & 0x0F0F0F0F;
+ c = ((c >> 8) + c) & 0x00FF00FF;
+ c = ((c >> 16) + c) & 0x0000FFFF;
+ return c;
#endif
}
diff --git a/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc b/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc
index 632bc8d5aa3..d5afeae18a8 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc
@@ -12,7 +12,10 @@
#include "cc/paint/paint_image.h"
#include "cc/paint/paint_image_builder.h"
#include "skia/ext/image_operations.h"
+#include "third_party/blink/public/common/widget/constants.h"
#include "third_party/blink/renderer/core/frame/child_frame_compositor.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkImage.h"
#include "ui/gfx/geometry/point_f.h"
@@ -46,11 +49,14 @@ void ChildFrameCompositingHelper::ChildFrameGone(float device_scale_factor) {
void ChildFrameCompositingHelper::SetSurfaceId(
const viz::SurfaceId& surface_id,
- bool capture_sequence_number_changed) {
+ CaptureSequenceNumberChanged capture_sequence_number_changed,
+ AllowPaintHolding allow_paint_holding) {
if (surface_id_ == surface_id)
return;
+ const auto current_surface_id = surface_id_;
surface_id_ = surface_id;
+ paint_holding_timer_.Stop();
surface_layer_ = cc::SurfaceLayer::Create();
surface_layer_->SetMasksToBounds(true);
@@ -59,10 +65,12 @@ void ChildFrameCompositingHelper::SetSurfaceId(
// If we're synchronizing surfaces, then use an infinite deadline to ensure
// everything is synchronized.
- cc::DeadlinePolicy deadline = capture_sequence_number_changed
- ? cc::DeadlinePolicy::UseInfiniteDeadline()
- : cc::DeadlinePolicy::UseDefaultDeadline();
+ cc::DeadlinePolicy deadline =
+ capture_sequence_number_changed == CaptureSequenceNumberChanged::kYes
+ ? cc::DeadlinePolicy::UseInfiniteDeadline()
+ : cc::DeadlinePolicy::UseDefaultDeadline();
surface_layer_->SetSurfaceId(surface_id, deadline);
+ MaybeSetUpPaintHolding(current_surface_id, allow_paint_holding);
// TODO(lfg): Investigate if it's possible to propagate the information
// about the child surface's opacity. https://crbug.com/629851.
@@ -72,6 +80,33 @@ void ChildFrameCompositingHelper::SetSurfaceId(
UpdateVisibility(true);
}
+void ChildFrameCompositingHelper::MaybeSetUpPaintHolding(
+ const viz::SurfaceId& fallback_id,
+ AllowPaintHolding allow_paint_holding) {
+ if (!RuntimeEnabledFeatures::PaintHoldingForIframesEnabled()) {
+ return;
+ }
+
+ if (fallback_id.is_valid() &&
+ allow_paint_holding == AllowPaintHolding::kYes) {
+ surface_layer_->SetOldestAcceptableFallback(fallback_id);
+
+ paint_holding_timer_.Start(
+ FROM_HERE, kNewContentRenderingDelay,
+ WTF::BindOnce(&ChildFrameCompositingHelper::PaintHoldingTimerFired,
+ base::Unretained(this)));
+ } else {
+ surface_layer_->SetOldestAcceptableFallback(viz::SurfaceId());
+ }
+}
+
+void ChildFrameCompositingHelper::PaintHoldingTimerFired() {
+ CHECK(RuntimeEnabledFeatures::PaintHoldingForIframesEnabled());
+ if (surface_layer_) {
+ surface_layer_->SetOldestAcceptableFallback(viz::SurfaceId());
+ }
+}
+
void ChildFrameCompositingHelper::UpdateVisibility(bool visible) {
const scoped_refptr<cc::Layer>& layer = child_frame_compositor_->GetCcLayer();
if (layer) {
diff --git a/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.h b/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.h
index 2717a66a18d..4f870564916 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.h
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper.h
@@ -7,6 +7,7 @@
#include <stdint.h>
+#include "base/timer/timer.h"
#include "cc/layers/content_layer_client.h"
#include "cc/layers/surface_layer.h"
#include "components/viz/common/surfaces/surface_id.h"
@@ -29,8 +30,12 @@ class CORE_EXPORT ChildFrameCompositingHelper : public cc::ContentLayerClient {
delete;
~ChildFrameCompositingHelper() override;
- void SetSurfaceId(const viz::SurfaceId& surface_id,
- bool capture_sequence_number_changed);
+ enum class CaptureSequenceNumberChanged { kYes, kNo };
+ enum class AllowPaintHolding { kYes, kNo };
+ void SetSurfaceId(
+ const viz::SurfaceId& surface_id,
+ CaptureSequenceNumberChanged capture_sequence_number_changed,
+ AllowPaintHolding allow_paint_holding);
void UpdateVisibility(bool visible);
void ChildFrameGone(float device_scale_factor);
@@ -43,10 +48,15 @@ class CORE_EXPORT ChildFrameCompositingHelper : public cc::ContentLayerClient {
scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList() override;
bool FillsBoundsCompletely() const override;
+ void MaybeSetUpPaintHolding(const viz::SurfaceId& fallback_id,
+ AllowPaintHolding allow_paint_holding);
+ void PaintHoldingTimerFired();
+
ChildFrameCompositor* const child_frame_compositor_;
viz::SurfaceId surface_id_;
scoped_refptr<cc::SurfaceLayer> surface_layer_;
scoped_refptr<cc::PictureLayer> crash_ui_layer_;
+ base::OneShotTimer paint_holding_timer_;
float device_scale_factor_ = 1.f;
};
diff --git a/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper_test.cc b/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper_test.cc
index 47d094c4e8d..cb961013332 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper_test.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/child_frame_compositing_helper_test.cc
@@ -4,6 +4,7 @@
#include "third_party/blink/renderer/core/frame/child_frame_compositing_helper.h"
+#include "base/test/task_environment.h"
#include "cc/layers/layer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/frame/child_frame_compositor.h"
@@ -61,6 +62,9 @@ class ChildFrameCompositingHelperTest : public testing::Test {
ChildFrameCompositingHelper* compositing_helper() {
return &compositing_helper_;
}
+ const cc::SurfaceLayer& GetSurfaceLayer() {
+ return *static_cast<cc::SurfaceLayer*>(compositor_.GetCcLayer().get());
+ }
private:
MockChildFrameCompositor compositor_;
@@ -74,7 +78,10 @@ TEST_F(ChildFrameCompositingHelperTest, ChildFrameGoneClearsFallback) {
EXPECT_FALSE(compositing_helper()->surface_id().is_valid());
const viz::SurfaceId surface_id = MakeSurfaceId(viz::FrameSinkId(1, 1), 1);
- compositing_helper()->SetSurfaceId(surface_id, false);
+ compositing_helper()->SetSurfaceId(
+ surface_id,
+ ChildFrameCompositingHelper::CaptureSequenceNumberChanged::kNo,
+ ChildFrameCompositingHelper::AllowPaintHolding::kNo);
EXPECT_EQ(surface_id, compositing_helper()->surface_id());
// Reporting that the child frame is gone should clear the surface id.
@@ -82,4 +89,33 @@ TEST_F(ChildFrameCompositingHelperTest, ChildFrameGoneClearsFallback) {
EXPECT_FALSE(compositing_helper()->surface_id().is_valid());
}
+TEST_F(ChildFrameCompositingHelperTest, PaintHoldingTimeout) {
+ base::test::SingleThreadTaskEnvironment task_environment{
+ base::test::TaskEnvironment::MainThreadType::UI,
+ base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+ EXPECT_FALSE(compositing_helper()->surface_id().is_valid());
+
+ const viz::SurfaceId surface_id = MakeSurfaceId(viz::FrameSinkId(1, 1), 1);
+ compositing_helper()->SetSurfaceId(
+ surface_id,
+ ChildFrameCompositingHelper::CaptureSequenceNumberChanged::kNo,
+ ChildFrameCompositingHelper::AllowPaintHolding::kNo);
+ EXPECT_EQ(surface_id, GetSurfaceLayer().surface_id());
+ EXPECT_FALSE(GetSurfaceLayer().oldest_acceptable_fallback());
+
+ const viz::SurfaceId new_surface_id =
+ MakeSurfaceId(viz::FrameSinkId(1, 1), 2);
+ compositing_helper()->SetSurfaceId(
+ new_surface_id,
+ ChildFrameCompositingHelper::CaptureSequenceNumberChanged::kNo,
+ ChildFrameCompositingHelper::AllowPaintHolding::kYes);
+ EXPECT_EQ(new_surface_id, GetSurfaceLayer().surface_id());
+ ASSERT_TRUE(GetSurfaceLayer().oldest_acceptable_fallback());
+ EXPECT_EQ(surface_id, GetSurfaceLayer().oldest_acceptable_fallback().value());
+
+ task_environment.FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(new_surface_id, GetSurfaceLayer().surface_id());
+ EXPECT_FALSE(GetSurfaceLayer().oldest_acceptable_fallback());
+}
+
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/frame/location_report_body.cc b/chromium/third_party/blink/renderer/core/frame/location_report_body.cc
index ccd47126403..6aa5c56f92b 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/location_report_body.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/location_report_body.cc
@@ -3,7 +3,10 @@
// found in the LICENSE file.
#include "third_party/blink/renderer/core/frame/location_report_body.h"
+
+#include "third_party/blink/public/common/scheme_registry.h"
#include "third_party/blink/renderer/bindings/core/v8/capture_source_location.h"
+#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/hash_functions.h"
namespace blink {
@@ -49,4 +52,16 @@ unsigned LocationReportBody::MatchId() const {
return hash;
}
+bool LocationReportBody::IsExtensionSource() const {
+ // TODO(crbug.com/356098278): Either remove this KURL instantiation completely
+ // or store `source_file_` as a KURL and only convert to string when sending
+ // reports.
+ KURL source_file_url(source_file_);
+ if (!source_file_url.IsValid()) {
+ return false;
+ }
+ return CommonSchemeRegistry::IsExtensionScheme(
+ source_file_url.Protocol().Utf8());
+}
+
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/frame/location_report_body.h b/chromium/third_party/blink/renderer/core/frame/location_report_body.h
index dea5e9232f4..8dd27eed8f5 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/location_report_body.h
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/location_report_body.h
@@ -59,6 +59,8 @@ class CORE_EXPORT LocationReportBody : public ReportBody {
unsigned MatchId() const override;
+ bool IsExtensionSource() const override;
+
protected:
const String source_file_;
const absl::optional<uint32_t> line_number_;
diff --git a/chromium/third_party/blink/renderer/core/frame/location_report_body_test.cc b/chromium/third_party/blink/renderer/core/frame/location_report_body_test.cc
index 19eea3f8c71..c5ada318dbc 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/location_report_body_test.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/location_report_body_test.cc
@@ -8,6 +8,7 @@
#include <vector>
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/scheme_registry.h"
namespace blink {
namespace {
@@ -89,5 +90,24 @@ TEST(LocationReportBodyMatchIdTest,
}
}
+TEST(LocationReportBodyTest, ExtensionURLsAreIdentified) {
+ const char* kExtensionUrl =
+ "chrome-extension://abcdefghijklmnopabcdefghijklmnop/scripts/"
+ "script.js";
+ const char* kAboutBlankUrl = "about:blank";
+ const char* kHttpsUrl = "https://example.com/";
+
+ EXPECT_FALSE(TestLocationReportBody(kExtensionUrl, 1, 1).IsExtensionSource());
+ EXPECT_FALSE(
+ TestLocationReportBody(kAboutBlankUrl, 1, 1).IsExtensionSource());
+ EXPECT_FALSE(TestLocationReportBody(kHttpsUrl, 1, 1).IsExtensionSource());
+
+ CommonSchemeRegistry::RegisterURLSchemeAsExtension("chrome-extension");
+ EXPECT_TRUE(TestLocationReportBody(kExtensionUrl, 1, 1).IsExtensionSource());
+ EXPECT_FALSE(
+ TestLocationReportBody(kAboutBlankUrl, 1, 1).IsExtensionSource());
+ EXPECT_FALSE(TestLocationReportBody(kHttpsUrl, 1, 1).IsExtensionSource());
+}
+
} // namespace
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/frame/remote_frame.cc b/chromium/third_party/blink/renderer/core/frame/remote_frame.cc
index 7f3f457261d..3d744cda68d 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/remote_frame.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -28,7 +28,6 @@
#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
#include "third_party/blink/renderer/core/events/message_event.h"
#include "third_party/blink/renderer/core/exported/web_view_impl.h"
-#include "third_party/blink/renderer/core/frame/child_frame_compositing_helper.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
@@ -860,7 +859,8 @@ viz::FrameSinkId RemoteFrame::GetFrameSinkId() {
return frame_sink_id_;
}
-void RemoteFrame::SetFrameSinkId(const viz::FrameSinkId& frame_sink_id) {
+void RemoteFrame::SetFrameSinkId(const viz::FrameSinkId& frame_sink_id,
+ bool allow_paint_holding) {
remote_process_gone_ = false;
// The same ParentLocalSurfaceIdAllocator cannot provide LocalSurfaceIds for
@@ -873,7 +873,10 @@ void RemoteFrame::SetFrameSinkId(const viz::FrameSinkId& frame_sink_id) {
// Resend the FrameRects and allocate a new viz::LocalSurfaceId when the view
// changes.
- ResendVisualProperties();
+ ResendVisualPropertiesInternal(
+ allow_paint_holding
+ ? ChildFrameCompositingHelper::AllowPaintHolding::kYes
+ : ChildFrameCompositingHelper::AllowPaintHolding::kNo);
}
void RemoteFrame::ChildProcessGone() {
@@ -922,14 +925,18 @@ void RemoteFrame::ApplyReplicatedPermissionsPolicyHeader() {
permissions_policy_header_, container_policy, parent_permissions_policy);
}
-bool RemoteFrame::SynchronizeVisualProperties(bool propagate) {
+bool RemoteFrame::SynchronizeVisualProperties(
+ bool propagate,
+ ChildFrameCompositingHelper::AllowPaintHolding allow_paint_holding) {
if (!GetFrameSinkId().is_valid() || remote_process_gone_)
return false;
- bool capture_sequence_number_changed =
- sent_visual_properties_ &&
- sent_visual_properties_->capture_sequence_number !=
- pending_visual_properties_.capture_sequence_number;
+ auto capture_sequence_number_changed =
+ (sent_visual_properties_ &&
+ sent_visual_properties_->capture_sequence_number !=
+ pending_visual_properties_.capture_sequence_number)
+ ? ChildFrameCompositingHelper::CaptureSequenceNumberChanged::kYes
+ : ChildFrameCompositingHelper::CaptureSequenceNumberChanged::kNo;
if (view_) {
pending_visual_properties_.compositor_viewport =
@@ -981,8 +988,8 @@ bool RemoteFrame::SynchronizeVisualProperties(bool propagate) {
DCHECK(surface_id.is_valid());
DCHECK(!remote_process_gone_);
- compositing_helper_->SetSurfaceId(surface_id,
- capture_sequence_number_changed);
+ compositing_helper_->SetSurfaceId(surface_id, capture_sequence_number_changed,
+ allow_paint_holding);
bool rect_changed = !sent_visual_properties_ ||
sent_visual_properties_->rect_in_local_root !=
@@ -1011,8 +1018,14 @@ void RemoteFrame::RecordSentVisualProperties() {
}
void RemoteFrame::ResendVisualProperties() {
+ ResendVisualPropertiesInternal(
+ ChildFrameCompositingHelper::AllowPaintHolding::kNo);
+}
+
+void RemoteFrame::ResendVisualPropertiesInternal(
+ ChildFrameCompositingHelper::AllowPaintHolding allow_paint_holding) {
sent_visual_properties_ = absl::nullopt;
- SynchronizeVisualProperties();
+ SynchronizeVisualProperties(/*propagate=*/true, allow_paint_holding);
}
void RemoteFrame::DidUpdateVisualProperties(
diff --git a/chromium/third_party/blink/renderer/core/frame/remote_frame.h b/chromium/third_party/blink/renderer/core/frame/remote_frame.h
index 9585ac3d502..2209822b702 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/remote_frame.h
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/remote_frame.h
@@ -16,6 +16,7 @@
#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/execution_context/remote_security_context.h"
+#include "third_party/blink/renderer/core/frame/child_frame_compositing_helper.h"
#include "third_party/blink/renderer/core/frame/child_frame_compositor.h"
#include "third_party/blink/renderer/core/frame/frame.h"
#include "third_party/blink/renderer/core/frame/remote_frame_view.h"
@@ -129,7 +130,13 @@ class CORE_EXPORT RemoteFrame final : public Frame,
void InitializeFrameVisualProperties(const FrameVisualProperties& properties);
// If 'propagate' is true, updated properties will be sent to the browser.
// Returns true if visual properties have changed.
- bool SynchronizeVisualProperties(bool propagate = true);
+ // If 'allow_paint_holding' is yes, the remote frame will display stale paint
+ // (for a timeout) until a frame with the newly synchronized visual properties
+ // has been produced by the child.
+ bool SynchronizeVisualProperties(
+ bool propagate = true,
+ ChildFrameCompositingHelper::AllowPaintHolding allow_paint_holding =
+ ChildFrameCompositingHelper::AllowPaintHolding::kNo);
void ResendVisualProperties();
void SetViewportIntersection(const mojom::blink::ViewportIntersectionState&);
void UpdateCompositedLayerBounds();
@@ -208,7 +215,8 @@ class CORE_EXPORT RemoteFrame final : public Frame,
void DisableAutoResize() override;
void DidUpdateVisualProperties(
const cc::RenderFrameMetadata& metadata) override;
- void SetFrameSinkId(const viz::FrameSinkId& frame_sink_id) override;
+ void SetFrameSinkId(const viz::FrameSinkId& frame_sink_id,
+ bool allow_paint_holding) override;
void ChildProcessGone() override;
void CreateRemoteChild(
const RemoteFrameToken& token,
@@ -274,6 +282,9 @@ class CORE_EXPORT RemoteFrame final : public Frame,
void ApplyReplicatedPermissionsPolicyHeader();
void RecordSentVisualProperties();
+ void ResendVisualPropertiesInternal(
+ ChildFrameCompositingHelper::AllowPaintHolding allow_paint_holding);
+
Member<RemoteFrameView> view_;
RemoteSecurityContext security_context_;
absl::optional<blink::FrameVisualProperties> sent_visual_properties_;
diff --git a/chromium/third_party/blink/renderer/core/frame/report.cc b/chromium/third_party/blink/renderer/core/frame/report.cc
index f854ddfdc18..4106efeba4a 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/report.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/report.cc
@@ -30,4 +30,11 @@ unsigned Report::MatchId() const {
return hash;
}
+bool Report::ShouldSendReport() const {
+ // Don't report any URLs from extension code.
+ // TODO(356098278): Investigate whether extension URLs should be reported to
+ // an extension-defined endpoint, if the extension opts in to reporting.
+ return !body()->IsExtensionSource();
+}
+
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/frame/report.h b/chromium/third_party/blink/renderer/core/frame/report.h
index 2dcc85fe99a..0e97c298e1d 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/report.h
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/report.h
@@ -50,6 +50,12 @@ class CORE_EXPORT Report : public ScriptWrappable {
// Collision of match id is possible.
unsigned MatchId() const;
+ // Determines whether this report is allowed to be sent to observers or the
+ // reporting endpoints. This should return false if the report should not be
+ // sent, for example, if the body of the report would reveal private
+ // information, such as extension URLs.
+ bool ShouldSendReport() const;
+
private:
const String type_;
const String url_;
diff --git a/chromium/third_party/blink/renderer/core/frame/report_body.h b/chromium/third_party/blink/renderer/core/frame/report_body.h
index 73a07fa7355..ea19d190b71 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/report_body.h
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/report_body.h
@@ -25,6 +25,10 @@ class CORE_EXPORT ReportBody : public ScriptWrappable {
// Provides a hash-like value for identifying reports with same content.
// Collision of match id is possible.
virtual unsigned MatchId() const { return 0; }
+
+ // Returns true if this report body would contain an extension URL as the
+ // report source.
+ virtual bool IsExtensionSource() const { return false; }
};
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/frame/report_test.cc b/chromium/third_party/blink/renderer/core/frame/report_test.cc
index 1fbaa2bfa3f..2d14342315a 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/report_test.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/report_test.cc
@@ -7,6 +7,7 @@
#include <vector>
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/scheme_registry.h"
#include "third_party/blink/renderer/core/frame/document_policy_violation_report_body.h"
#include "third_party/blink/renderer/core/frame/location_report_body.h"
#include "third_party/blink/renderer/core/frame/permissions_policy_violation_report_body.h"
@@ -87,5 +88,32 @@ TEST(ReportMatchIdTest, MatchIdGeneratedShouldNotBeZero) {
}
}
+TEST(ReportTest, ExtensionURLsAreNotReported) {
+ CommonSchemeRegistry::RegisterURLSchemeAsExtension("chrome-extension");
+ EXPECT_TRUE(Report(ReportType::kDocumentPolicyViolation,
+ "https://example.com/",
+ MakeGarbageCollected<DocumentPolicyViolationReportBody>(
+ "feature", "message", "disposition",
+ "https://example.com/script.js"))
+ .ShouldSendReport());
+ EXPECT_FALSE(Report(ReportType::kDocumentPolicyViolation,
+ "https://example.com/",
+ MakeGarbageCollected<DocumentPolicyViolationReportBody>(
+ "feature", "message", "disposition",
+ "chrome-extension://abcdefghijklmnopabcdefghijklmnop/"
+ "scripts/script.js"))
+ .ShouldSendReport());
+ // This is false for now; all reports from extension scripts are blocked, even
+ // if the report comes from the extension itself.
+ EXPECT_FALSE(Report(ReportType::kDocumentPolicyViolation,
+ "chrome-extension://abcdefghijklmnopabcdefghijklmnop/"
+ "background_page.html",
+ MakeGarbageCollected<DocumentPolicyViolationReportBody>(
+ "feature", "message", "disposition",
+ "chrome-extension://abcdefghijklmnopabcdefghijklmnop/"
+ "scripts/script.js"))
+ .ShouldSendReport());
+}
+
} // namespace
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/frame/reporting_context.cc b/chromium/third_party/blink/renderer/core/frame/reporting_context.cc
index dc32fd90d94..c4ade3b35c8 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/frame/reporting_context.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/frame/reporting_context.cc
@@ -76,6 +76,10 @@ void ReportingContext::Bind(
void ReportingContext::QueueReport(Report* report,
const Vector<String>& endpoints) {
+ if (!report->ShouldSendReport()) {
+ return;
+ }
+
CountReport(report);
NotifyInternal(report);
diff --git a/chromium/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc b/chromium/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc
index 1767d68d92f..06a51f5e1a6 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc
@@ -413,7 +413,7 @@ static unsigned AvoidDownloadIfHigherDensityResourceIsInCache(
KURL url = document->CompleteURL(
StripLeadingAndTrailingHTMLSpaces(image_candidates[i]->Url()));
if (MemoryCache::Get()->ResourceForURL(
- url, document->Fetcher()->GetCacheIdentifier(url)) ||
+ url, document->Fetcher()->GetCacheIdentifier(url, /*skip_service_worker=*/false)) ||
url.ProtocolIsData())
return i;
}
diff --git a/chromium/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/chromium/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
index fb7a567f9f5..e9863d53647 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -2315,7 +2315,8 @@ bool InspectorNetworkAgent::FetchResourceContent(Document* document,
Resource* cached_resource = document->Fetcher()->CachedResource(url);
if (!cached_resource) {
cached_resource = MemoryCache::Get()->ResourceForURL(
- url, document->Fetcher()->GetCacheIdentifier(url));
+ url, document->Fetcher()->GetCacheIdentifier(
+ url, /*skip_service_worker=*/false));
}
if (cached_resource && InspectorPageAgent::CachedResourceContent(
cached_resource, content, base64_encoded)) {
diff --git a/chromium/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/chromium/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
index 0767cdd734f..809aa7ceda5 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -167,7 +167,8 @@ Resource* CachedResource(LocalFrame* frame,
Resource* cached_resource = document->Fetcher()->CachedResource(url);
if (!cached_resource) {
cached_resource = MemoryCache::Get()->ResourceForURL(
- url, document->Fetcher()->GetCacheIdentifier(url));
+ url, document->Fetcher()->GetCacheIdentifier(
+ url, /*skip_service_worker=*/false));
}
if (!cached_resource)
cached_resource = loader->ResourceForURL(url);
diff --git a/chromium/third_party/blink/renderer/core/loader/image_loader.cc b/chromium/third_party/blink/renderer/core/loader/image_loader.cc
index c647f154a13..76d72a7bc49 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/loader/image_loader.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/loader/image_loader.cc
@@ -741,7 +741,8 @@ bool ImageLoader::ShouldLoadImmediately(const KURL& url) const {
// content when style recalc is over and DOM mutation is allowed again.
if (!url.IsNull()) {
Resource* resource = MemoryCache::Get()->ResourceForURL(
- url, element_->GetDocument().Fetcher()->GetCacheIdentifier(url));
+ url, element_->GetDocument().Fetcher()->GetCacheIdentifier(
+ url, /*skip_service_worker=*/false));
if (resource && !resource->ErrorOccurred() &&
CanReuseFromListOfAvailableImages(
diff --git a/chromium/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc b/chromium/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
index e6138a68698..1bd0a69801d 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
@@ -116,11 +116,18 @@ void ModuleScriptLoader::FetchInternal(
url_ = module_request.Url();
#endif
+ DOMWrapperWorld& request_world = modulator_->GetScriptState()->World();
+ // Prevents web service workers from intercepting isolated world dynamic
+ // script imports requests and responding with different contents.
+ // TODO(crbug.com/1296102): Link to documentation that describes the criteria
+ // where module imports are handled by service worker fetch handler.
+ resource_request.SetSkipServiceWorker(request_world.IsIsolatedWorld());
+
// <spec step="5">... destination is destination, ...</spec>
resource_request.SetRequestContext(module_request.ContextType());
resource_request.SetRequestDestination(module_request.Destination());
- ResourceLoaderOptions options(&modulator_->GetScriptState()->World());
+ ResourceLoaderOptions options(&request_world);
// <spec step="7">Set up the module script request given request and
// options.</spec>
diff --git a/chromium/third_party/blink/renderer/core/paint/sparse_vector.h b/chromium/third_party/blink/renderer/core/paint/sparse_vector.h
index 983d49f249e..ebc1c2a17bc 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/paint/sparse_vector.h
+++ src/3rdparty/chromium/third_party/blink/renderer/core/paint/sparse_vector.h
@@ -108,10 +108,18 @@ class CORE_EXPORT SparseVector {
// Then count the total population of field IDs lower than that one we
// are looking for. The target field ID should be located at the index of
// of the total population.
-#ifdef _MSC_VER
- return __popcnt(fields_bitfield_ & mask);
-#else
+#if defined(__GNUC__) || defined(__clang__)
return __builtin_popcount(fields_bitfield_ & mask);
+#elif _MSVC_LANG >= 202002L // C++20
+ return std::popcount(fields_bitfield_ & mask);
+#else
+ uint32_t v = (fields_bitfield_ & mask);
+ uint32_t c = v - ((v >> 1) & 0x55555555);
+ c = ((c >> 2) & 0x33333333) + (c & 0x33333333);
+ c = ((c >> 4) + c) & 0x0F0F0F0F;
+ c = ((c >> 8) + c) & 0x00FF00FF;
+ c = ((c >> 16) + c) & 0x0000FFFF;
+ return c;
#endif
}
diff --git a/chromium/third_party/blink/renderer/core/testing/internals.cc b/chromium/third_party/blink/renderer/core/testing/internals.cc
index e3bda97e583..a56b6d8fbb3 100644
--- src/3rdparty/chromium/third_party/blink/renderer/core/testing/internals.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/core/testing/internals.cc
@@ -883,8 +883,8 @@ bool Internals::isLoading(const String& url) {
if (!document_)
return false;
const KURL full_url = document_->CompleteURL(url);
- const String cache_identifier =
- document_->Fetcher()->GetCacheIdentifier(full_url);
+ const String cache_identifier = document_->Fetcher()->GetCacheIdentifier(
+ full_url, /*skip_service_worker=*/false);
Resource* resource =
MemoryCache::Get()->ResourceForURL(full_url, cache_identifier);
// We check loader() here instead of isLoading(), because a multipart
@@ -896,8 +896,8 @@ bool Internals::isLoadingFromMemoryCache(const String& url) {
if (!document_)
return false;
const KURL full_url = document_->CompleteURL(url);
- const String cache_identifier =
- document_->Fetcher()->GetCacheIdentifier(full_url);
+ const String cache_identifier = document_->Fetcher()->GetCacheIdentifier(
+ full_url, /*skip_service_worker=*/false);
Resource* resource =
MemoryCache::Get()->ResourceForURL(full_url, cache_identifier);
return resource && resource->GetStatus() == ResourceStatus::kCached;
diff --git a/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc b/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
index 136f27f1ab0..97bb637e329 100644
--- src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
@@ -266,4 +266,10 @@ void SerialPortUnderlyingSink::PipeClosed() {
abort_handle_.Clear();
}
+void SerialPortUnderlyingSink::Dispose() {
+ // Ensure that `watcher_` is disarmed so that `OnHandleReady()` is not called
+ // after this object becomes garbage.
+ PipeClosed();
+}
+
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h b/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
index 0b2070f01aa..a3ff78fc45c 100644
--- src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
+++ src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
@@ -20,6 +20,8 @@ class SerialPort;
class WritableStreamDefaultController;
class SerialPortUnderlyingSink final : public UnderlyingSinkBase {
+ USING_PRE_FINALIZER(SerialPortUnderlyingSink, Dispose);
+
public:
SerialPortUnderlyingSink(SerialPort*, mojo::ScopedDataPipeProducerHandle);
@@ -46,6 +48,7 @@ class SerialPortUnderlyingSink final : public UnderlyingSinkBase {
void OnFlushOrDrain();
void WriteData();
void PipeClosed();
+ void Dispose();
mojo::ScopedDataPipeProducerHandle data_pipe_;
mojo::SimpleWatcher watcher_;
diff --git a/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc b/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc
index 1f4440001bf..c7d17260ddb 100644
--- src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc
@@ -225,4 +225,10 @@ void SerialPortUnderlyingSource::Close() {
data_pipe_.reset();
}
+void SerialPortUnderlyingSource::Dispose() {
+ // Ensure that `watcher_` is disarmed so that `OnHandleReady()` is not called
+ // after this object becomes garbage.
+ Close();
+}
+
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h b/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h
index 2ca0f471f54..eed40684716 100644
--- src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h
+++ src/3rdparty/chromium/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h
@@ -11,6 +11,7 @@
#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/streams/underlying_byte_source_base.h"
+#include "third_party/blink/renderer/platform/heap/prefinalizer.h"
namespace blink {
@@ -20,6 +21,8 @@ class SerialPort;
class SerialPortUnderlyingSource : public UnderlyingByteSourceBase,
ExecutionContextLifecycleObserver {
+ USING_PRE_FINALIZER(SerialPortUnderlyingSource, Dispose);
+
public:
SerialPortUnderlyingSource(ScriptState*,
SerialPort*,
@@ -46,6 +49,7 @@ class SerialPortUnderlyingSource : public UnderlyingByteSourceBase,
void OnFlush(ScriptPromiseResolver*);
void PipeClosed();
void Close();
+ void Dispose();
// TODO(crbug.com/1457493) : Remove when debugging is done.
MojoResult invalid_data_pipe_read_result_ = MOJO_RESULT_OK;
diff --git a/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 5bfbe590f32..248c049c62c 100644
--- src/3rdparty/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ src/3rdparty/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -860,7 +860,8 @@ Resource* ResourceFetcher::CreateResourceForStaticData(
if (!archive_ && factory.GetType() == ResourceType::kRaw)
return nullptr;
- const String cache_identifier = GetCacheIdentifier(url);
+ const String cache_identifier = GetCacheIdentifier(
+ url, params.GetResourceRequest().GetSkipServiceWorker());
// Most off-main-thread resource fetches use Resource::kRaw and don't reach
// this point, but off-main-thread module fetches might.
if (IsMainThread()) {
@@ -1347,7 +1348,10 @@ Resource* ResourceFetcher::RequestResource(FetchParameters& params,
resource = nullptr;
} else {
resource = MemoryCache::Get()->ResourceForURL(
- params.Url(), GetCacheIdentifier(params.Url()));
+ params.Url(),
+ GetCacheIdentifier(
+ params.Url(),
+ params.GetResourceRequest().GetSkipServiceWorker()));
}
if (resource) {
policy = DetermineRevalidationPolicy(resource_type, params, *resource,
@@ -1604,7 +1608,8 @@ Resource* ResourceFetcher::CreateResourceForLoading(
const FetchParameters& params,
const ResourceFactory& factory) {
const String cache_identifier =
- GetCacheIdentifier(params.GetResourceRequest().Url());
+ GetCacheIdentifier(params.GetResourceRequest().Url(),
+ params.GetResourceRequest().GetSkipServiceWorker());
if (!base::FeatureList::IsEnabled(
blink::features::kScopeMemoryCachePerContext)) {
DCHECK(!IsMainThread() || params.IsStaleRevalidation() ||
@@ -2605,9 +2610,11 @@ void ResourceFetcher::UpdateAllImageResourcePriorities() {
to_be_removed.clear();
}
-String ResourceFetcher::GetCacheIdentifier(const KURL& url) const {
- if (properties_->GetControllerServiceWorkerMode() !=
- mojom::ControllerServiceWorkerMode::kNoController) {
+String ResourceFetcher::GetCacheIdentifier(const KURL& url,
+ bool skip_service_worker) const {
+ if (!skip_service_worker &&
+ properties_->GetControllerServiceWorkerMode() !=
+ mojom::ControllerServiceWorkerMode::kNoController) {
return String::Number(properties_->ServiceWorkerId());
}
diff --git a/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
index c437d854203..31e9774c178 100644
--- src/3rdparty/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
+++ src/3rdparty/chromium/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -260,7 +260,11 @@ class PLATFORM_EXPORT ResourceFetcher
uint32_t inflight_keepalive_bytes);
blink::mojom::ControllerServiceWorkerMode IsControlledByServiceWorker() const;
- String GetCacheIdentifier(const KURL& url) const;
+ // Returns a cache identifier for MemoryCache.
+ // `url` is used for finding a matching WebBundle.
+ // If `skip_service_worker` is true, the identifier won't be a ServiceWorker's
+ // identifier to keep the cache separated.
+ String GetCacheIdentifier(const KURL& url, bool skip_service_worker) const;
// If `url` exists as a resource in a subresource bundle in this frame,
// returns its UnguessableToken; otherwise, returns absl::nullopt.
diff --git a/chromium/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/chromium/third_party/blink/renderer/platform/runtime_enabled_features.json5
index c8c9459fad4..ff8dbd47b82 100644
--- src/3rdparty/chromium/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ src/3rdparty/chromium/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2749,6 +2749,10 @@
base_feature: "none",
settable_from_internals: true,
},
+ {
+ name: "PaintHoldingForIframes",
+ status: "test",
+ },
{
// PARAKEET ad serving runtime flag/JS API.
name: "Parakeet",
diff --git a/chromium/third_party/dawn/src/tint/lang/wgsl/ast/transform/packed_vec3.cc b/chromium/third_party/dawn/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
index c6f47805657..53ac72c89fb 100644
--- src/3rdparty/chromium/third_party/dawn/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
+++ src/3rdparty/chromium/third_party/dawn/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
@@ -66,6 +66,14 @@ struct PackedVec3::State {
/// A map from type to the name of a helper function used to unpack that type.
Hashmap<const core::type::Type*, Symbol, 4> unpack_helpers;
+ /// @returns true if @p addrspace requires vec3 types to be packed
+ bool AddressSpaceNeedsPacking(core::AddressSpace addrspace) {
+ // Host-shareable address spaces need to be packed to match the memory layout on the host.
+ // The workgroup address space needs to be packed so that the size of generated threadgroup
+ // variables matches the size of the original WGSL declarations.
+ return core::IsHostShareable(addrspace) || addrspace == core::AddressSpace::kWorkgroup;
+ }
+
/// @param ty the type to test
/// @returns true if `ty` is a vec3, false otherwise
bool IsVec3(const core::type::Type* ty) {
@@ -342,7 +350,7 @@ struct PackedVec3::State {
// if the transform is necessary.
for (auto* decl : src->AST().GlobalVariables()) {
auto* var = sem.Get<sem::GlobalVariable>(decl);
- if (var && core::IsHostShareable(var->AddressSpace()) &&
+ if (var && AddressSpaceNeedsPacking(var->AddressSpace()) &&
ContainsVec3(var->Type()->UnwrapRef())) {
return true;
}
@@ -379,7 +387,7 @@ struct PackedVec3::State {
[&](const sem::TypeExpression* type) {
// Rewrite pointers to types that contain vec3s.
auto* ptr = type->Type()->As<core::type::Pointer>();
- if (ptr && core::IsHostShareable(ptr->AddressSpace())) {
+ if (ptr && AddressSpaceNeedsPacking(ptr->AddressSpace())) {
auto new_store_type = RewriteType(ptr->StoreType());
if (new_store_type) {
auto access = ptr->AddressSpace() == core::AddressSpace::kStorage
@@ -392,7 +400,7 @@ struct PackedVec3::State {
}
},
[&](const sem::Variable* var) {
- if (!core::IsHostShareable(var->AddressSpace())) {
+ if (!AddressSpaceNeedsPacking(var->AddressSpace())) {
return;
}
@@ -408,7 +416,7 @@ struct PackedVec3::State {
auto* lhs = sem.GetVal(assign->lhs);
auto* rhs = sem.GetVal(assign->rhs);
if (!ContainsVec3(rhs->Type()) ||
- !core::IsHostShareable(
+ !AddressSpaceNeedsPacking(
lhs->Type()->As<core::type::Reference>()->AddressSpace())) {
// Skip assignments to address spaces that are not host-shareable, or
// that do not contain vec3 types.
@@ -436,7 +444,7 @@ struct PackedVec3::State {
[&](const sem::Load* load) {
// Unpack loads of types that contain vec3s in host-shareable address spaces.
if (ContainsVec3(load->Type()) &&
- core::IsHostShareable(load->ReferenceType()->AddressSpace())) {
+ AddressSpaceNeedsPacking(load->ReferenceType()->AddressSpace())) {
to_unpack.Add(load);
}
},
@@ -446,7 +454,7 @@ struct PackedVec3::State {
// struct.
if (auto* ref = accessor->Type()->As<core::type::Reference>()) {
if (IsVec3(ref->StoreType()) &&
- core::IsHostShareable(ref->AddressSpace())) {
+ AddressSpaceNeedsPacking(ref->AddressSpace())) {
ctx.Replace(node, b.MemberAccessor(ctx.Clone(accessor->Declaration()),
kStructMemberName));
}
diff --git a/chromium/third_party/dawn/src/tint/lang/wgsl/resolver/validator.cc b/chromium/third_party/dawn/src/tint/lang/wgsl/resolver/validator.cc
index 42f7e840d1d..f15bb8095f4 100644
--- src/3rdparty/chromium/third_party/dawn/src/tint/lang/wgsl/resolver/validator.cc
+++ src/3rdparty/chromium/third_party/dawn/src/tint/lang/wgsl/resolver/validator.cc
@@ -438,10 +438,6 @@ bool Validator::AddressSpaceLayout(const core::type::Type* store_ty,
return true;
}
- if (!core::IsHostShareable(address_space)) {
- return true;
- }
-
auto note_usage = [&] {
AddNote("'" + store_ty->FriendlyName() + "' used in address space '" +
tint::ToString(address_space) + "' here",
@@ -518,6 +514,22 @@ bool Validator::AddressSpaceLayout(const core::type::Type* store_ty,
return false;
}
}
+
+ // If an alignment was explicitly specified, we need to validate that it satisfies the
+ // alignment requirement of the address space.
+ auto* align_attr =
+ ast::GetAttribute<ast::StructMemberAlignAttribute>(m->Declaration()->attributes);
+ if (align_attr && !enabled_extensions_.Contains(
+ wgsl::Extension::kChromiumInternalRelaxedUniformLayout)) {
+ auto align = sem_.GetVal(align_attr->expr)->ConstantValue()->ValueAs<uint32_t>();
+ if (align % required_align != 0) {
+ AddError(align_attr->expr->source)
+ << "alignment must be a multiple of " << style::Literal(required_align)
+ << " bytes for the " << style::Enum(address_space) << " address space";
+ note_usage();
+ return false;
+ }
+ }
}
}
diff --git a/chromium/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/DxilConditionalMem2Reg.cpp b/chromium/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/DxilConditionalMem2Reg.cpp
index 79a250de94f..026d2aacd0c 100644
--- src/3rdparty/chromium/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/DxilConditionalMem2Reg.cpp
+++ src/3rdparty/chromium/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/DxilConditionalMem2Reg.cpp
@@ -257,14 +257,17 @@ class DxilConditionalMem2Reg : public FunctionPass {
static bool ScalarizePreciseVectorAlloca(Function &F) {
BasicBlock *Entry = &*F.begin();
- bool Changed = false;
+ SmallVector<AllocaInst *, 4> PreciseAllocaInsts;
for (auto it = Entry->begin(); it != Entry->end();) {
Instruction *I = &*(it++);
AllocaInst *AI = dyn_cast<AllocaInst>(I);
if (!AI || !AI->getAllocatedType()->isVectorTy()) continue;
if (!HLModule::HasPreciseAttributeWithMetadata(AI)) continue;
+ PreciseAllocaInsts.push_back(AI);
+ }
-
+ bool Changed = false;
+ for (auto AI : PreciseAllocaInsts) {
IRBuilder<> B(AI);
VectorType *VTy = cast<VectorType>(AI->getAllocatedType());
Type *ScalarTy = VTy->getVectorElementType();
diff --git a/chromium/third_party/devtools-frontend/src/front_end/panels/network/NetworkLogView.ts b/chromium/third_party/devtools-frontend/src/front_end/panels/network/NetworkLogView.ts
index f2cc8ca2ef3..73d6e02d1fe 100644
--- src/3rdparty/chromium/third_party/devtools-frontend/src/front_end/panels/network/NetworkLogView.ts
+++ src/3rdparty/chromium/third_party/devtools-frontend/src/front_end/panels/network/NetworkLogView.ts
@@ -2184,8 +2184,7 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
const ignoredHeaders = new Set<string>(['accept-encoding', 'host', 'method', 'path', 'scheme', 'version']);
function escapeStringWin(str: string): string {
- /* If there are no new line characters do not escape the " characters
- since it only uglifies the command.
+ /* Always escape the " characters so that we can use caret escaping.
Because cmd.exe parser and MS Crt arguments parsers use some of the
same escape characters, they can interact with each other in
@@ -2211,11 +2210,11 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
new line is there to enact the escape command the second is the character
to escape (in this case new line).
*/
- const encapsChars = /[\r\n]/.test(str) ? '^"' : '"';
+ const encapsChars = '^"';
return encapsChars +
str.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"')
- .replace(/[^a-zA-Z0-9\s_\-:=+~'\/.',?;()*`&]/g, '^$&')
+ .replace(/[^a-zA-Z0-9\s_\-:=+~'\/.',?;()*`]/g, '^$&')
.replace(/%(?=[a-zA-Z0-9_])/g, '%^')
.replace(/\r?\n/g, '^\n\n') +
encapsChars;
diff --git a/chromium/third_party/expat/src/expat/lib/xmlparse.c b/chromium/third_party/expat/src/expat/lib/xmlparse.c
index 205cb04b720..59d7b4f8100 100644
--- src/3rdparty/chromium/third_party/expat/src/expat/lib/xmlparse.c
+++ src/3rdparty/chromium/third_party/expat/src/expat/lib/xmlparse.c
@@ -1986,6 +1986,12 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) {
if (parser == NULL)
return XML_STATUS_ERROR;
+
+ if (len < 0) {
+ parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT;
+ return XML_STATUS_ERROR;
+ }
+
switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
parser->m_errorCode = XML_ERROR_SUSPENDED;
@@ -6886,6 +6892,16 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
if (! newE)
return 0;
if (oldE->nDefaultAtts) {
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((size_t)oldE->nDefaultAtts
+ > ((size_t)(-1) / sizeof(DEFAULT_ATTRIBUTE))) {
+ return 0;
+ }
+#endif
newE->defaultAtts
= ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
if (! newE->defaultAtts) {
@@ -7428,6 +7444,15 @@ nextScaffoldPart(XML_Parser parser) {
int next;
if (! dtd->scaffIndex) {
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if (parser->m_groupSize > ((size_t)(-1) / sizeof(int))) {
+ return -1;
+ }
+#endif
dtd->scaffIndex = (int *)MALLOC(parser, parser->m_groupSize * sizeof(int));
if (! dtd->scaffIndex)
return -1;
diff --git a/chromium/third_party/ipcz/src/ipcz/node_link.cc b/chromium/third_party/ipcz/src/ipcz/node_link.cc
index 2fe981a9a2e..fc7b186eda0 100644
--- src/3rdparty/chromium/third_party/ipcz/src/ipcz/node_link.cc
+++ src/3rdparty/chromium/third_party/ipcz/src/ipcz/node_link.cc
@@ -36,21 +36,6 @@
namespace ipcz {
-namespace {
-
-template <typename T>
-FragmentRef<T> MaybeAdoptFragmentRef(NodeLinkMemory& memory,
- const FragmentDescriptor& descriptor) {
- if (descriptor.is_null() || descriptor.size() < sizeof(T) ||
- descriptor.offset() % 8 != 0) {
- return {};
- }
-
- return memory.AdoptFragmentRef<T>(memory.GetFragment(descriptor));
-}
-
-} // namespace
-
// static
Ref<NodeLink> NodeLink::CreateActive(Ref<Node> node,
LinkSide link_side,
@@ -702,8 +687,8 @@ bool NodeLink::OnAcceptBypassLink(msg::AcceptBypassLink& accept) {
return true;
}
- auto link_state = MaybeAdoptFragmentRef<RouterLinkState>(
- memory(), accept.params().new_link_state_fragment);
+ auto link_state = memory().AdoptFragmentRefIfValid<RouterLinkState>(
+ accept.params().new_link_state_fragment);
if (link_state.is_null()) {
// Bypass links must always come with a valid fragment for their
// RouterLinkState. If one has not been provided, that's a validation
@@ -745,8 +730,8 @@ bool NodeLink::OnBypassPeerWithLink(msg::BypassPeerWithLink& bypass) {
return true;
}
- auto link_state = MaybeAdoptFragmentRef<RouterLinkState>(
- memory(), bypass.params().new_link_state_fragment);
+ auto link_state = memory().AdoptFragmentRefIfValid<RouterLinkState>(
+ bypass.params().new_link_state_fragment);
if (link_state.is_null()) {
return false;
}
diff --git a/chromium/third_party/ipcz/src/ipcz/node_link_memory.h b/chromium/third_party/ipcz/src/ipcz/node_link_memory.h
index df8010b595f..ba04a7c03da 100644
--- src/3rdparty/chromium/third_party/ipcz/src/ipcz/node_link_memory.h
+++ src/3rdparty/chromium/third_party/ipcz/src/ipcz/node_link_memory.h
@@ -86,14 +86,29 @@ class NodeLinkMemory : public RefCounted<NodeLinkMemory> {
// with the same BufferId and dimensions as `descriptor`.
Fragment GetFragment(const FragmentDescriptor& descriptor);
- // Adopts an existing reference to a RefCountedFragment within `fragment`.
- // This does NOT increment the ref count of the RefCountedFragment.
+ // Adopts an existing reference to a RefCountedFragment within `fragment`,
+ // which must be a valid, properly aligned, and sufficiently sized fragment to
+ // hold a T. This does NOT increment the ref count of the RefCountedFragment.
template <typename T>
FragmentRef<T> AdoptFragmentRef(const Fragment& fragment) {
ABSL_ASSERT(sizeof(T) <= fragment.size());
return FragmentRef<T>(kAdoptExistingRef, WrapRefCounted(this), fragment);
}
+ // Attempts to adopt an existing reference to a RefCountedFragment located at
+ // `fragment`. Returns null if the fragment descriptor is null, misaligned,
+ // or of insufficient size. This does NOT increment the ref count of the
+ // RefCountedFragment.
+ template <typename T>
+ FragmentRef<T> AdoptFragmentRefIfValid(const FragmentDescriptor& descriptor) {
+ if (descriptor.is_null() || descriptor.size() < sizeof(T) ||
+ descriptor.offset() % 8 != 0) {
+ return {};
+ }
+
+ return AdoptFragmentRef<T>(GetFragment(descriptor));
+ }
+
// Adds a new buffer to the underlying BufferPool to use as additional
// allocation capacity for blocks of size `block_size`. Note that the
// contents of the mapped region must already be initialized as a
diff --git a/chromium/third_party/ipcz/src/ipcz/router.cc b/chromium/third_party/ipcz/src/ipcz/router.cc
index 09988c04fe9..45ab0135459 100644
--- src/3rdparty/chromium/third_party/ipcz/src/ipcz/router.cc
+++ src/3rdparty/chromium/third_party/ipcz/src/ipcz/router.cc
@@ -764,12 +764,17 @@ Ref<Router> Router::Deserialize(const RouterDescriptor& descriptor,
? descriptor.decaying_incoming_sequence_length
: descriptor.next_incoming_sequence_number);
+ auto link_state =
+ from_node_link.memory().AdoptFragmentRefIfValid<RouterLinkState>(
+ descriptor.new_link_state_fragment);
+ if (link_state.is_null()) {
+ // Central links require a valid link state fragment.
+ return nullptr;
+ }
new_outward_link = from_node_link.AddRemoteRouterLink(
context, descriptor.new_sublink,
- from_node_link.memory().AdoptFragmentRef<RouterLinkState>(
- from_node_link.memory().GetFragment(
- descriptor.new_link_state_fragment)),
- LinkType::kCentral, LinkSide::kB, router);
+ std::move(link_state), LinkType::kCentral,
+ LinkSide::kB, router);
if (!new_outward_link) {
return nullptr;
}
diff --git a/chromium/third_party/perfetto/include/perfetto/base/compiler.h b/chromium/third_party/perfetto/include/perfetto/base/compiler.h
index 85678cc768c..ae7bf0aa10a 100644
--- src/3rdparty/chromium/third_party/perfetto/include/perfetto/base/compiler.h
+++ src/3rdparty/chromium/third_party/perfetto/include/perfetto/base/compiler.h
@@ -76,9 +76,31 @@
#if defined(__GNUC__) || defined(__clang__)
#define PERFETTO_POPCOUNT(x) __builtin_popcountll(x)
-#else
+#elif defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
#include <intrin.h>
#define PERFETTO_POPCOUNT(x) __popcnt64(x)
+#else
+#if _MSVC_LANG >= 202002L || (__cplusplus > 201703L && __has_include(<bit>)) // C++20
+#include <bit>
+#endif
+template <typename ValueType, std::enable_if_t<std::is_unsigned_v<ValueType>, int> = 0>
+inline uint32_t qPopulationCount(ValueType v) noexcept
+{
+#if defined(__cpp_lib_bitops)
+ return std::popcount(v);
+#else
+ // we static_cast these bit patterns in order to truncate them to the correct size
+ v = static_cast<ValueType>(v - ((v >> 1) & static_cast<ValueType>(0x5555'5555'5555'5555ull)));
+ v = static_cast<ValueType>((v & static_cast<ValueType>(0x3333'3333'3333'3333ull))
+ + ((v >> 2) & static_cast<ValueType>(0x3333'3333'3333'3333ull)));
+ v = static_cast<ValueType>((v + (v >> 4)) & static_cast<ValueType>(0x0F0F'0F0F'0F0F'0F0Full));
+ // Multiply by one in each byte, so that it will have the sum of all source bytes in the highest byte
+ v = static_cast<ValueType>(v * static_cast<ValueType>(0x0101'0101'0101'0101ull));
+ // Extract highest byte
+ return static_cast<uint32_t>(v >> (sizeof(ValueType) * CHAR_BIT - 8));
+#endif
+}
+#define PERFETTO_POPCOUNT(x) qPopulationCount(x)
#endif
#if defined(__clang__)
diff --git a/chromium/third_party/skia/src/gpu/ganesh/ops/DrawAtlasOp.cpp b/chromium/third_party/skia/src/gpu/ganesh/ops/DrawAtlasOp.cpp
index a3d7e4ddabb..7faa16de5df 100644
--- src/3rdparty/chromium/third_party/skia/src/gpu/ganesh/ops/DrawAtlasOp.cpp
+++ src/3rdparty/chromium/third_party/skia/src/gpu/ganesh/ops/DrawAtlasOp.cpp
@@ -112,6 +112,7 @@ DrawAtlasOpImpl::DrawAtlasOpImpl(GrProcessorSet* processorSet, const SkPMColor4f
: GrMeshDrawOp(ClassID()), fHelper(processorSet, aaType), fColor(color) {
SkASSERT(xforms);
SkASSERT(rects);
+ SkASSERT(spriteCount >= 0);
fViewMatrix = viewMatrix;
Geometry& installedGeo = fGeoData.push_back();
@@ -127,6 +128,11 @@ DrawAtlasOpImpl::DrawAtlasOpImpl(GrProcessorSet* processorSet, const SkPMColor4f
vertexStride += sizeof(GrColor);
}
+ // Bail out if we'd overflow from a really large draw
+ if (spriteCount > SK_MaxS32 / static_cast<int>(4 * vertexStride)) {
+ return;
+ }
+
// Compute buffer size and alloc buffer
fQuadCount = spriteCount;
int allocSize = static_cast<int>(4 * vertexStride * spriteCount);
diff --git a/chromium/third_party/webrtc/modules/desktop_capture/mac/screen_capturer_mac.mm b/chromium/third_party/webrtc/modules/desktop_capture/mac/screen_capturer_mac.mm
index 8f0c68d48b4..1cf029186b0 100644
--- src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/mac/screen_capturer_mac.mm
+++ src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/mac/screen_capturer_mac.mm
@@ -20,6 +20,11 @@
#include "rtc_base/trace_event.h"
#include "sdk/objc/helpers/scoped_cftyperef.h"
+// Build fix for macOS SDK 15 and newer
+#if !defined(CG_AVAILABLE_BUT_DEPRECATED)
+#define CG_AVAILABLE_BUT_DEPRECATED(a,b,c)
+#endif
+
// All these symbols have incorrect availability annotations in the 13.3 SDK.
// These have the correct annotation. See https://crbug.com/1431897.
// TODO(thakis): Remove this once FB12109479 is fixed and we updated to an SDK
diff --git a/chromium/ui/views/views_features.cc b/chromium/ui/views/views_features.cc
index 9c296ba65e0..2641a68539b 100644
--- src/3rdparty/chromium/ui/views/views_features.cc
+++ src/3rdparty/chromium/ui/views/views_features.cc
@@ -17,6 +17,14 @@ BASE_FEATURE(kEnablePlatformHighContrastInkDrop,
"EnablePlatformHighContrastInkDrop",
base::FEATURE_DISABLED_BY_DEFAULT);
+// Handle mouse cursor being out sync with a touch drag operation. If mouse
+// cursor is over different window, drag will not start, and cursor will be
+// moved to the window where the touch drag started. This is a kill switch
+// for this new logic, crbug.com/370856871.
+BASE_FEATURE(kEnableTouchDragCursorSync,
+ "EnableTouchDragCursorSync",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
// Only paint views that are invalidated/dirty (i.e. a paint was directly
// scheduled on those views) as opposed to painting all views that intersect
// an invalid rectangle on the layer.
diff --git a/chromium/ui/views/views_features.h b/chromium/ui/views/views_features.h
index 3aa4134a57b..682a2cec4df 100644
--- src/3rdparty/chromium/ui/views/views_features.h
+++ src/3rdparty/chromium/ui/views/views_features.h
@@ -13,6 +13,7 @@ namespace views::features {
// Please keep alphabetized.
VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnablePlatformHighContrastInkDrop);
+VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableTouchDragCursorSync);
VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableViewPaintOptimization);
VIEWS_EXPORT BASE_DECLARE_FEATURE(kWidgetLayering);
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
index da61095385f..450530b6058 100644
--- src/3rdparty/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
+++ src/3rdparty/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
@@ -8,6 +8,7 @@
#include "base/metrics/histogram_macros.h"
#include "base/threading/hang_watcher.h"
+#include "ui/aura/env.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/dragdrop/drag_source_win.h"
#include "ui/base/dragdrop/drop_target_event.h"
@@ -15,6 +16,7 @@
#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
#include "ui/base/win/event_creation_utils.h"
#include "ui/display/win/screen_win.h"
+#include "ui/views/views_features.h"
#include "ui/views/widget/desktop_aura/desktop_drop_target_win.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
@@ -42,12 +44,34 @@ ui::mojom::DragOperation DesktopDragDropClientWin::StartDragAndDrop(
const gfx::Point& screen_location,
int allowed_operations,
ui::mojom::DragEventSource source) {
- drag_drop_in_progress_ = true;
gfx::Point touch_screen_point;
if (source == ui::mojom::DragEventSource::kTouch) {
+ display::Screen* screen = display::Screen::GetScreen();
+ CHECK(screen);
+ aura::Window* window =
+ screen->GetWindowAtScreenPoint(screen->GetCursorScreenPoint());
touch_screen_point =
screen_location + source_window->GetBoundsInScreen().OffsetFromOrigin();
source_window->GetHost()->ConvertDIPToPixels(&touch_screen_point);
+ bool touch_down = aura::Env::GetInstance()->is_touch_down();
+ bool touch_over_other_window =
+ !window || window->GetRootWindow() != root_window;
+ bool touch_drag_cursor_sync =
+ base::FeatureList::IsEnabled(features::kEnableTouchDragCursorSync);
+ // If attempting to start a touch drag with the cursor over another window,
+ // move cursor to this window so the next drag attempt will succeed.
+ // TODO(crbug.com/40312079): Mouse cursor needs to follow long press touch
+ // events for this to be smoother, but ::SetCursorPos needs to be called
+ // well before calling ::DoDragDrop.
+ if (touch_drag_cursor_sync && touch_down && touch_over_other_window) {
+ ::SetCursorPos(touch_screen_point.x(), touch_screen_point.y());
+ }
+ // Check that the cursor is over the window being dragged from. If not,
+ // don't start the drag because ::DoDragDrop will not do the drag.
+ if (touch_drag_cursor_sync && (!touch_down || touch_over_other_window)) {
+ return ui::PreferredDragOperation(
+ ui::DragDropTypes::DropEffectToDragOperation(DROPEFFECT_NONE));
+ }
desktop_host_->StartTouchDrag(touch_screen_point);
// Gesture state gets left in a state where you can't start
// another drag, unless it's cleaned up. Cleaning it up before starting
@@ -57,6 +81,7 @@ ui::mojom::DragOperation DesktopDragDropClientWin::StartDragAndDrop(
}
base::WeakPtr<DesktopDragDropClientWin> alive(weak_factory_.GetWeakPtr());
+ drag_drop_in_progress_ = true;
drag_source_ = ui::DragSourceWin::Create();
Microsoft::WRL::ComPtr<ui::DragSourceWin> drag_source_copy = drag_source_;
drag_source_copy->set_data(data.get());
diff --git a/chromium/ui/views/widget/root_view.cc b/chromium/ui/views/widget/root_view.cc
index ace679c7cc9..1dd799a55c2 100644
--- src/3rdparty/chromium/ui/views/widget/root_view.cc
+++ src/3rdparty/chromium/ui/views/widget/root_view.cc
@@ -60,37 +60,6 @@ class MouseEnterExitEvent : public ui::MouseEvent {
}
};
-// TODO(crbug.com/1295290): This class is for debug purpose only.
-// Remove it after resolving the issue.
-class DanglingMouseMoveHandlerOnViewDestroyingChecker
- : public views::ViewObserver {
- public:
- explicit DanglingMouseMoveHandlerOnViewDestroyingChecker(
- const raw_ptr<views::View, AcrossTasksDanglingUntriaged>&
- mouse_move_handler)
- : mouse_move_handler_(mouse_move_handler) {
- scoped_observation.Observe(mouse_move_handler_);
- }
-
- // views::ViewObserver:
- void OnViewIsDeleting(views::View* view) override {
- // `mouse_move_handler_` should be nulled before `view` dies. Otherwise
- // `mouse_move_handler_` will become a dangling pointer.
- CHECK(!mouse_move_handler_);
- scoped_observation.Reset();
- }
-
- private:
- base::ScopedObservation<views::View, views::ViewObserver> scoped_observation{
- this};
- // Excluded from `raw_ref` rewriter which would otherwise turn this
- // into a `raw_ref<raw_ptr<>>`. The current `raw_ptr&` setup is
- // intentional and used to observe the pointer without counting as a
- // live reference to the underlying memory.
- RAW_PTR_EXCLUSION const raw_ptr<views::View, AcrossTasksDanglingUntriaged>&
- mouse_move_handler_;
-};
-
} // namespace
// Used by RootView to create a hidden child that can be used to make screen
@@ -667,16 +636,21 @@ void RootView::ViewHierarchyChanged(
widget_->ViewHierarchyChanged(details);
if (!details.is_add && !details.move_view) {
- if (!explicit_mouse_handler_ && mouse_pressed_handler_ == details.child)
- mouse_pressed_handler_ = nullptr;
- if (mouse_move_handler_ == details.child)
+ if (mouse_pressed_handler_ == details.child) {
+ SetMouseHandler(nullptr);
+ }
+ if (mouse_move_handler_ == details.child) {
mouse_move_handler_ = nullptr;
- if (gesture_handler_ == details.child)
+ }
+ if (gesture_handler_ == details.child) {
gesture_handler_ = nullptr;
- if (event_dispatch_target_ == details.child)
+ }
+ if (event_dispatch_target_ == details.child) {
event_dispatch_target_ = nullptr;
- if (old_dispatch_target_ == details.child)
+ }
+ if (old_dispatch_target_ == details.child) {
old_dispatch_target_ = nullptr;
+ }
}
}
@@ -779,8 +753,6 @@ void RootView::HandleMouseEnteredOrMoved(const ui::MouseEvent& event) {
mouse_move_handler_ = v;
// TODO(crbug.com/1295290): This is for debug purpose only.
// Remove it after resolving the issue.
- DanglingMouseMoveHandlerOnViewDestroyingChecker
- mouse_move_handler_dangling_checker(mouse_move_handler_);
if (!mouse_move_handler_->GetNotifyEnterExitOnChild() ||
!mouse_move_handler_->Contains(old_handler)) {
MouseEnterExitEvent entered(event, ui::ET_MOUSE_ENTERED);
diff --git a/chromium/ui/views/widget/root_view.h b/chromium/ui/views/widget/root_view.h
index 80fc491f87a..4daee866abf 100644
--- src/3rdparty/chromium/ui/views/widget/root_view.h
+++ src/3rdparty/chromium/ui/views/widget/root_view.h
@@ -132,6 +132,9 @@ class VIEWS_EXPORT RootView : public View,
const views::View* gesture_handler_for_testing() const {
return gesture_handler_;
}
+ const views::View* mouse_pressed_handler_for_testing() const {
+ return mouse_pressed_handler_.get();
+ }
protected:
// View:
@@ -205,7 +208,7 @@ class VIEWS_EXPORT RootView : public View,
// ViewTargeter / RootViewTargeter.
// The view currently handing down - drag - up
- raw_ptr<View, AcrossTasksDanglingUntriaged> mouse_pressed_handler_ = nullptr;
+ raw_ptr<View> mouse_pressed_handler_ = nullptr;
// The view currently handling enter / exit
raw_ptr<View, AcrossTasksDanglingUntriaged> mouse_move_handler_ = nullptr;
diff --git a/chromium/ui/views/widget/root_view_unittest.cc b/chromium/ui/views/widget/root_view_unittest.cc
index 388dd6f1125..68a691b348a 100644
--- src/3rdparty/chromium/ui/views/widget/root_view_unittest.cc
+++ src/3rdparty/chromium/ui/views/widget/root_view_unittest.cc
@@ -228,10 +228,12 @@ TEST_F(RootViewTest, EventHandlersResetWhenDeleted) {
View* event_handler = state.AddChildView(std::make_unique<View>());
root_view->SetMouseAndGestureHandler(event_handler);
ASSERT_EQ(event_handler, root_view->gesture_handler_for_testing());
+ ASSERT_EQ(event_handler, root_view->mouse_pressed_handler_for_testing());
// Delete the child and expect that there is no longer a mouse handler.
root_view->GetContentsView()->RemoveChildViewT(event_handler);
EXPECT_EQ(nullptr, root_view->gesture_handler_for_testing());
+ EXPECT_EQ(nullptr, root_view->mouse_pressed_handler_for_testing());
}
TEST_F(RootViewTest, EventHandlersNotResetWhenReparented) {
diff --git a/chromium/v8/src/compiler/access-info.cc b/chromium/v8/src/compiler/access-info.cc
index 92405188f28..ac19b0a2178 100644
--- src/3rdparty/chromium/v8/src/compiler/access-info.cc
+++ src/3rdparty/chromium/v8/src/compiler/access-info.cc
@@ -919,6 +919,7 @@ PropertyAccessInfo AccessInfoFactory::ComputePropertyAccessInfo(
return PropertyAccessInfo::NotFound(zone(), receiver_map, holder);
}
+ CHECK(prototype.IsJSObject());
holder = prototype.AsJSObject();
map = map_prototype_map;
diff --git a/chromium/v8/src/compiler/heap-refs.cc b/chromium/v8/src/compiler/heap-refs.cc
index 932f0be7872..4c7d00d6a4d 100644
--- src/3rdparty/chromium/v8/src/compiler/heap-refs.cc
+++ src/3rdparty/chromium/v8/src/compiler/heap-refs.cc
@@ -1610,6 +1610,7 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType(
if (!expected_receiver_type->IsTemplateFor(prototype.object()->map())) {
return not_found;
}
+ CHECK(prototype.IsJSObject());
return HolderLookupResult(CallOptimization::kHolderFound,
prototype.AsJSObject());
}
diff --git a/chromium/v8/src/compiler/js-call-reducer.cc b/chromium/v8/src/compiler/js-call-reducer.cc
index caec49b87c5..e7f89542a46 100644
--- src/3rdparty/chromium/v8/src/compiler/js-call-reducer.cc
+++ src/3rdparty/chromium/v8/src/compiler/js-call-reducer.cc
@@ -3715,14 +3715,13 @@ bool CanInlineJSToWasmCall(const wasm::FunctionSig* wasm_signature) {
return false;
}
- wasm::ValueType externRefNonNull = wasm::kWasmExternRef.AsNonNull();
for (auto type : wasm_signature->all()) {
#if defined(V8_TARGET_ARCH_32_BIT)
if (type == wasm::kWasmI64) return false;
#endif
if (type != wasm::kWasmI32 && type != wasm::kWasmI64 &&
type != wasm::kWasmF32 && type != wasm::kWasmF64 &&
- type != wasm::kWasmExternRef && type != externRefNonNull) {
+ type != wasm::kWasmExternRef) {
return false;
}
}
diff --git a/chromium/v8/src/compiler/js-native-context-specialization.cc b/chromium/v8/src/compiler/js-native-context-specialization.cc
index 8f37860aefe..089b6410528 100644
--- src/3rdparty/chromium/v8/src/compiler/js-native-context-specialization.cc
+++ src/3rdparty/chromium/v8/src/compiler/js-native-context-specialization.cc
@@ -878,7 +878,9 @@ JSNativeContextSpecialization::InferHasInPrototypeChain(
// might be a different object each time, so it's much simpler to include
// {prototype}. That does, however, mean that we must check {prototype}'s
// map stability.
- if (!prototype.map(broker()).is_stable()) return kMayBeInPrototypeChain;
+ if (!prototype.IsJSObject() || !prototype.map(broker()).is_stable()) {
+ return kMayBeInPrototypeChain;
+ }
last_prototype = prototype.AsJSObject();
}
WhereToStart start = result == NodeProperties::kUnreliableMaps
diff --git a/chromium/v8/src/execution/local-isolate.cc b/chromium/v8/src/execution/local-isolate.cc
index ca5ed58ae63..568a6fe0cf9 100644
--- src/3rdparty/chromium/v8/src/execution/local-isolate.cc
+++ src/3rdparty/chromium/v8/src/execution/local-isolate.cc
@@ -64,8 +64,7 @@ bool StackLimitCheck::HasOverflowed(LocalIsolate* local_isolate) {
#ifdef V8_INTL_SUPPORT
// WARNING: This might be out-of-sync with the main-thread.
const std::string& LocalIsolate::DefaultLocale() {
- const std::string& res =
- is_main_thread() ? isolate_->DefaultLocale() : default_locale_;
+ const std::string& res = isolate_->DefaultLocale();
DCHECK(!res.empty());
return res;
}
diff --git a/chromium/v8/src/execution/local-isolate.h b/chromium/v8/src/execution/local-isolate.h
index b9cdec9e703..08aa92d712d 100644
--- src/3rdparty/chromium/v8/src/execution/local-isolate.h
+++ src/3rdparty/chromium/v8/src/execution/local-isolate.h
@@ -185,9 +185,6 @@ class V8_EXPORT_PRIVATE LocalIsolate final : private HiddenLocalFactory {
base::Optional<WorkerThreadRuntimeCallStatsScope> rcs_scope_;
RuntimeCallStats* runtime_call_stats_;
#endif
-#ifdef V8_INTL_SUPPORT
- std::string default_locale_;
-#endif
};
template <base::MutexSharedType kIsShared>
diff --git a/chromium/v8/src/maglev/maglev-graph-builder.cc b/chromium/v8/src/maglev/maglev-graph-builder.cc
index 2e7756703f4..406f436a44c 100644
--- src/3rdparty/chromium/v8/src/maglev/maglev-graph-builder.cc
+++ src/3rdparty/chromium/v8/src/maglev/maglev-graph-builder.cc
@@ -5080,15 +5080,21 @@ void MaglevGraphBuilder::VisitDeletePropertySloppy() {
void MaglevGraphBuilder::VisitGetSuperConstructor() {
ValueNode* active_function = GetAccumulatorTagged();
- ValueNode* map_proto;
+ // TODO(victorgomes): Maybe BuildLoadTaggedField should support constants
+ // instead.
if (compiler::OptionalHeapObjectRef constant =
TryGetConstant(active_function)) {
- map_proto = GetConstant(constant->map(broker()).prototype(broker()));
- } else {
- ValueNode* map =
- AddNewNode<LoadTaggedField>({active_function}, HeapObject::kMapOffset);
- map_proto = AddNewNode<LoadTaggedField>({map}, Map::kPrototypeOffset);
+ compiler::MapRef map = constant->map(broker());
+ if (map.is_stable()) {
+ broker()->dependencies()->DependOnStableMap(map);
+ ValueNode* map_proto = GetConstant(map.prototype(broker()));
+ StoreRegister(iterator_.GetRegisterOperand(0), map_proto);
+ return;
+ }
}
+ ValueNode* map =
+ AddNewNode<LoadTaggedField>({active_function}, HeapObject::kMapOffset);
+ ValueNode* map_proto = AddNewNode<LoadTaggedField>({map}, Map::kPrototypeOffset);
StoreRegister(iterator_.GetRegisterOperand(0), map_proto);
}
diff --git a/chromium/v8/src/runtime/runtime-wasm.cc b/chromium/v8/src/runtime/runtime-wasm.cc
index 34851fe10da..6d4d445bc60 100644
--- src/3rdparty/chromium/v8/src/runtime/runtime-wasm.cc
+++ src/3rdparty/chromium/v8/src/runtime/runtime-wasm.cc
@@ -468,7 +468,16 @@ RUNTIME_FUNCTION(Runtime_TierUpWasmToJSWrapper) {
isolate);
if (IsTuple2(*origin)) {
Handle<Tuple2> tuple = Handle<Tuple2>::cast(origin);
- instance = handle(WasmInstanceObject::cast(tuple->value1()), isolate);
+ Handle<WasmInstanceObject> call_origin_instance(handle(WasmInstanceObject::cast(tuple->value1()), isolate));
+ if (call_origin_instance->module() != instance->module()) {
+ for (wasm::ValueType type : sig.all()) {
+ if (type.has_index()) {
+ ref->set_wrapper_budget(Smi::kMaxValue);
+ return ReadOnlyRoots(isolate).undefined_value();
+ }
+ }
+ }
+ instance = call_origin_instance;
origin = handle(tuple->value2(), isolate);
}
diff --git a/chromium/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h b/chromium/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
index 46a756bbae2..1d4fc72fe50 100644
--- src/3rdparty/chromium/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
+++ src/3rdparty/chromium/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
@@ -66,7 +66,7 @@ inline Operand GetMemOp(LiftoffAssembler* assm, Register addr,
: Operand(addr, offset_reg, scale_factor, offset_imm32);
}
// Offset immediate does not fit in 31 bits.
- Register scratch = kScratchRegister;
+ Register scratch = kScratchRegister2;
assm->MacroAssembler::Move(scratch, offset_imm);
if (offset_reg != no_reg) assm->addq(scratch, offset_reg);
return Operand(addr, scratch, scale_factor, 0);
diff --git a/chromium/v8/src/wasm/streaming-decoder.cc b/chromium/v8/src/wasm/streaming-decoder.cc
index 786c5aa250f..9eb2d2fb9f1 100644
--- src/3rdparty/chromium/v8/src/wasm/streaming-decoder.cc
+++ src/3rdparty/chromium/v8/src/wasm/streaming-decoder.cc
@@ -294,6 +294,10 @@ void AsyncStreamingDecoder::Finish(bool can_use_compiled_module) {
if (!full_wire_bytes_.back().empty()) {
size_t total_length = 0;
for (auto& bytes : full_wire_bytes_) total_length += bytes.size();
+ if (ok()) {
+ // {DecodeSectionLength} enforces this with graceful error reporting.
+ CHECK_LE(total_length, max_module_size());
+ }
auto all_bytes = base::OwnedVector<uint8_t>::NewForOverwrite(total_length);
uint8_t* ptr = all_bytes.begin();
for (auto& bytes : full_wire_bytes_) {
@@ -627,6 +631,18 @@ std::unique_ptr<AsyncStreamingDecoder::DecodingState>
AsyncStreamingDecoder::DecodeSectionLength::NextWithValue(
AsyncStreamingDecoder* streaming) {
TRACE_STREAMING("DecodeSectionLength(%zu)\n", value_);
+ // Check if this section fits into the overall module length limit.
+ // Note: {this->module_offset_} is the position of the section ID byte,
+ // {streaming->module_offset_} is the start of the section's payload (i.e.
+ // right after the just-decoded section length varint).
+ // The latter can already exceed the max module size, when the previous
+ // section barely fit into it, and this new section's ID or length crossed
+ // the threshold.
+ uint32_t payload_start = streaming->module_offset();
+ size_t max_size = max_module_size();
+ if (payload_start > max_size || max_size - payload_start < value_) {
+ return streaming->ToErrorState();
+ }
SectionBuffer* buf =
streaming->CreateNewBuffer(module_offset_, section_id_, value_,
buffer().SubVector(0, bytes_consumed_));
diff --git a/chromium/v8/src/wasm/wasm-engine.cc b/chromium/v8/src/wasm/wasm-engine.cc
index 688a0741cb6..6898538c9e4 100644
--- src/3rdparty/chromium/v8/src/wasm/wasm-engine.cc
+++ src/3rdparty/chromium/v8/src/wasm/wasm-engine.cc
@@ -1855,10 +1855,11 @@ uint32_t max_table_init_entries() {
// {max_module_size} is declared in wasm-limits.h.
size_t max_module_size() {
- // Clamp the value of --wasm-max-module-size between 16 and just below 2GB.
+ // Clamp the value of --wasm-max-module-size between 16 and the maximum
+ // that the implementation supports.
constexpr size_t kMin = 16;
- constexpr size_t kMax = RoundDown<kSystemPointerSize>(size_t{kMaxInt});
- static_assert(kMin <= kV8MaxWasmModuleSize && kV8MaxWasmModuleSize <= kMax);
+ constexpr size_t kMax = kV8MaxWasmModuleSize;
+ static_assert(kMin <= kV8MaxWasmModuleSize);
return std::clamp(v8_flags.wasm_max_module_size.value(), kMin, kMax);
}
diff --git a/chromium/v8/src/wasm/wasm-js.cc b/chromium/v8/src/wasm/wasm-js.cc
index 8710727207a..5e2427cde30 100644
--- src/3rdparty/chromium/v8/src/wasm/wasm-js.cc
+++ src/3rdparty/chromium/v8/src/wasm/wasm-js.cc
@@ -189,8 +189,8 @@ GET_FIRST_ARGUMENT_AS(Tag)
#undef GET_FIRST_ARGUMENT_AS
i::wasm::ModuleWireBytes GetFirstArgumentAsBytes(
- const v8::FunctionCallbackInfo<v8::Value>& info, ErrorThrower* thrower,
- bool* is_shared) {
+ const v8::FunctionCallbackInfo<v8::Value>& info, size_t max_length,
+ ErrorThrower* thrower, bool* is_shared) {
DCHECK(i::ValidateCallbackInfo(info));
const uint8_t* start = nullptr;
size_t length = 0;
@@ -221,7 +221,6 @@ i::wasm::ModuleWireBytes GetFirstArgumentAsBytes(
if (length == 0) {
thrower->CompileError("BufferSource argument is empty");
}
- size_t max_length = i::wasm::max_module_size();
if (length > max_length) {
// The spec requires a CompileError for implementation-defined limits, see
// https://webassembly.github.io/spec/js-api/index.html#limits.
@@ -534,7 +533,8 @@ void WebAssemblyCompile(const v8::FunctionCallbackInfo<v8::Value>& info) {
new AsyncCompilationResolver(isolate, context, promise_resolver));
bool is_shared = false;
- auto bytes = GetFirstArgumentAsBytes(info, &thrower, &is_shared);
+ auto bytes = GetFirstArgumentAsBytes(info, i::wasm::max_module_size(),
+ &thrower, &is_shared);
if (thrower.error()) {
resolver->OnCompilationFailed(thrower.Reify());
return;
@@ -559,8 +559,11 @@ void WasmStreamingCallbackForTesting(
v8::WasmStreaming::Unpack(info.GetIsolate(), info.Data());
bool is_shared = false;
+ // We don't check the buffer length up front, to allow d8 to test that the
+ // streaming decoder implementation handles overly large inputs correctly.
+ size_t unlimited = std::numeric_limits<size_t>::max();
i::wasm::ModuleWireBytes bytes =
- GetFirstArgumentAsBytes(info, &thrower, &is_shared);
+ GetFirstArgumentAsBytes(info, unlimited, &thrower, &is_shared);
if (thrower.error()) {
streaming->Abort(Utils::ToLocal(thrower.Reify()));
return;
@@ -653,7 +656,8 @@ void WebAssemblyValidate(const v8::FunctionCallbackInfo<v8::Value>& info) {
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.validate()");
bool is_shared = false;
- auto bytes = GetFirstArgumentAsBytes(info, &thrower, &is_shared);
+ auto bytes = GetFirstArgumentAsBytes(info, i::wasm::max_module_size(),
+ &thrower, &is_shared);
v8::ReturnValue<v8::Value> return_value = info.GetReturnValue();
@@ -725,7 +729,8 @@ void WebAssemblyModule(const v8::FunctionCallbackInfo<v8::Value>& info) {
}
bool is_shared = false;
- auto bytes = GetFirstArgumentAsBytes(info, &thrower, &is_shared);
+ auto bytes = GetFirstArgumentAsBytes(info, i::wasm::max_module_size(),
+ &thrower, &is_shared);
if (thrower.error()) {
return;
@@ -1023,7 +1028,8 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& info) {
}
bool is_shared = false;
- auto bytes = GetFirstArgumentAsBytes(info, &thrower, &is_shared);
+ auto bytes = GetFirstArgumentAsBytes(info, i::wasm::max_module_size(),
+ &thrower, &is_shared);
if (thrower.error()) {
resolver->OnInstantiationFailed(thrower.Reify());
return;
@@ -1155,9 +1161,10 @@ i::Handle<i::Object> DefaultReferenceValue(i::Isolate* isolate,
DCHECK(type.is_object_reference());
// Use undefined for JS type (externref) but null for wasm types as wasm does
// not know undefined.
- if (type.heap_representation() == i::wasm::HeapType::kExtern ||
- type.heap_representation() == i::wasm::HeapType::kNoExtern) {
+ if (type.heap_representation() == i::wasm::HeapType::kExtern) {
return isolate->factory()->undefined_value();
+ } else if (type.heap_representation() == i::wasm::HeapType::kNoExtern) {
+ return isolate->factory()->null_value();
}
return isolate->factory()->wasm_null();
}
diff --git a/chromium/v8/src/wasm/wasm-objects.cc b/chromium/v8/src/wasm/wasm-objects.cc
index 4c5050a56b8..5698a8f49de 100644
--- src/3rdparty/chromium/v8/src/wasm/wasm-objects.cc
+++ src/3rdparty/chromium/v8/src/wasm/wasm-objects.cc
@@ -1850,8 +1850,8 @@ Handle<WasmTagObject> WasmTagObject::New(Isolate* isolate,
}
bool WasmTagObject::MatchesSignature(uint32_t expected_canonical_type_index) {
- return wasm::GetWasmEngine()->type_canonicalizer()->IsCanonicalSubtype(
- this->canonical_type_index(), expected_canonical_type_index);
+ return static_cast<uint32_t>(this->canonical_type_index()) ==
+ expected_canonical_type_index;
}
const wasm::FunctionSig* WasmCapiFunction::GetSignature(Zone* zone) const {