blob: 03aa01d7f4d7905d489ba3adaed4e82403aff8ea [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/browser/extension_frame_host.h"
#include <string>
#include "base/trace_event/typed_macros.h"
#include "content/public/browser/render_process_host.h"
#include "extensions/browser/app_window/app_window.h"
#include "extensions/browser/app_window/app_window_registry.h"
#include "extensions/browser/bad_message.h"
#include "extensions/browser/extension_function_dispatcher.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_web_contents_observer.h"
#include "extensions/browser/message_service_api.h"
#include "extensions/browser/process_manager.h"
#include "extensions/common/api/messaging/port_context.h"
#include "extensions/common/extension_id.h"
#include "extensions/common/mojom/message_port.mojom.h"
#include "extensions/common/trace_util.h"
#include "third_party/blink/public/mojom/page/draggable_region.mojom.h"
using perfetto::protos::pbzero::ChromeTrackEvent;
namespace extensions {
ExtensionFrameHost::ExtensionFrameHost(content::WebContents* web_contents)
: web_contents_(web_contents), receivers_(web_contents, this) {}
ExtensionFrameHost::~ExtensionFrameHost() = default;
void ExtensionFrameHost::BindLocalFrameHost(
mojo::PendingAssociatedReceiver<mojom::LocalFrameHost> receiver,
content::RenderFrameHost* render_frame_host) {
receivers_.Bind(render_frame_host, std::move(receiver));
}
void ExtensionFrameHost::RequestScriptInjectionPermission(
const ExtensionId& extension_id,
mojom::InjectionType script_type,
mojom::RunLocation run_location,
RequestScriptInjectionPermissionCallback callback) {
std::move(callback).Run(false);
}
void ExtensionFrameHost::GetAppInstallState(
const GURL& requestor_url,
GetAppInstallStateCallback callback) {
std::move(callback).Run(std::string());
}
void ExtensionFrameHost::Request(mojom::RequestParamsPtr params,
RequestCallback callback) {
content::RenderFrameHost* render_frame_host =
receivers_.GetCurrentTargetFrame();
ExtensionWebContentsObserver::GetForWebContents(web_contents_)
->dispatcher()
->Dispatch(std::move(params), *render_frame_host, std::move(callback));
}
void ExtensionFrameHost::ResponseAck(const base::Uuid& request_uuid) {
ExtensionWebContentsObserver::GetForWebContents(web_contents_)
->dispatcher()
->ProcessResponseAck(request_uuid);
}
void ExtensionFrameHost::WatchedPageChange(
const std::vector<std::string>& css_selectors) {}
void ExtensionFrameHost::DetailedConsoleMessageAdded(
const std::u16string& message,
const std::u16string& source,
const StackTrace& stack_trace,
blink::mojom::ConsoleMessageLevel level) {}
void ExtensionFrameHost::ContentScriptsExecuting(
const base::flat_map<std::string, std::vector<std::string>>&
extension_id_to_scripts,
const GURL& frame_url) {}
void ExtensionFrameHost::IncrementLazyKeepaliveCount() {
content::RenderFrameHost* render_frame_host =
receivers_.GetCurrentTargetFrame();
auto* process_manager =
ProcessManager::Get(render_frame_host->GetBrowserContext());
const Extension* extension = GetExtension(process_manager, render_frame_host);
if (!extension) {
bad_message::ReceivedBadMessage(
render_frame_host->GetProcess(),
bad_message::EFH_NO_BACKGROUND_HOST_FOR_FRAME);
return;
}
process_manager->IncrementLazyKeepaliveCount(
extension, Activity::LIFECYCLE_MANAGEMENT, Activity::kIPC);
}
void ExtensionFrameHost::DecrementLazyKeepaliveCount() {
content::RenderFrameHost* render_frame_host =
receivers_.GetCurrentTargetFrame();
auto* process_manager =
ProcessManager::Get(render_frame_host->GetBrowserContext());
const Extension* extension = GetExtension(process_manager, render_frame_host);
if (!extension) {
bad_message::ReceivedBadMessage(
render_frame_host->GetProcess(),
bad_message::EFH_NO_BACKGROUND_HOST_FOR_FRAME);
return;
}
process_manager->DecrementLazyKeepaliveCount(
extension, Activity::LIFECYCLE_MANAGEMENT, Activity::kIPC);
}
const Extension* ExtensionFrameHost::GetExtension(
ProcessManager* process_manager,
content::RenderFrameHost* frame) {
ExtensionHost* extension_host =
process_manager->GetBackgroundHostForRenderFrameHost(frame);
if (!extension_host) {
return nullptr;
}
return extension_host->extension();
}
void ExtensionFrameHost::AppWindowReady() {
AppWindowRegistry* registry =
AppWindowRegistry::Get(web_contents_->GetBrowserContext());
if (!registry) {
return;
}
AppWindow* app_window = registry->GetAppWindowForWebContents(web_contents_);
if (!app_window) {
return;
}
app_window->AppWindowReady();
}
void ExtensionFrameHost::OpenChannelToExtension(
extensions::mojom::ExternalConnectionInfoPtr info,
extensions::mojom::ChannelType channel_type,
const std::string& channel_name,
const PortId& port_id,
mojo::PendingAssociatedRemote<extensions::mojom::MessagePort> port,
mojo::PendingAssociatedReceiver<extensions::mojom::MessagePortHost>
port_host) {
content::RenderFrameHost* render_frame_host =
receivers_.GetCurrentTargetFrame();
auto* process = render_frame_host->GetProcess();
TRACE_EVENT("extensions", "ExtensionFrameHost::OpenChannelToExtension",
ChromeTrackEvent::kRenderProcessHost, *process);
MessageServiceApi::GetMessageService()->OpenChannelToExtension(
render_frame_host->GetBrowserContext(), render_frame_host, port_id, *info,
channel_type, channel_name, std::move(port), std::move(port_host));
}
void ExtensionFrameHost::OpenChannelToNativeApp(
const std::string& native_app_name,
const PortId& port_id,
mojo::PendingAssociatedRemote<extensions::mojom::MessagePort> port,
mojo::PendingAssociatedReceiver<extensions::mojom::MessagePortHost>
port_host) {
content::RenderFrameHost* render_frame_host =
receivers_.GetCurrentTargetFrame();
auto* process = render_frame_host->GetProcess();
TRACE_EVENT("extensions", "ExtensionFrameHost::OnOpenChannelToNativeApp",
ChromeTrackEvent::kRenderProcessHost, *process);
MessageServiceApi::GetMessageService()->OpenChannelToNativeApp(
render_frame_host->GetBrowserContext(), render_frame_host, port_id,
native_app_name, std::move(port), std::move(port_host));
}
void ExtensionFrameHost::OpenChannelToTab(
int32_t tab_id,
int32_t frame_id,
const std::optional<std::string>& document_id,
extensions::mojom::ChannelType channel_type,
const std::string& channel_name,
const PortId& port_id,
mojo::PendingAssociatedRemote<extensions::mojom::MessagePort> port,
mojo::PendingAssociatedReceiver<extensions::mojom::MessagePortHost>
port_host) {
content::RenderFrameHost* render_frame_host =
receivers_.GetCurrentTargetFrame();
auto* process = render_frame_host->GetProcess();
TRACE_EVENT("extensions", "ExtensionFrameHost::OpenChannelToTab",
ChromeTrackEvent::kRenderProcessHost, *process);
MessageServiceApi::GetMessageService()->OpenChannelToTab(
render_frame_host->GetBrowserContext(), render_frame_host, port_id,
tab_id, frame_id, document_id ? *document_id : std::string(),
channel_type, channel_name, std::move(port), std::move(port_host));
}
} // namespace extensions