mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
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:
@@ -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) {
|
||||
|
Reference in New Issue
Block a user