blob: 06f3a00e199729c69ad360a688a65a0001093876 [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/devtools/protocol/hidden_target_manager.h"
#include "content/browser/devtools/web_contents_devtools_agent_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
namespace content::protocol {
HiddenTargetManager::HiddenTargetManager() = default;
HiddenTargetManager::~HiddenTargetManager() = default;
void HiddenTargetManager::CloseContents(content::WebContents* source) {
hidden_web_contents_.erase(source);
}
std::string HiddenTargetManager::CreateHiddenTarget(
const GURL& url,
BrowserContext* browser_context) {
WebContents::CreateParams create_params(browser_context);
std::unique_ptr<WebContents> web_contents =
WebContents::Create(create_params);
// Required for the hidden WebContents to be properly disposed.
web_contents->SetDelegate(this);
// The hidden target hosts a `window.cdp` binding wired to a trusted
// browser-level DevTools session (BrowserToPageConnector). Its siteless
// about:blank navigation never reaches SetIsUsed(), so the process would
// otherwise be treated as a freely-reusable allows-any-site host and
// unrelated web content could be co-scheduled with it at the process limit.
// Mark the process used so IsSuitableHost() rejects it for sites that
// require a dedicated process.
web_contents->GetPrimaryMainFrame()->GetProcess()->SetIsUsed();
NavigationController::LoadURLParams load_params(url);
web_contents->GetController().LoadURLWithParams(load_params);
std::string target_id =
content::DevToolsAgentHost::GetOrCreateFor(web_contents.get())->GetId();
CHECK(!web_contents->GetPrimaryMainFrame()->GetProcess()->IsUnused())
<< "Hidden target process is unexpectedly unused";
hidden_web_contents_.insert(std::move(web_contents));
return target_id;
}
void HiddenTargetManager::Clear() {
hidden_web_contents_.clear();
}
} // namespace content::protocol