#include "content/renderer/agent_scheduling_group.h"
#include <map>
#include <utility>
#include "base/containers/map_util.h"
#include "base/feature_list.h"
#include "base/task/bind_post_task.h"
#include "base/task/single_thread_task_runner.h"
#include "base/task/thread_pool.h"
#include "base/threading/sequence_bound.h"
#include "base/types/pass_key.h"
#include "content/common/agent_scheduling_group.mojom.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_features.h"
#include "content/public/renderer/content_renderer_client.h"
#include "content/renderer/render_frame_impl.h"
#include "content/renderer/render_thread_impl.h"
#include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_listener.h"
#include "ipc/ipc_sync_channel.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/page/browsing_context_group_info.h"
#include "third_party/blink/public/mojom/frame/frame.mojom.h"
#include "third_party/blink/public/mojom/page/page.mojom.h"
#include "third_party/blink/public/mojom/page/prerender_page_param.mojom.h"
#include "third_party/blink/public/mojom/shared_storage/shared_storage_worklet_service.mojom.h"
#include "third_party/blink/public/mojom/worker/worklet_global_scope_creation_params.mojom.h"
#include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
#include "third_party/blink/public/web/web_remote_frame.h"
#include "third_party/blink/public/web/web_shared_storage_worklet_thread.h"
#include "third_party/blink/public/web/web_view.h"
#include "third_party/blink/public/web/web_view_client.h"
namespace content {
ChannelMojo;
Listener;
SyncChannel;
AssociatedReceiver;
AssociatedRemote;
PendingAssociatedReceiver;
PendingAssociatedRemote;
PendingReceiver;
PendingRemote;
Receiver;
Remote;
PassKey;
namespace {
RenderThreadImpl& ToImpl(RenderThread& render_thread) { … }
static features::MBIMode GetMBIMode() { … }
void CreateRemoteMainFrame(
const blink::RemoteFrameToken& frame_token,
mojo::PendingAssociatedRemote<blink::mojom::RemoteFrameHost>
remote_frame_host,
mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame>
remote_frame_receiver,
mojo::PendingAssociatedRemote<blink::mojom::RemoteMainFrameHost>
remote_main_frame_host,
mojo::PendingAssociatedReceiver<blink::mojom::RemoteMainFrame>
remote_main_frame_receiver,
base::UnguessableToken& devtools_main_frame_token,
blink::mojom::FrameReplicationStatePtr replication_state,
blink::WebFrame* opener_frame,
blink::WebView* web_view) { … }
class SelfOwnedWebViewClient : public blink::WebViewClient { … };
}
AgentSchedulingGroup::ReceiverData::ReceiverData(
const std::string& name,
mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface> receiver)
: … { … }
AgentSchedulingGroup::ReceiverData::ReceiverData(ReceiverData&& other)
: … { … }
AgentSchedulingGroup::ReceiverData::~ReceiverData() = default;
AgentSchedulingGroup::AgentSchedulingGroup(
RenderThread& render_thread,
mojo::PendingReceiver<IPC::mojom::ChannelBootstrap> bootstrap)
: … { … }
AgentSchedulingGroup::AgentSchedulingGroup(
RenderThread& render_thread,
PendingAssociatedReceiver<mojom::AgentSchedulingGroup> receiver)
: … { … }
AgentSchedulingGroup::~AgentSchedulingGroup() = default;
bool AgentSchedulingGroup::OnMessageReceived(const IPC::Message& message) { … }
void AgentSchedulingGroup::OnBadMessageReceived(const IPC::Message& message) { … }
void AgentSchedulingGroup::OnAssociatedInterfaceRequest(
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle handle) { … }
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
bool AgentSchedulingGroup::Send(IPC::Message* message) {
std::unique_ptr<IPC::Message> msg(message);
if (GetMBIMode() == features::MBIMode::kLegacy)
return render_thread_->Send(msg.release());
DCHECK_NE(message->routing_id(), MSG_ROUTING_CONTROL);
DCHECK(channel_);
return channel_->Send(msg.release());
}
#endif
void AgentSchedulingGroup::AddFrameRoute(
const blink::LocalFrameToken& frame_token,
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
int routing_id,
#endif
RenderFrameImpl* render_frame,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) { … }
void AgentSchedulingGroup::RemoveFrameRoute(
const blink::LocalFrameToken& frame_token
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
,
int routing_id
#endif
) { … }
void AgentSchedulingGroup::DidUnloadRenderFrame(
const blink::LocalFrameToken& frame_token) { … }
void AgentSchedulingGroup::CreateView(mojom::CreateViewParamsPtr params) { … }
blink::WebView* AgentSchedulingGroup::CreateWebView(
mojom::CreateViewParamsPtr params,
bool was_created_by_renderer,
const blink::WebURL& base_url) { … }
void AgentSchedulingGroup::CreateFrame(mojom::CreateFrameParamsPtr params) { … }
void AgentSchedulingGroup::CreateSharedStorageWorkletService(
mojo::PendingReceiver<blink::mojom::SharedStorageWorkletService> receiver,
blink::mojom::WorkletGlobalScopeCreationParamsPtr
global_scope_creation_params) { … }
void AgentSchedulingGroup::BindAssociatedInterfaces(
mojo::PendingAssociatedRemote<mojom::AgentSchedulingGroupHost> remote_host,
mojo::PendingAssociatedReceiver<mojom::RouteProvider>
route_provider_receiever) { … }
void AgentSchedulingGroup::GetRoute(
const blink::LocalFrameToken& frame_token,
mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterfaceProvider>
receiver) { … }
void AgentSchedulingGroup::GetAssociatedInterface(
const std::string& name,
mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface>
receiver) { … }
RenderFrameImpl* AgentSchedulingGroup::GetListener(
const blink::LocalFrameToken& frame_token) { … }
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
RenderFrameImpl* AgentSchedulingGroup::GetListener(int32_t routing_id) {
return base::FindPtrOrNull(routing_id_map_, routing_id);
}
#endif
}