mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
fe551e4054 | ||
|
20e2617051 | ||
|
89c902b54d | ||
|
099901c122 | ||
|
28ba5c8f73 | ||
|
622afbdebc | ||
|
147b5f5532 | ||
|
4bd7c35c62 | ||
|
d4b095e68b | ||
|
23f5569e69 | ||
|
ad0b71aa5f | ||
|
7a2ffe562f | ||
|
4a28bcd532 | ||
|
7f52c30723 | ||
|
c56de64d6b | ||
|
b72460bbe3 | ||
|
f984bb3127 | ||
|
30e2decbac |
@@ -7,5 +7,6 @@
|
||||
# https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
|
||||
|
||||
{
|
||||
'chromium_checkout': 'refs/tags/96.0.4664.0'
|
||||
'chromium_checkout': 'refs/tags/96.0.4664.110',
|
||||
'depot_tools_checkout': 'e023d44820'
|
||||
}
|
||||
|
@@ -12,7 +12,7 @@
|
||||
# distribution include:
|
||||
#
|
||||
# Linux: Ninja, GCC 7.5.0+, Unix Makefiles
|
||||
# MacOS: Ninja, Xcode 12.2 to 12.5
|
||||
# MacOS: Ninja, Xcode 12.2 to 13.0
|
||||
# Windows: Ninja, Visual Studio 2019+
|
||||
#
|
||||
# Ninja is a cross-platform open-source tool for running fast builds using
|
||||
@@ -36,7 +36,7 @@
|
||||
#
|
||||
# The below requirements must be met to build this CEF binary distribution.
|
||||
#
|
||||
# - CMake version 2.8.12.1 or newer.
|
||||
# - CMake version 3.19 or newer.
|
||||
#
|
||||
# - Linux requirements:
|
||||
# Currently supported distributions include Debian 10 (Buster), Ubuntu 18
|
||||
@@ -48,7 +48,7 @@
|
||||
# libgtk3.0-dev (required by the cefclient target only)
|
||||
#
|
||||
# - MacOS requirements:
|
||||
# Xcode 12.2 to 12.5 building on MacOS 10.15.4 (Catalina) or newer. Only
|
||||
# Xcode 12.2 to 13.0 building on MacOS 10.15.4 (Catalina) or newer. Only
|
||||
# 64-bit builds are supported. The Xcode command-line tools must also be
|
||||
# installed. Newer Xcode versions may not have been been tested and are not
|
||||
# recommended.
|
||||
@@ -132,7 +132,8 @@
|
||||
# Global setup.
|
||||
#
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.12.1)
|
||||
# For VS2019 and Xcode 12+ support.
|
||||
cmake_minimum_required(VERSION 3.19)
|
||||
|
||||
# Only generate Debug and Release configuration types.
|
||||
set(CMAKE_CONFIGURATION_TYPES Debug Release)
|
||||
|
@@ -534,7 +534,8 @@ void CefDevToolsFrontend::HandleMessageFromDevToolsFrontend(
|
||||
const std::string* url = params[0].GetIfString();
|
||||
const std::string* content = params[1].GetIfString();
|
||||
if (!url || !content)
|
||||
return file_manager_.AppendToFile(*url, *content);
|
||||
return;
|
||||
file_manager_.AppendToFile(*url, *content);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
@@ -406,19 +406,24 @@ class CefBrowserURLRequest::Context
|
||||
DCHECK(CalledOnValidThread());
|
||||
DCHECK_EQ(status_, UR_IO_PENDING);
|
||||
|
||||
response_->SetReadOnly(false);
|
||||
response_->SetResponseHeaders(*headers);
|
||||
response_->SetReadOnly(true);
|
||||
|
||||
// Match the previous behavior of sending download progress notifications
|
||||
// for UR_FLAG_NO_DOWNLOAD_DATA requests but not HEAD requests.
|
||||
if (request_->GetMethod().ToString() != "HEAD") {
|
||||
download_data_size_ = headers->GetContentLength();
|
||||
OnDownloadProgress(0);
|
||||
}
|
||||
|
||||
cleanup_immediately_ = true;
|
||||
OnComplete(true);
|
||||
|
||||
if (headers) {
|
||||
response_->SetReadOnly(false);
|
||||
response_->SetResponseHeaders(*headers);
|
||||
response_->SetReadOnly(true);
|
||||
|
||||
// Match the previous behavior of sending download progress notifications
|
||||
// for UR_FLAG_NO_DOWNLOAD_DATA requests but not HEAD requests.
|
||||
if (request_->GetMethod().ToString() != "HEAD") {
|
||||
download_data_size_ = headers->GetContentLength();
|
||||
OnDownloadProgress(0);
|
||||
}
|
||||
|
||||
OnComplete(true);
|
||||
} else {
|
||||
OnComplete(false);
|
||||
}
|
||||
}
|
||||
|
||||
void OnRedirect(const net::RedirectInfo& redirect_info,
|
||||
|
@@ -158,13 +158,13 @@ class CorsPreflightRequest : public network::mojom::TrustedHeaderClient {
|
||||
// mojom::TrustedHeaderClient methods:
|
||||
void OnBeforeSendHeaders(const net::HttpRequestHeaders& headers,
|
||||
OnBeforeSendHeadersCallback callback) override {
|
||||
std::move(callback).Run(net::OK, absl::nullopt);
|
||||
std::move(callback).Run(net::OK, headers);
|
||||
}
|
||||
|
||||
void OnHeadersReceived(const std::string& headers,
|
||||
const net::IPEndPoint& remote_endpoint,
|
||||
OnHeadersReceivedCallback callback) override {
|
||||
std::move(callback).Run(net::OK, absl::nullopt, GURL());
|
||||
std::move(callback).Run(net::OK, headers, /*redirect_url=*/GURL());
|
||||
OnDestroy();
|
||||
}
|
||||
|
||||
|
@@ -910,7 +910,10 @@ void CefRenderWidgetHostViewOSR::DidNavigate() {
|
||||
|
||||
void CefRenderWidgetHostViewOSR::OnFrameComplete(
|
||||
const viz::BeginFrameAck& ack) {
|
||||
// TODO(cef): is there something we need to track with this notification?
|
||||
DCHECK(begin_frame_pending_);
|
||||
DCHECK_EQ(begin_frame_source_.source_id(), ack.frame_id.source_id);
|
||||
DCHECK_EQ(begin_frame_number_, ack.frame_id.sequence_number);
|
||||
begin_frame_pending_ = false;
|
||||
}
|
||||
|
||||
void CefRenderWidgetHostViewOSR::OnRenderFrameMetadataChangedAfterActivation(
|
||||
@@ -1047,17 +1050,20 @@ void CefRenderWidgetHostViewOSR::Invalidate(
|
||||
void CefRenderWidgetHostViewOSR::SendExternalBeginFrame() {
|
||||
DCHECK(external_begin_frame_enabled_);
|
||||
|
||||
if (begin_frame_pending_)
|
||||
return;
|
||||
begin_frame_pending_ = true;
|
||||
|
||||
base::TimeTicks frame_time = base::TimeTicks::Now();
|
||||
base::TimeTicks deadline = base::TimeTicks();
|
||||
base::TimeDelta interval = viz::BeginFrameArgs::DefaultInterval();
|
||||
|
||||
viz::BeginFrameArgs begin_frame_args = viz::BeginFrameArgs::Create(
|
||||
BEGINFRAME_FROM_HERE, begin_frame_source_.source_id(),
|
||||
begin_frame_number_, frame_time, deadline, interval,
|
||||
++begin_frame_number_, frame_time, deadline, interval,
|
||||
viz::BeginFrameArgs::NORMAL);
|
||||
|
||||
DCHECK(begin_frame_args.IsValid());
|
||||
begin_frame_number_++;
|
||||
|
||||
if (render_widget_host_)
|
||||
render_widget_host_->ProgressFlingIfNeeded(frame_time);
|
||||
@@ -1067,6 +1073,8 @@ void CefRenderWidgetHostViewOSR::SendExternalBeginFrame() {
|
||||
begin_frame_args, /* force= */ true,
|
||||
base::BindOnce(&CefRenderWidgetHostViewOSR::OnFrameComplete,
|
||||
weak_ptr_factory_.GetWeakPtr()));
|
||||
} else {
|
||||
begin_frame_pending_ = false;
|
||||
}
|
||||
|
||||
if (!IsPopupWidget() && popup_host_view_) {
|
||||
|
@@ -355,6 +355,7 @@ class CefRenderWidgetHostViewOSR
|
||||
// Provides |source_id| for BeginFrameArgs that we create.
|
||||
viz::StubBeginFrameSource begin_frame_source_;
|
||||
uint64_t begin_frame_number_ = viz::BeginFrameArgs::kStartingFrameNumber;
|
||||
bool begin_frame_pending_ = false;
|
||||
|
||||
bool sync_frame_rate_ = false;
|
||||
bool external_begin_frame_enabled_ = false;
|
||||
|
@@ -89,7 +89,7 @@ class CefCToCppRefCounted : public BaseName {
|
||||
bool UnderlyingHasAtLeastOneRef() const {
|
||||
cef_base_ref_counted_t* base =
|
||||
reinterpret_cast<cef_base_ref_counted_t*>(GetStruct());
|
||||
if (!base->has_one_ref)
|
||||
if (!base->has_at_least_one_ref)
|
||||
return false;
|
||||
return base->has_at_least_one_ref(base) ? true : false;
|
||||
}
|
||||
|
@@ -538,6 +538,12 @@ patches = [
|
||||
# https://bitbucket.org/chromiumembedded/cef/issues/2969
|
||||
'name': 'chrome_browser_background_mode_1100085',
|
||||
},
|
||||
{
|
||||
# Windows: Fix cef_sandbox compile error due to missing include.
|
||||
# https://bugs.chromium.org/p/chromium/issues/detail?id=1049498#c14
|
||||
# https://chromium-review.googlesource.com/c/chromium/src/+/3238990/
|
||||
'name': 'base_string_piece_1049498',
|
||||
},
|
||||
{
|
||||
# Linux: Fix ATK assertion error when generating ARM build config.
|
||||
# https://bugs.chromium.org/p/chromium/issues/detail?id=1123214
|
||||
@@ -553,5 +559,10 @@ patches = [
|
||||
# declared with 'nodiscard' attribute [-Werror,-Wunused-result]
|
||||
# https://chromium-review.googlesource.com/c/chromium/src/+/3237648
|
||||
'name': 'base_thread_restrictions_3237648',
|
||||
},
|
||||
{
|
||||
# Windows: Fix crash when |sandbox_info| parameter is nullptr.
|
||||
# https://bitbucket.org/chromiumembedded/cef/issues/3210
|
||||
'name': 'win_sandbox_3210',
|
||||
}
|
||||
]
|
||||
|
12
patch/patches/base_string_piece_1049498.patch
Normal file
12
patch/patches/base_string_piece_1049498.patch
Normal file
@@ -0,0 +1,12 @@
|
||||
diff --git base/strings/string_piece.h base/strings/string_piece.h
|
||||
index 5ceb3a40eb01b..89476bfa41e9b 100644
|
||||
--- base/strings/string_piece.h
|
||||
+++ base/strings/string_piece.h
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
+#include <algorithm>
|
||||
#include <iosfwd>
|
||||
#include <limits>
|
||||
#include <string>
|
@@ -1,8 +1,8 @@
|
||||
diff --git content/browser/scheduler/browser_task_executor.cc content/browser/scheduler/browser_task_executor.cc
|
||||
index 3d56ff6e97575..1af9338f883fb 100644
|
||||
index 0cf2b0daa0a56..3778e8e7a7711 100644
|
||||
--- content/browser/scheduler/browser_task_executor.cc
|
||||
+++ content/browser/scheduler/browser_task_executor.cc
|
||||
@@ -285,7 +285,7 @@ BrowserTaskExecutor::OnUserInputStart() {
|
||||
@@ -315,7 +315,7 @@ BrowserTaskExecutor::OnUserInputStart() {
|
||||
|
||||
// static
|
||||
void BrowserTaskExecutor::Shutdown() {
|
||||
|
@@ -20,10 +20,10 @@ index 4801a199a29d3..11a1d3b328142 100644
|
||||
|
||||
// TODO(wjmaclean): We should update the ProcessLock comparison API
|
||||
diff --git content/browser/renderer_host/navigation_request.cc content/browser/renderer_host/navigation_request.cc
|
||||
index 50bdac2c30caa..2546c845e756a 100644
|
||||
index 73aff501bf401..1ed61b3e455f2 100644
|
||||
--- content/browser/renderer_host/navigation_request.cc
|
||||
+++ content/browser/renderer_host/navigation_request.cc
|
||||
@@ -5737,6 +5737,12 @@ NavigationRequest::GetOriginForURLLoaderFactoryWithoutFinalFrameHost(
|
||||
@@ -5769,6 +5769,12 @@ NavigationRequest::GetOriginForURLLoaderFactoryWithoutFinalFrameHost(
|
||||
network::mojom::WebSandboxFlags sandbox_flags) {
|
||||
// Calculate an approximation of the origin. The sandbox/csp are ignored.
|
||||
url::Origin origin = GetOriginForURLLoaderFactoryUnchecked(this);
|
||||
@@ -36,7 +36,7 @@ index 50bdac2c30caa..2546c845e756a 100644
|
||||
|
||||
// Apply sandbox flags.
|
||||
// See https://html.spec.whatwg.org/#sandboxed-origin-browsing-context-flag
|
||||
@@ -5770,6 +5776,15 @@ NavigationRequest::GetOriginForURLLoaderFactoryWithFinalFrameHost() {
|
||||
@@ -5802,6 +5808,15 @@ NavigationRequest::GetOriginForURLLoaderFactoryWithFinalFrameHost() {
|
||||
if (IsSameDocument() || IsPageActivation())
|
||||
return GetRenderFrameHost()->GetLastCommittedOrigin();
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
diff --git chrome/browser/BUILD.gn chrome/browser/BUILD.gn
|
||||
index 1f848e0760118..29bfa6e602430 100644
|
||||
index 9572c236c2db5..60c0a8838cfe4 100644
|
||||
--- chrome/browser/BUILD.gn
|
||||
+++ chrome/browser/BUILD.gn
|
||||
@@ -13,6 +13,7 @@ import("//build/config/features.gni")
|
||||
|
@@ -1,8 +1,8 @@
|
||||
diff --git chrome/browser/renderer_context_menu/render_view_context_menu.cc chrome/browser/renderer_context_menu/render_view_context_menu.cc
|
||||
index fa211d7a0d997..cea251366f5d9 100644
|
||||
index 901a0baaca6cf..ca05eefd2232b 100644
|
||||
--- chrome/browser/renderer_context_menu/render_view_context_menu.cc
|
||||
+++ chrome/browser/renderer_context_menu/render_view_context_menu.cc
|
||||
@@ -278,6 +278,13 @@ base::OnceCallback<void(RenderViewContextMenu*)>* GetMenuShownCallback() {
|
||||
@@ -283,6 +283,13 @@ base::OnceCallback<void(RenderViewContextMenu*)>* GetMenuShownCallback() {
|
||||
return callback.get();
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ index fa211d7a0d997..cea251366f5d9 100644
|
||||
enum class UmaEnumIdLookupType {
|
||||
GeneralEnumId,
|
||||
ContextSpecificEnumId,
|
||||
@@ -491,6 +498,10 @@ int FindUMAEnumValueForCommand(int id, UmaEnumIdLookupType type) {
|
||||
@@ -496,6 +503,10 @@ int FindUMAEnumValueForCommand(int id, UmaEnumIdLookupType type) {
|
||||
if (ContextMenuMatcher::IsExtensionsCustomCommandId(id))
|
||||
return 1;
|
||||
|
||||
@@ -27,7 +27,7 @@ index fa211d7a0d997..cea251366f5d9 100644
|
||||
id = CollapseCommandsForUMA(id);
|
||||
const auto& map = GetIdcToUmaMap(type);
|
||||
auto it = map.find(id);
|
||||
@@ -673,6 +684,14 @@ RenderViewContextMenu::RenderViewContextMenu(
|
||||
@@ -678,6 +689,14 @@ RenderViewContextMenu::RenderViewContextMenu(
|
||||
system_app_ = GetBrowser() && GetBrowser()->app_controller()
|
||||
? GetBrowser()->app_controller()->system_app()
|
||||
: nullptr;
|
||||
@@ -42,7 +42,7 @@ index fa211d7a0d997..cea251366f5d9 100644
|
||||
}
|
||||
|
||||
RenderViewContextMenu::~RenderViewContextMenu() = default;
|
||||
@@ -1031,6 +1050,12 @@ void RenderViewContextMenu::InitMenu() {
|
||||
@@ -1036,6 +1055,12 @@ void RenderViewContextMenu::InitMenu() {
|
||||
// menu, meaning that each menu item added/removed in this function will cause
|
||||
// it to visibly jump on the screen (see b/173569669).
|
||||
AppendQuickAnswersItems();
|
||||
@@ -55,7 +55,7 @@ index fa211d7a0d997..cea251366f5d9 100644
|
||||
}
|
||||
|
||||
Profile* RenderViewContextMenu::GetProfile() const {
|
||||
@@ -2849,6 +2874,12 @@ void RenderViewContextMenu::RegisterMenuShownCallbackForTesting(
|
||||
@@ -2860,6 +2885,12 @@ void RenderViewContextMenu::RegisterMenuShownCallbackForTesting(
|
||||
*GetMenuShownCallback() = std::move(cb);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
diff --git chrome/browser/ui/BUILD.gn chrome/browser/ui/BUILD.gn
|
||||
index e9a748c91f743..1b4cc72352e67 100644
|
||||
index 7a4cce3c457b4..7a62dbaff65fa 100644
|
||||
--- chrome/browser/ui/BUILD.gn
|
||||
+++ chrome/browser/ui/BUILD.gn
|
||||
@@ -11,6 +11,7 @@ import("//build/config/features.gni")
|
||||
@@ -10,7 +10,7 @@ index e9a748c91f743..1b4cc72352e67 100644
|
||||
import("//chrome/browser/buildflags.gni")
|
||||
import("//chrome/common/features.gni")
|
||||
import("//chromeos/assistant/assistant.gni")
|
||||
@@ -357,6 +358,10 @@ static_library("ui") {
|
||||
@@ -365,6 +366,10 @@ static_library("ui") {
|
||||
"//build/config/compiler:wexit_time_destructors",
|
||||
]
|
||||
|
||||
@@ -21,7 +21,7 @@ index e9a748c91f743..1b4cc72352e67 100644
|
||||
# Since browser and browser_ui actually depend on each other,
|
||||
# we must omit the dependency from browser_ui to browser.
|
||||
# However, this means browser_ui and browser should more or less
|
||||
@@ -379,6 +384,7 @@ static_library("ui") {
|
||||
@@ -387,6 +392,7 @@ static_library("ui") {
|
||||
"//build:branding_buildflags",
|
||||
"//build:chromeos_buildflags",
|
||||
"//cc/paint",
|
||||
@@ -29,7 +29,7 @@ index e9a748c91f743..1b4cc72352e67 100644
|
||||
"//chrome:extra_resources",
|
||||
"//chrome:resources",
|
||||
"//chrome:strings",
|
||||
@@ -5053,6 +5059,7 @@ static_library("ui") {
|
||||
@@ -5056,6 +5062,7 @@ static_library("ui") {
|
||||
if (enable_basic_printing) {
|
||||
deps += [
|
||||
"//components/printing/browser",
|
||||
|
@@ -186,10 +186,10 @@ index 8c2547056ec26..2ab3252dca708 100644
|
||||
// that the X-Frame-Options protection mechanism is set to either DENY or
|
||||
// SAMEORIGIN.
|
||||
diff --git chrome/renderer/chrome_content_renderer_client.cc chrome/renderer/chrome_content_renderer_client.cc
|
||||
index 5ff5939031672..01742ddfef449 100644
|
||||
index b1753145c4c82..cb01f2e43b7fe 100644
|
||||
--- chrome/renderer/chrome_content_renderer_client.cc
|
||||
+++ chrome/renderer/chrome_content_renderer_client.cc
|
||||
@@ -943,6 +943,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
@@ -946,6 +946,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
|
||||
if ((status == chrome::mojom::PluginStatus::kUnauthorized ||
|
||||
status == chrome::mojom::PluginStatus::kBlocked) &&
|
||||
@@ -197,7 +197,7 @@ index 5ff5939031672..01742ddfef449 100644
|
||||
content_settings_agent_delegate->IsPluginTemporarilyAllowed(
|
||||
identifier)) {
|
||||
status = chrome::mojom::PluginStatus::kAllowed;
|
||||
@@ -1144,7 +1145,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
@@ -1147,7 +1148,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
render_frame->GetRemoteAssociatedInterfaces()->GetInterface(
|
||||
plugin_auth_host.BindNewEndpointAndPassReceiver());
|
||||
plugin_auth_host->BlockedUnauthorizedPlugin(group_name, identifier);
|
||||
@@ -207,7 +207,7 @@ index 5ff5939031672..01742ddfef449 100644
|
||||
break;
|
||||
}
|
||||
case chrome::mojom::PluginStatus::kBlocked: {
|
||||
@@ -1153,7 +1155,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
@@ -1156,7 +1158,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, group_name));
|
||||
placeholder->AllowLoading();
|
||||
RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Blocked"));
|
||||
@@ -217,7 +217,7 @@ index 5ff5939031672..01742ddfef449 100644
|
||||
break;
|
||||
}
|
||||
case chrome::mojom::PluginStatus::kBlockedByPolicy: {
|
||||
@@ -1163,7 +1166,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
@@ -1166,7 +1169,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
group_name));
|
||||
RenderThread::Get()->RecordAction(
|
||||
UserMetricsAction("Plugin_BlockedByPolicy"));
|
||||
@@ -227,7 +227,7 @@ index 5ff5939031672..01742ddfef449 100644
|
||||
break;
|
||||
}
|
||||
case chrome::mojom::PluginStatus::kBlockedNoLoading: {
|
||||
@@ -1171,7 +1175,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
@@ -1174,7 +1178,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
IDR_BLOCKED_PLUGIN_HTML,
|
||||
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED_NO_LOADING,
|
||||
group_name));
|
||||
|
@@ -1,5 +1,5 @@
|
||||
diff --git chrome/renderer/BUILD.gn chrome/renderer/BUILD.gn
|
||||
index 0d6bbf294add1..8b438ff31e2a6 100644
|
||||
index 7886a0d86b243..6e5d0f6d26f88 100644
|
||||
--- chrome/renderer/BUILD.gn
|
||||
+++ chrome/renderer/BUILD.gn
|
||||
@@ -5,6 +5,7 @@
|
||||
|
@@ -211,7 +211,7 @@ index 0c8939e57e814..25c0a2acff7dd 100644
|
||||
bool in_memory,
|
||||
const base::FilePath& relative_partition_path,
|
||||
diff --git chrome/browser/prefs/browser_prefs.cc chrome/browser/prefs/browser_prefs.cc
|
||||
index d5ed8faa24cfb..a30a0eed11278 100644
|
||||
index 77e924414c443..4bc52e14a9722 100644
|
||||
--- chrome/browser/prefs/browser_prefs.cc
|
||||
+++ chrome/browser/prefs/browser_prefs.cc
|
||||
@@ -11,6 +11,7 @@
|
||||
@@ -222,7 +222,7 @@ index d5ed8faa24cfb..a30a0eed11278 100644
|
||||
#include "chrome/browser/about_flags.h"
|
||||
#include "chrome/browser/accessibility/accessibility_labels_service.h"
|
||||
#include "chrome/browser/accessibility/accessibility_ui.h"
|
||||
@@ -167,6 +168,10 @@
|
||||
@@ -168,6 +169,10 @@
|
||||
#include "chrome/browser/background/background_mode_manager.h"
|
||||
#endif
|
||||
|
||||
@@ -233,7 +233,7 @@ index d5ed8faa24cfb..a30a0eed11278 100644
|
||||
#if BUILDFLAG(ENABLE_EXTENSIONS)
|
||||
#include "chrome/browser/accessibility/animation_policy_prefs.h"
|
||||
#include "chrome/browser/apps/platform_apps/shortcut_manager.h"
|
||||
@@ -1195,6 +1200,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
|
||||
@@ -1197,6 +1202,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
|
||||
SessionDataService::RegisterProfilePrefs(registry);
|
||||
#endif
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
diff --git chrome/browser/ui/browser_command_controller.cc chrome/browser/ui/browser_command_controller.cc
|
||||
index 12c161774914c..c681383e3a947 100644
|
||||
index 648ddac00186a..cbf25d45ddeef 100644
|
||||
--- chrome/browser/ui/browser_command_controller.cc
|
||||
+++ chrome/browser/ui/browser_command_controller.cc
|
||||
@@ -351,8 +351,10 @@ bool BrowserCommandController::ExecuteCommandWithDisposition(
|
||||
@@ -377,10 +377,10 @@ index 140c0df49ea46..7d4ac470dcc9a 100644
|
||||
}
|
||||
|
||||
diff --git chrome/browser/ui/views/toolbar/toolbar_view.cc chrome/browser/ui/views/toolbar/toolbar_view.cc
|
||||
index 31e062d75daeb..c6d700e702e56 100644
|
||||
index f887f0fd2db37..5b9a7fa0d2ee6 100644
|
||||
--- chrome/browser/ui/views/toolbar/toolbar_view.cc
|
||||
+++ chrome/browser/ui/views/toolbar/toolbar_view.cc
|
||||
@@ -167,12 +167,13 @@ auto& GetViewCommandMap() {
|
||||
@@ -166,12 +166,13 @@ auto& GetViewCommandMap() {
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ToolbarView, public:
|
||||
|
||||
@@ -396,7 +396,7 @@ index 31e062d75daeb..c6d700e702e56 100644
|
||||
SetID(VIEW_ID_TOOLBAR);
|
||||
|
||||
UpgradeDetector::GetInstance()->AddObserver(this);
|
||||
@@ -207,7 +208,7 @@ void ToolbarView::Init() {
|
||||
@@ -206,7 +207,7 @@ void ToolbarView::Init() {
|
||||
#endif
|
||||
auto location_bar = std::make_unique<LocationBarView>(
|
||||
browser_, browser_->profile(), browser_->command_controller(), this,
|
||||
|
@@ -1,8 +1,8 @@
|
||||
diff --git content/browser/devtools/devtools_instrumentation.h content/browser/devtools/devtools_instrumentation.h
|
||||
index 6aa16d20faa3b..5c4fd217ae936 100644
|
||||
index a46c99b6230b4..dfcdb58449aac 100644
|
||||
--- content/browser/devtools/devtools_instrumentation.h
|
||||
+++ content/browser/devtools/devtools_instrumentation.h
|
||||
@@ -90,7 +90,7 @@ bool ApplyUserAgentMetadataOverrides(
|
||||
@@ -94,7 +94,7 @@ bool ApplyUserAgentMetadataOverrides(
|
||||
FrameTreeNode* frame_tree_node,
|
||||
absl::optional<blink::UserAgentMetadata>* override_out);
|
||||
|
||||
|
@@ -75,10 +75,10 @@ index 18b58f53a9df7..80452f68f24fb 100644
|
||||
GetContentClient()->browser()->GetUserAgent());
|
||||
version.SetString("V8-Version", V8_VERSION_STRING);
|
||||
diff --git content/browser/loader/navigation_url_loader_impl.cc content/browser/loader/navigation_url_loader_impl.cc
|
||||
index 06517d7afaaa2..e368b300c5e30 100644
|
||||
index 0cb9f2d42ed76..00cb95ee7702a 100644
|
||||
--- content/browser/loader/navigation_url_loader_impl.cc
|
||||
+++ content/browser/loader/navigation_url_loader_impl.cc
|
||||
@@ -670,6 +670,13 @@ NavigationURLLoaderImpl::PrepareForNonInterceptedRequest(
|
||||
@@ -677,6 +677,13 @@ NavigationURLLoaderImpl::PrepareForNonInterceptedRequest(
|
||||
resource_request_->has_user_gesture, initiating_origin,
|
||||
&loader_factory);
|
||||
|
||||
@@ -92,7 +92,7 @@ index 06517d7afaaa2..e368b300c5e30 100644
|
||||
if (loader_factory) {
|
||||
factory = base::MakeRefCounted<network::WrapperSharedURLLoaderFactory>(
|
||||
std::move(loader_factory));
|
||||
@@ -838,7 +845,7 @@ void NavigationURLLoaderImpl::CheckPluginAndContinueOnReceiveResponse(
|
||||
@@ -845,7 +852,7 @@ void NavigationURLLoaderImpl::CheckPluginAndContinueOnReceiveResponse(
|
||||
frame_tree_node->current_frame_host()->GetProcess()->GetID();
|
||||
int routing_id = frame_tree_node->current_frame_host()->GetRoutingID();
|
||||
bool has_plugin = PluginService::GetInstance()->GetPluginInfo(
|
||||
@@ -188,10 +188,10 @@ index 632ae86c6fd69..55b749ec12421 100644
|
||||
const std::vector<WebPluginInfo>& all_plugins);
|
||||
|
||||
diff --git content/browser/renderer_host/render_frame_host_impl.cc content/browser/renderer_host/render_frame_host_impl.cc
|
||||
index 6520b9b7e90aa..60af548b678cc 100644
|
||||
index 193bfd1abc5f9..e5480792fdf56 100644
|
||||
--- content/browser/renderer_host/render_frame_host_impl.cc
|
||||
+++ content/browser/renderer_host/render_frame_host_impl.cc
|
||||
@@ -12341,6 +12341,7 @@ void RenderFrameHostImpl::BindHungDetectorHost(
|
||||
@@ -12366,6 +12366,7 @@ void RenderFrameHostImpl::BindHungDetectorHost(
|
||||
}
|
||||
|
||||
void RenderFrameHostImpl::GetPluginInfo(const GURL& url,
|
||||
@@ -199,7 +199,7 @@ index 6520b9b7e90aa..60af548b678cc 100644
|
||||
const url::Origin& main_frame_origin,
|
||||
const std::string& mime_type,
|
||||
GetPluginInfoCallback callback) {
|
||||
@@ -12348,7 +12349,8 @@ void RenderFrameHostImpl::GetPluginInfo(const GURL& url,
|
||||
@@ -12373,7 +12374,8 @@ void RenderFrameHostImpl::GetPluginInfo(const GURL& url,
|
||||
WebPluginInfo info;
|
||||
std::string actual_mime_type;
|
||||
bool found = PluginServiceImpl::GetInstance()->GetPluginInfo(
|
||||
@@ -210,10 +210,10 @@ index 6520b9b7e90aa..60af548b678cc 100644
|
||||
std::move(callback).Run(found, info, actual_mime_type);
|
||||
}
|
||||
diff --git content/browser/renderer_host/render_frame_host_impl.h content/browser/renderer_host/render_frame_host_impl.h
|
||||
index 86666516a0131..c1e11fbfda6fb 100644
|
||||
index e324c9c06e4ee..8dd3f6f10ed6e 100644
|
||||
--- content/browser/renderer_host/render_frame_host_impl.h
|
||||
+++ content/browser/renderer_host/render_frame_host_impl.h
|
||||
@@ -2614,6 +2614,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
|
||||
@@ -2617,6 +2617,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
|
||||
int32_t plugin_child_id,
|
||||
const base::FilePath& path) override;
|
||||
void GetPluginInfo(const GURL& url,
|
||||
|
@@ -1,5 +1,5 @@
|
||||
diff --git components/embedder_support/user_agent_utils.cc components/embedder_support/user_agent_utils.cc
|
||||
index 516504c2ce442..60899c8e4f7bf 100644
|
||||
index da052d0533802..543057ccb86bf 100644
|
||||
--- components/embedder_support/user_agent_utils.cc
|
||||
+++ components/embedder_support/user_agent_utils.cc
|
||||
@@ -14,6 +14,7 @@
|
||||
|
@@ -46,3 +46,25 @@ index 016046d6caa4f..116e4919cda08 100644
|
||||
return false;
|
||||
|
||||
const char kGLESv2ANGLELibraryName[] = "libGLESv2.so";
|
||||
diff --git ui/ozone/common/egl_util.cc ui/ozone/common/egl_util.cc
|
||||
index e028d8cf8dec6..d172832589534 100644
|
||||
--- ui/ozone/common/egl_util.cc
|
||||
+++ ui/ozone/common/egl_util.cc
|
||||
@@ -158,7 +158,7 @@ bool LoadDefaultEGLGLES2Bindings(
|
||||
#if BUILDFLAG(ENABLE_SWIFTSHADER)
|
||||
base::FilePath module_path;
|
||||
#if !defined(OS_FUCHSIA)
|
||||
- if (!base::PathService::Get(base::DIR_MODULE, &module_path))
|
||||
+ if (!base::PathService::Get(base::DIR_ASSETS, &module_path))
|
||||
return false;
|
||||
module_path = module_path.Append(FILE_PATH_LITERAL("swiftshader/"));
|
||||
#endif
|
||||
@@ -171,7 +171,7 @@ bool LoadDefaultEGLGLES2Bindings(
|
||||
} else if (implementation.gl == gl::kGLImplementationEGLANGLE) {
|
||||
base::FilePath module_path;
|
||||
#if !defined(OS_FUCHSIA)
|
||||
- if (!base::PathService::Get(base::DIR_MODULE, &module_path))
|
||||
+ if (!base::PathService::Get(base::DIR_ASSETS, &module_path))
|
||||
return false;
|
||||
#endif
|
||||
|
||||
|
@@ -314,10 +314,10 @@ index b3a6eaa270877..aa4e84fea1387 100644
|
||||
base::FilePath GetSaveLocation() const;
|
||||
|
||||
diff --git chrome/browser/ui/webui/print_preview/print_preview_ui.cc chrome/browser/ui/webui/print_preview/print_preview_ui.cc
|
||||
index 7695cf2a3a2e2..887e047b83b72 100644
|
||||
index a72645a12ac07..bfe1e2dce3662 100644
|
||||
--- chrome/browser/ui/webui/print_preview/print_preview_ui.cc
|
||||
+++ chrome/browser/ui/webui/print_preview/print_preview_ui.cc
|
||||
@@ -29,6 +29,7 @@
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "base/values.h"
|
||||
#include "build/build_config.h"
|
||||
#include "build/chromeos_buildflags.h"
|
||||
@@ -325,7 +325,7 @@ index 7695cf2a3a2e2..887e047b83b72 100644
|
||||
#include "chrome/browser/browser_process.h"
|
||||
#include "chrome/browser/pdf/pdf_extension_util.h"
|
||||
#include "chrome/browser/printing/background_printing_manager.h"
|
||||
@@ -102,6 +103,13 @@ const char16_t kBasicPrintShortcut[] = u"\u0028\u21e7\u2318\u0050\u0029";
|
||||
@@ -98,6 +99,13 @@ const char16_t kBasicPrintShortcut[] = u"\u0028\u21e7\u2318\u0050\u0029";
|
||||
const char16_t kBasicPrintShortcut[] = u"(Ctrl+Shift+P)";
|
||||
#endif
|
||||
|
||||
@@ -339,7 +339,7 @@ index 7695cf2a3a2e2..887e047b83b72 100644
|
||||
constexpr char kInvalidArgsForDidStartPreview[] =
|
||||
"Invalid arguments for DidStartPreview";
|
||||
constexpr char kInvalidPageNumberForDidPreviewPage[] =
|
||||
@@ -391,7 +399,7 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
|
||||
@@ -344,7 +352,7 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
|
||||
chrome::kCloudPrintCertificateErrorLearnMoreURL);
|
||||
|
||||
#if !defined(OS_CHROMEOS)
|
||||
|
@@ -238,10 +238,10 @@ index 049983a12312c..7c0cb56ab627e 100644
|
||||
std::unique_ptr<SelectionController> selection_controller_;
|
||||
|
||||
diff --git ui/views/controls/menu/menu_controller.cc ui/views/controls/menu/menu_controller.cc
|
||||
index 5a554d16234e5..eb7b21c2cc2ce 100644
|
||||
index f056f201b6313..08fc4e376b2e7 100644
|
||||
--- ui/views/controls/menu/menu_controller.cc
|
||||
+++ ui/views/controls/menu/menu_controller.cc
|
||||
@@ -2854,8 +2854,13 @@ MenuItemView* MenuController::FindNextSelectableMenuItem(
|
||||
@@ -2879,8 +2879,13 @@ MenuItemView* MenuController::FindNextSelectableMenuItem(
|
||||
|
||||
void MenuController::OpenSubmenuChangeSelectionIfCan() {
|
||||
MenuItemView* item = pending_state_.item;
|
||||
@@ -256,7 +256,7 @@ index 5a554d16234e5..eb7b21c2cc2ce 100644
|
||||
MenuItemView* to_select = nullptr;
|
||||
if (!item->GetSubmenu()->GetMenuItems().empty())
|
||||
to_select = FindInitialSelectableMenuItem(item, INCREMENT_SELECTION_DOWN);
|
||||
@@ -2874,8 +2879,10 @@ void MenuController::OpenSubmenuChangeSelectionIfCan() {
|
||||
@@ -2899,8 +2904,10 @@ void MenuController::OpenSubmenuChangeSelectionIfCan() {
|
||||
void MenuController::CloseSubmenu() {
|
||||
MenuItemView* item = state_.item;
|
||||
DCHECK(item);
|
||||
|
@@ -1,8 +1,8 @@
|
||||
diff --git content/browser/renderer_host/render_widget_host_view_base.cc content/browser/renderer_host/render_widget_host_view_base.cc
|
||||
index 9cddf7c7ba6c9..6fd98d5717daa 100644
|
||||
index 97e76d6be1ccf..809fe0069e261 100644
|
||||
--- content/browser/renderer_host/render_widget_host_view_base.cc
|
||||
+++ content/browser/renderer_host/render_widget_host_view_base.cc
|
||||
@@ -623,6 +623,14 @@ float RenderWidgetHostViewBase::GetDeviceScaleFactor() {
|
||||
@@ -630,6 +630,14 @@ float RenderWidgetHostViewBase::GetDeviceScaleFactor() {
|
||||
return screen_info.device_scale_factor;
|
||||
}
|
||||
|
||||
@@ -130,10 +130,10 @@ index 0cad4e1f9731b..94d9e189661af 100644
|
||||
// Set the view's active state (i.e., tint state of controls).
|
||||
virtual void SetActive(bool active) = 0;
|
||||
diff --git ui/platform_window/x11/x11_window.cc ui/platform_window/x11/x11_window.cc
|
||||
index fc0efff4de309..dfe777e029869 100644
|
||||
index c3b68a6421b09..c6511f90f295f 100644
|
||||
--- ui/platform_window/x11/x11_window.cc
|
||||
+++ ui/platform_window/x11/x11_window.cc
|
||||
@@ -1680,7 +1680,8 @@ void X11Window::CreateXWindow(const PlatformWindowInitProperties& properties) {
|
||||
@@ -1719,7 +1719,8 @@ void X11Window::CreateXWindow(const PlatformWindowInitProperties& properties) {
|
||||
req.border_pixel = 0;
|
||||
|
||||
bounds_in_pixels_ = SanitizeBounds(bounds);
|
||||
@@ -157,7 +157,7 @@ index 7c352dd0d992d..516623a91b0e1 100644
|
||||
return host ? host->GetAcceleratedWidget() : nullptr;
|
||||
}
|
||||
diff --git ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
|
||||
index 9c3dec8dfdd32..a523cceb5aed3 100644
|
||||
index 80d1019a5661b..48073dd9540e4 100644
|
||||
--- ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
|
||||
+++ ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
|
||||
@@ -231,6 +231,18 @@ Widget::MoveLoopResult DesktopWindowTreeHostLinux::RunMoveLoop(
|
||||
@@ -189,7 +189,7 @@ index 9c3dec8dfdd32..a523cceb5aed3 100644
|
||||
properties->x11_extension_delegate = this;
|
||||
}
|
||||
diff --git ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
|
||||
index 5ac7051b4a002..84b8ceb053e75 100644
|
||||
index 35caab2f2f06a..f372ad1e4c672 100644
|
||||
--- ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
|
||||
+++ ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
|
||||
@@ -87,6 +87,8 @@ class VIEWS_EXPORT DesktopWindowTreeHostLinux
|
||||
@@ -210,7 +210,7 @@ index 5ac7051b4a002..84b8ceb053e75 100644
|
||||
|
||||
// PlatformWindowDelegate:
|
||||
void DispatchEvent(ui::Event* event) override;
|
||||
@@ -152,6 +156,9 @@ class VIEWS_EXPORT DesktopWindowTreeHostLinux
|
||||
@@ -153,6 +157,9 @@ class VIEWS_EXPORT DesktopWindowTreeHostLinux
|
||||
// destroyed.
|
||||
static std::list<gfx::AcceleratedWidget>* open_windows_;
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc
|
||||
index e7e2e3d3163bb..e12381457f0bb 100644
|
||||
index 818585d3aca6d..693fe42f3894b 100644
|
||||
--- content/browser/web_contents/web_contents_impl.cc
|
||||
+++ content/browser/web_contents/web_contents_impl.cc
|
||||
@@ -2899,6 +2899,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
|
||||
@@ -2900,6 +2900,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
|
||||
frame_tree_.Init(site_instance.get(), params.renderer_initiated_creation,
|
||||
params.main_frame_name);
|
||||
|
||||
@@ -15,7 +15,7 @@ index e7e2e3d3163bb..e12381457f0bb 100644
|
||||
WebContentsViewDelegate* delegate =
|
||||
GetContentClient()->browser()->GetWebContentsViewDelegate(this);
|
||||
|
||||
@@ -2909,6 +2915,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
|
||||
@@ -2910,6 +2916,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
|
||||
view_.reset(CreateWebContentsView(this, delegate,
|
||||
&render_view_host_delegate_view_));
|
||||
}
|
||||
@@ -23,7 +23,7 @@ index e7e2e3d3163bb..e12381457f0bb 100644
|
||||
CHECK(render_view_host_delegate_view_);
|
||||
CHECK(view_.get());
|
||||
|
||||
@@ -3739,6 +3746,15 @@ FrameTree* WebContentsImpl::CreateNewWindow(
|
||||
@@ -3743,6 +3750,15 @@ FrameTree* WebContentsImpl::CreateNewWindow(
|
||||
// objects.
|
||||
create_params.renderer_initiated_creation = !is_new_browsing_instance;
|
||||
|
||||
@@ -39,7 +39,7 @@ index e7e2e3d3163bb..e12381457f0bb 100644
|
||||
std::unique_ptr<WebContentsImpl> new_contents;
|
||||
if (!is_guest) {
|
||||
create_params.context = view_->GetNativeView();
|
||||
@@ -7526,6 +7542,9 @@ void WebContentsImpl::SetFocusedFrame(FrameTreeNode* node,
|
||||
@@ -7530,6 +7546,9 @@ void WebContentsImpl::SetFocusedFrame(FrameTreeNode* node,
|
||||
// This is an outermost WebContents.
|
||||
SetAsFocusedWebContentsIfNecessary();
|
||||
}
|
||||
@@ -62,7 +62,7 @@ index c7302d7af6d8b..d19be54f36d39 100644
|
||||
creator_location(creator_location) {}
|
||||
|
||||
diff --git content/public/browser/web_contents.h content/public/browser/web_contents.h
|
||||
index bfa0e468e11e6..31061d5821e60 100644
|
||||
index 370d9e11c78e7..7153d479b9f19 100644
|
||||
--- content/public/browser/web_contents.h
|
||||
+++ content/public/browser/web_contents.h
|
||||
@@ -88,10 +88,12 @@ class BrowserContext;
|
||||
|
@@ -1,8 +1,8 @@
|
||||
diff --git chrome/app/generated_resources.grd chrome/app/generated_resources.grd
|
||||
index 84a68402edbd8..8545827ce5682 100644
|
||||
index 48174dff2344d..64073cc402e6f 100644
|
||||
--- chrome/app/generated_resources.grd
|
||||
+++ chrome/app/generated_resources.grd
|
||||
@@ -5372,7 +5372,7 @@ Keep your key file in a safe place. You will need it to create new versions of y
|
||||
@@ -5384,7 +5384,7 @@ Keep your key file in a safe place. You will need it to create new versions of y
|
||||
</message>
|
||||
</if>
|
||||
<message name="IDS_PLUGIN_BLOCKED_BY_POLICY" desc="The placeholder text for a plugin blocked by enterprise policy.">
|
||||
|
18
patch/patches/win_sandbox_3210.patch
Normal file
18
patch/patches/win_sandbox_3210.patch
Normal file
@@ -0,0 +1,18 @@
|
||||
diff --git sandbox/policy/win/sandbox_win.cc sandbox/policy/win/sandbox_win.cc
|
||||
index f4f23deab53f0..d1a5739983024 100644
|
||||
--- sandbox/policy/win/sandbox_win.cc
|
||||
+++ sandbox/policy/win/sandbox_win.cc
|
||||
@@ -1148,6 +1148,13 @@ ResultCode SandboxWin::StartSandboxedProcess(
|
||||
const base::HandlesToInheritVector& handles_to_inherit,
|
||||
SandboxDelegate* delegate,
|
||||
base::Process* process) {
|
||||
+ // Will be nullptr if SandboxInterfaceInfo was not initialized by the CEF
|
||||
+ // client, meaning that the sandbox is implicitly disabled.
|
||||
+ if (!g_broker_services) {
|
||||
+ return LaunchWithoutSandbox(cmd_line, handles_to_inherit, delegate,
|
||||
+ process);
|
||||
+ }
|
||||
+
|
||||
scoped_refptr<TargetPolicy> policy = g_broker_services->CreatePolicy();
|
||||
ResultCode result = GeneratePolicyForSandboxedProcess(
|
||||
cmd_line, process_type, handles_to_inherit, delegate, policy);
|
@@ -251,7 +251,7 @@ void RootWindowManager::CloseAllWindows(bool force) {
|
||||
// in OnRootWindowDestroyed while iterating.
|
||||
RootWindowSet root_windows = root_windows_;
|
||||
|
||||
for (auto root_window : root_windows_) {
|
||||
for (auto root_window : root_windows) {
|
||||
root_window->Close(force);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user