chrome: Enforce matching context for new user and incognito profiles

Selecting a new user or incognito profile via Chrome UI may result in
the creation of a new Profile object. If that occurs, we should find
or create a matching CefBrowserContext and CefRequestContext instead
of reusing an existing mismatched context (e.g. using the original
context for an incognito window would be a mismatch). If a new
CefRequestContext will be created the client can now implement
CefBrowserProcessHandler::GetDefaultRequestContextHandler() to
provide the handler for that context.

To test with a new user profile:
1. Click "Profile" icon, select "Add". Now you have 2+ profiles.
2. Click "Profile" icon, select the other user name to create a new
   window using the other user profile.
3. The new window should launch successfully.

To test with a new incognito profile:
1. Select "New Incognito window" from the 3-dot menu.
2. The new window should launch successfully.

To test DevTools window creation for the new profile:
1. Right-click in the new window, select Inspect.
2. The DevTools window should launch successfully.
This commit is contained in:
Marshall Greenblatt
2024-02-08 13:41:18 -05:00
parent a79981bf7f
commit cc3d77eec5
14 changed files with 244 additions and 75 deletions

View File

@@ -38,6 +38,28 @@ ChromeBrowserContext::ChromeBrowserContext(
ChromeBrowserContext::~ChromeBrowserContext() = default;
// static
ChromeBrowserContext* ChromeBrowserContext::GetOrCreateForProfile(
Profile* profile) {
DCHECK(profile);
if (auto existing_context = FromProfile(profile)) {
return static_cast<ChromeBrowserContext*>(existing_context);
}
CefRequestContextSettings settings;
if (!profile->IsOffTheRecord()) {
// Become the primary context associated with |cache_path|.
CefString(&settings.cache_path) = profile->GetPath().value();
}
auto* new_context = new ChromeBrowserContext(settings);
new_context->Initialize();
new_context->ProfileCreated(Profile::CreateStatus::CREATE_STATUS_INITIALIZED,
profile);
return new_context;
}
content::BrowserContext* ChromeBrowserContext::AsBrowserContext() {
CHECK(!destroyed_);
return profile_;
@@ -146,8 +168,10 @@ void ChromeBrowserContext::ProfileCreated(Profile::CreateStatus status,
// exists.
profile_ = profile;
profile_->AddObserver(this);
profile_keep_alive_ = std::make_unique<ScopedProfileKeepAlive>(
profile_, ProfileKeepAliveOrigin::kAppWindow);
if (!profile_->IsOffTheRecord()) {
profile_keep_alive_ = std::make_unique<ScopedProfileKeepAlive>(
profile_, ProfileKeepAliveOrigin::kAppWindow);
}
}
if (status == Profile::CreateStatus::CREATE_STATUS_INITIALIZED) {