chrome: Preserve request context for Inspect Element (fixes #4168)

Keep CEF-created unique OTR profiles when resolving the DevTools
profile so Inspect Element does not create the popup with the parent
profile. Add coverage for a non-global request context and verify that
the DevTools popup shares it.
This commit is contained in:
Marshall Greenblatt committed 2026-08-19 18:05:13 -04:00
1 parent 13ac447cca
commit cd89341bfe
3 files changed
+48 -7

No files matched your search

+4
View File
@@ -264,6 +264,10 @@ patches = [
# OnOpenURLFromTab.
# https://github.com/chromiumembedded/cef/issues/3735
#
# Preserve the Profile for DevTools opened from CEF-managed unique OTR
# request contexts.
# https://github.com/chromiumembedded/cef/issues/4168
#
# Fix Picture-in-Picture window icon in Windows taskbar by using the
# favicon from the opener WebContents.
#
+17 -4
View File
@@ -34,10 +34,23 @@ index 08949a69415dfa9f836e00929a34330a34546ce2..e417f50fa68e274b80c0d45bdaa45c7b
NOTREACHED();
}
diff --git chrome/browser/devtools/devtools_window.cc chrome/browser/devtools/devtools_window.cc
index 9d28b02fa09bf331ed9b381ba25b56f0a30ec365..0d0bf347d77c4c8eda4e69969798c69557af6bdd 100644
index 9d28b02fa09bf331ed9b381ba25b56f0a30ec365..5ffa364977080aaab9819d789e73544334410271 100644
--- chrome/browser/devtools/devtools_window.cc
+++ chrome/browser/devtools/devtools_window.cc
@@ -1380,6 +1380,14 @@ DevToolsWindow* DevToolsWindow::Create(
@@ -854,6 +854,12 @@ Profile* DevToolsWindow::GetProfileForDevToolsWindow(
if (profile->IsPrimaryOTRProfile() || profile->IsDevToolsOTRProfile()) {
return profile;
}
+#if BUILDFLAG(ENABLE_CEF)
+ if (profile->IsOffTheRecord() &&
+ profile->GetOTRProfileID().IsUniqueForCEF()) {
+ return profile;
+ }
+#endif
return profile->GetOriginalProfile();
}
@@ -1380,6 +1386,14 @@ DevToolsWindow* DevToolsWindow::Create(
if (!devtools_ui_controller || !devtools_ui_controller->CanDockDevtools()) {
can_dock = false;
}
@@ -52,7 +65,7 @@ index 9d28b02fa09bf331ed9b381ba25b56f0a30ec365..0d0bf347d77c4c8eda4e69969798c695
}
#endif // !BUILDFLAG(IS_ANDROID)
@@ -1844,7 +1852,9 @@ void DevToolsWindow::OpenInNewTab(const GURL& url) {
@@ -1844,7 +1858,9 @@ void DevToolsWindow::OpenInNewTab(const GURL& url) {
/*navigation_handle_callback=*/{})) {
#if BUILDFLAG(IS_ANDROID)
NOTIMPLEMENTED();
@@ -63,7 +76,7 @@ index 9d28b02fa09bf331ed9b381ba25b56f0a30ec365..0d0bf347d77c4c8eda4e69969798c695
chrome::ScopedTabbedBrowserDisplayer displayer(profile_);
chrome::AddSelectedTabWithURL(displayer.browser_window_interface(),
fixed_url, ui::PAGE_TRANSITION_LINK);
@@ -2050,12 +2060,31 @@ void DevToolsWindow::CreateDevToolsBrowser() {
@@ -2050,12 +2066,31 @@ void DevToolsWindow::CreateDevToolsBrowser() {
Browser::CreationStatus::kOk) {
return;
}
+27 -3
View File
@@ -3,6 +3,7 @@
// can be found in the LICENSE file.
#include "include/base/cef_callback.h"
#include "include/cef_request_context_handler.h"
#include "include/test/cef_test_helpers.h"
#include "include/wrapper/cef_closure_task.h"
#include "tests/ceftests/routing_test_handler.h"
@@ -399,7 +400,10 @@ const cef_color_t kDevToolsBackgroundColor = CefColorSetARGB(255, 128, 64, 32);
// Test OnBeforeDevToolsPopup callback
class DevToolsPopupTestHandler : public TestHandler {
public:
DevToolsPopupTestHandler() = default;
DevToolsPopupTestHandler(bool unique_request_context = false,
bool inspect_element = false)
: unique_request_context_(unique_request_context),
inspect_element_(inspect_element) {}
DevToolsPopupTestHandler(const DevToolsPopupTestHandler&) = delete;
DevToolsPopupTestHandler& operator=(const DevToolsPopupTestHandler&) = delete;
@@ -412,7 +416,12 @@ class DevToolsPopupTestHandler : public TestHandler {
"</html>";
AddResource(kDevToolsTestUrl, html, "text/html");
CreateBrowser(kDevToolsTestUrl);
CefRefPtr<CefRequestContext> request_context;
if (unique_request_context_) {
CefRequestContextSettings settings;
request_context = CefRequestContext::CreateContext(settings, nullptr);
}
CreateBrowser(kDevToolsTestUrl, request_context);
SetTestTimeout();
}
@@ -428,6 +437,8 @@ class DevToolsPopupTestHandler : public TestHandler {
EXPECT_FALSE(got_devtools_after_created_);
got_devtools_after_created_.yes();
EXPECT_TRUE(browser->IsPopup());
EXPECT_TRUE(browser->GetHost()->GetRequestContext()->IsSame(
main_browser_->GetHost()->GetRequestContext()));
devtools_browser_ = browser;
}
}
@@ -454,8 +465,10 @@ class DevToolsPopupTestHandler : public TestHandler {
// Set a custom background color to verify it's passed to the callback
settings.background_color = kDevToolsBackgroundColor;
const CefPoint inspect_point =
inspect_element_ ? CefPoint(10, 10) : CefPoint();
main_browser_->GetHost()->ShowDevTools(windowInfo, this, settings,
CefPoint());
inspect_point);
} else if (devtools_browser_ && browser->IsSame(devtools_browser_)) {
EXPECT_FALSE(got_devtools_load_end_);
got_devtools_load_end_.yes();
@@ -531,6 +544,9 @@ class DevToolsPopupTestHandler : public TestHandler {
CefRefPtr<CefBrowser> main_browser_;
CefRefPtr<CefBrowser> devtools_browser_;
const bool unique_request_context_;
const bool inspect_element_;
TrackCallback got_main_after_created_;
TrackCallback got_main_load_end_;
TrackCallback got_before_devtools_popup_;
@@ -551,3 +567,11 @@ TEST(LifeSpanTest, OnBeforeDevToolsPopup) {
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, OnBeforeDevToolsPopupUniqueContextInspectElement) {
CefRefPtr<DevToolsPopupTestHandler> handler =
new DevToolsPopupTestHandler(/*unique_request_context=*/true,
/*inspect_element=*/true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}