Skip to content

Commit

Permalink
[extensions] Move WakeEventPage to mojom::RendererHost
Browse files Browse the repository at this point in the history
- Conditionally remove ExtensionMessageFilter
- Move WakeEventPage to be sent via RendererHost
- Retrieve the RendererHost from the relevant context
- Give each ServiceWorker ServiceWorkerData but do not attach native
bindings if it isn't permitted. This allows us to be able to store
the RendererHost mojo channel on the ServiceWorkerData object.

Bug: 993189
Change-Id: Ie4fc54ccf362cb55afead9765ff4e3136e9f5b9b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4902564
Reviewed-by: Avi Drissman <avi@chromium.org>
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Reviewed-by: Brendon Tiszka <tiszka@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1216189}
  • Loading branch information
dtapuska authored and Chromium LUCI CQ committed Oct 27, 2023
1 parent 3ed0748 commit 531abf9
Show file tree
Hide file tree
Showing 24 changed files with 256 additions and 69 deletions.
6 changes: 6 additions & 0 deletions chrome/browser/chrome_content_browser_client_parts.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AssociatedInterfaceRegistry;
namespace content {
class BrowserContext;
class BrowserURLHandler;
class RenderFrameHost;
class RenderProcessHost;
struct ServiceWorkerVersionBaseInfo;
class SiteInstance;
Expand Down Expand Up @@ -94,6 +95,11 @@ class ChromeContentBrowserClientParts {
virtual void ExposeInterfacesToRendererForServiceWorker(
const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
blink::AssociatedInterfaceRegistry& associated_registry) {}

// Allows to register browser interfaces exposed to a RenderFrameHost.
virtual void ExposeInterfacesToRendererForRenderFrameHost(
content::RenderFrameHost& frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) {}
};

#endif // CHROME_BROWSER_CHROME_CONTENT_BROWSER_CLIENT_PARTS_H_
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,11 @@ void ChromeContentBrowserClient::
RegisterAssociatedInterfaceBindersForRenderFrameHost(
content::RenderFrameHost& render_frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) {
for (auto& ep : extra_parts_) {
ep->ExposeInterfacesToRendererForRenderFrameHost(render_frame_host,
associated_registry);
}

associated_registry.AddInterface<autofill::mojom::AutofillDriver>(
base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -732,15 +732,15 @@ base::AutoReset<const GURL*> ChromeContentBrowserClientExtensionsPart::

void ChromeContentBrowserClientExtensionsPart::RenderProcessWillLaunch(
content::RenderProcessHost* host) {
int id = host->GetID();
Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext());
if (AreExtensionsDisabledForProfile(profile)) {
return;
}

host->AddFilter(new ChromeExtensionMessageFilter(profile));
host->AddFilter(new ExtensionMessageFilter(id, profile));
#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
int id = host->GetID();
host->AddFilter(new ExtensionMessageFilter(id, profile));
host->AddFilter(new ExtensionServiceWorkerMessageFilter(
id, profile, host->GetStoragePartition()->GetServiceWorkerContext()));
host->AddFilter(new MessagingAPIMessageFilter(id, profile));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@ class ChromeContentBrowserClientExtensionsPart
void ExposeInterfacesToRendererForServiceWorker(
const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
blink::AssociatedInterfaceRegistry& associated_registry) override;
void ExposeInterfacesToRendererForRenderFrameHost(
content::RenderFrameHost& frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) override;
};

} // namespace extensions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,13 @@ void ChromeContentBrowserClientExtensionsPart::
#endif
}

void ChromeContentBrowserClientExtensionsPart::
ExposeInterfacesToRendererForRenderFrameHost(
content::RenderFrameHost& frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) {
associated_registry.AddInterface<mojom::RendererHost>(
base::BindRepeating(&RendererStartupHelper::BindForRenderer,
frame_host.GetProcess()->GetID()));
}

} // namespace extensions
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ void EnsureCoreBrowserContextKeyedServiceFactoriesBuilt() {
EventRouterFactory::GetInstance();
ExtensionActionManager::EnsureFactoryBuilt();
ExtensionFunction::EnsureShutdownNotifierFactoryBuilt();
ExtensionMessageFilter::EnsureShutdownNotifierFactoryBuilt();
#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
ExtensionMessageFilter::EnsureShutdownNotifierFactoryBuilt();
ExtensionServiceWorkerMessageFilter::EnsureShutdownNotifierFactoryBuilt();
#endif
ExtensionPrefsFactory::GetInstance();
Expand Down
2 changes: 2 additions & 0 deletions extensions/browser/extension_message_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "extensions/common/extension_messages.h"
#include "extensions/common/manifest_handlers/background_info.h"

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
using content::BrowserThread;

namespace extensions {
Expand Down Expand Up @@ -150,3 +151,4 @@ void ExtensionMessageFilter::SendWakeEventPageResponse(int request_id,
}

} // namespace extensions
#endif
3 changes: 3 additions & 0 deletions extensions/browser/extension_message_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

#include "base/callback_list.h"
#include "content/public/browser/browser_message_filter.h"
#include "extensions/buildflags/buildflags.h"

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
namespace content {
class BrowserContext;
}
Expand Down Expand Up @@ -61,5 +63,6 @@ class ExtensionMessageFilter : public content::BrowserMessageFilter {
};

} // namespace extensions
#endif

#endif // EXTENSIONS_BROWSER_EXTENSION_MESSAGE_FILTER_H_
59 changes: 58 additions & 1 deletion extensions/browser/renderer_startup_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,18 @@
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/render_process_host.h"
#include "extensions/browser/bad_message.h"
#include "extensions/browser/extension_function_dispatcher.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_util.h"
#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
#include "extensions/browser/network_permissions_updater.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/process_manager_factory.h"
#include "extensions/browser/service_worker_task_queue.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/extension_messages.h"
#include "extensions/common/extension_set.h"
#include "extensions/common/extensions_client.h"
Expand Down Expand Up @@ -447,6 +451,59 @@ void RendererStartupHelper::BindForRenderer(
std::move(receiver), process_id);
}

void RendererStartupHelper::WakeEventPage(const ExtensionId& extension_id,
WakeEventPageCallback callback) {
#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
auto* process =
content::RenderProcessHost::FromID(receivers_.current_context());
if (!process) {
return;
}
bad_message::ReceivedBadMessage(process, bad_message::LEGACY_IPC_MISMATCH);
return;
#else
auto* browser_context = GetRendererBrowserContext();
if (!browser_context) {
std::move(callback).Run(false);
return;
}

const Extension* extension = ExtensionRegistry::Get(browser_context)
->enabled_extensions()
.GetByID(extension_id);
if (!extension) {
// Don't kill the renderer, it might just be some context which hasn't
// caught up to extension having been uninstalled.
std::move(callback).Run(false);
return;
}

ProcessManager* process_manager = ProcessManager::Get(browser_context);

if (BackgroundInfo::HasLazyBackgroundPage(extension)) {
// Wake the event page if it's asleep, or immediately repond with success
// if it's already awake.
if (process_manager->IsEventPageSuspended(extension_id)) {
process_manager->WakeEventPage(extension_id, std::move(callback));
} else {
std::move(callback).Run(true);
}
return;
}

if (BackgroundInfo::HasPersistentBackgroundPage(extension)) {
// No point in trying to wake a persistent background page. If it's open,
// immediately return and call it a success. If it's closed, fail.
std::move(callback).Run(process_manager->GetBackgroundHostForExtension(
extension_id) != nullptr);
return;
}

// The extension has no background page, so there is nothing to wake.
std::move(callback).Run(false);
#endif
}

//////////////////////////////////////////////////////////////////////////////

// static
Expand All @@ -465,7 +522,7 @@ RendererStartupHelperFactory::RendererStartupHelperFactory()
: BrowserContextKeyedServiceFactory(
"RendererStartupHelper",
BrowserContextDependencyManager::GetInstance()) {
// No dependencies on other services.
DependsOn(ProcessManagerFactory::GetInstance());
}

RendererStartupHelperFactory::~RendererStartupHelperFactory() = default;
Expand Down
2 changes: 2 additions & 0 deletions extensions/browser/renderer_startup_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ class RendererStartupHelper : public KeyedService,
const GURL& url,
const std::u16string& url_title,
int32_t call_type) override;
void WakeEventPage(const std::string& extension_id,
WakeEventPageCallback callback) override;

// Sends a message to the specified |process| activating the given extension
// once the process is initialized. OnExtensionLoaded should have already been
Expand Down
11 changes: 2 additions & 9 deletions extensions/common/extension_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@

#define IPC_MESSAGE_START ExtensionMsgStart

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
IPC_ENUM_TRAITS_MAX_VALUE(extensions::mojom::CSSOrigin,
extensions::mojom::CSSOrigin::kMaxValue)

Expand All @@ -61,7 +62,6 @@ IPC_ENUM_TRAITS_MAX_VALUE(content::SocketPermissionRequest::OperationType,
IPC_ENUM_TRAITS_MAX_VALUE(extensions::mojom::RunLocation,
extensions::mojom::RunLocation::kMaxValue)

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
IPC_ENUM_TRAITS_MAX_VALUE(extensions::mojom::MessagingEndpointType,
extensions::mojom::MessagingEndpointType::kMaxValue)

Expand Down Expand Up @@ -128,15 +128,13 @@ IPC_STRUCT_BEGIN(ExtensionMsg_ExternalConnectionInfo)
// The render frame routing ID of the webview that initiated the request.
IPC_STRUCT_MEMBER(int, guest_render_frame_routing_id)
IPC_STRUCT_END()
#endif

IPC_STRUCT_TRAITS_BEGIN(content::SocketPermissionRequest)
IPC_STRUCT_TRAITS_MEMBER(type)
IPC_STRUCT_TRAITS_MEMBER(host)
IPC_STRUCT_TRAITS_MEMBER(port)
IPC_STRUCT_TRAITS_END()

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
IPC_STRUCT_TRAITS_BEGIN(extensions::PortContext::FrameContext)
IPC_STRUCT_TRAITS_MEMBER(routing_id)
IPC_STRUCT_TRAITS_END()
Expand All @@ -151,7 +149,6 @@ IPC_STRUCT_TRAITS_BEGIN(extensions::PortContext)
IPC_STRUCT_TRAITS_MEMBER(frame)
IPC_STRUCT_TRAITS_MEMBER(worker)
IPC_STRUCT_TRAITS_END()
#endif

IPC_STRUCT_TRAITS_BEGIN(extensions::SocketPermissionEntry)
IPC_STRUCT_TRAITS_MEMBER(pattern_)
Expand All @@ -168,7 +165,6 @@ IPC_STRUCT_TRAITS_BEGIN(extensions::UsbDevicePermissionData)
IPC_STRUCT_TRAITS_MEMBER(interface_class())
IPC_STRUCT_TRAITS_END()

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
IPC_STRUCT_TRAITS_BEGIN(extensions::Message)
IPC_STRUCT_TRAITS_MEMBER(data)
IPC_STRUCT_TRAITS_MEMBER(format)
Expand All @@ -190,7 +186,6 @@ IPC_STRUCT_BEGIN(ExtensionMsg_OnConnectData)
IPC_STRUCT_MEMBER(ExtensionMsg_ExternalConnectionInfo,
external_connection_info)
IPC_STRUCT_END()
#endif

// Messages sent from the browser to the renderer:

Expand All @@ -199,7 +194,6 @@ IPC_MESSAGE_CONTROL2(ExtensionMsg_WakeEventPageResponse,
int /* request_id */,
bool /* success */)

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
// Check whether the Port for extension messaging exists in a frame or a Service
// Worker. If the port ID is unknown, the frame replies with
// ExtensionHostMsg_CloseMessagePort.
Expand Down Expand Up @@ -291,14 +285,13 @@ IPC_SYNC_MESSAGE_CONTROL1_1(
std::string /* extension id */,
extensions::MessageBundle::SubstitutionMap /* message bundle */)

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
// Asks the browser to wake the event page of an extension.
// The browser will reply with ExtensionHostMsg_WakeEventPageResponse.
IPC_MESSAGE_CONTROL2(ExtensionHostMsg_WakeEventPage,
int /* request_id */,
std::string /* extension_id */)

#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)

// Messages related to Extension Service Worker.
#undef IPC_MESSAGE_START
#define IPC_MESSAGE_START ExtensionWorkerMsgStart
Expand Down
3 changes: 3 additions & 0 deletions extensions/common/mojom/renderer_host.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,7 @@ interface RendererHost {
url.mojom.Url url,
mojo_base.mojom.String16 url_title,
int32 call_type);

// Asks the browser to wake the event page of an extension.
WakeEventPage(string extension_id) => (bool success);
};
44 changes: 27 additions & 17 deletions extensions/renderer/dispatcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,9 @@ Dispatcher::Dispatcher(std::unique_ptr<DispatcherDelegate> delegate)
std::make_unique<ScriptInjectionManager>(user_script_set_manager_.get());
user_script_set_manager_observation_.Observe(user_script_set_manager_.get());
PopulateSourceMap();
#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
WakeEventPage::Get()->Init(RenderThread::Get());
#endif
// Ideally this should be done after checking
// ExtensionAPIEnabledInExtensionServiceWorkers(), but the Dispatcher is
// created so early that sending an IPC from browser/ process to synchronize
Expand Down Expand Up @@ -548,16 +550,18 @@ void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread(
context->set_service_worker_scope(service_worker_scope);
context->set_service_worker_version_id(service_worker_version_id);

WorkerThreadDispatcher* worker_dispatcher = WorkerThreadDispatcher::Get();
absl::optional<base::UnguessableToken> worker_activation_token =
RendererExtensionRegistry::Get()->GetWorkerActivationToken(
extension->id());

if (ExtensionsRendererClient::Get()
->ExtensionAPIEnabledForServiceWorkerScript(service_worker_scope,
script_url)) {
WorkerThreadDispatcher* worker_dispatcher = WorkerThreadDispatcher::Get();
std::unique_ptr<IPCMessageSender> ipc_sender =
IPCMessageSender::CreateWorkerThreadIPCMessageSender(
worker_dispatcher, context_proxy, service_worker_version_id);
base::UnguessableToken worker_activation_token =
*RendererExtensionRegistry::Get()->GetWorkerActivationToken(
extension->id());
CHECK(worker_activation_token.has_value());
worker_dispatcher->AddWorkerData(
context_proxy, service_worker_version_id, worker_activation_token,
context,
Expand All @@ -581,10 +585,14 @@ void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread(
// TODO(lazyboy): Get rid of RequireGuestViewModules() as this doesn't seem
// necessary for Extension SW.
RequireGuestViewModules(context);

WorkerThreadDispatcher::GetServiceWorkerData()->Init();
} else {
// For ServiceWorkers that do not have native bindings API attached we
// still create the WorkerData as native logging and wake event page
// will still be bound below.
worker_dispatcher->AddWorkerData(context_proxy, service_worker_version_id,
worker_activation_token, context, nullptr);
}

WorkerThreadDispatcher::GetServiceWorkerData()->Init();
g_worker_script_context_set.Get().Insert(base::WrapUnique(context));

v8::Isolate* isolate = context->isolate();
Expand Down Expand Up @@ -631,7 +639,7 @@ void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread(
v8_helpers::ToV8StringUnsafe(
isolate, BackgroundInfo::GetBackgroundURL(extension).spec()),
// The wake-event-page native function.
WakeEventPage::Get()->GetForContext(context),
WakeEventPage::GetForContext(context),
// The logging module.
logging->NewInstance(),
};
Expand Down Expand Up @@ -673,7 +681,7 @@ void Dispatcher::DidStartServiceWorkerContextOnWorkerThread(
auto* service_worker_data = WorkerThreadDispatcher::GetServiceWorkerData();
service_worker_data->GetServiceWorkerHost()->DidStartServiceWorkerContext(
service_worker_data->context()->GetExtensionID(),
service_worker_data->activation_sequence(), service_worker_scope,
*service_worker_data->activation_sequence(), service_worker_scope,
service_worker_version_id, thread_id);
#endif
}
Expand All @@ -695,17 +703,19 @@ void Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread(
// WorkerThreadDispatcher? If so, we should move the initialization as well.
ScriptContext* script_context = service_worker_data->context();
NativeExtensionBindingsSystem* worker_bindings_system =
WorkerThreadDispatcher::GetBindingsSystem();
worker_bindings_system->WillReleaseScriptContext(script_context);
service_worker_data->bindings_system();
if (worker_bindings_system) {
worker_bindings_system->WillReleaseScriptContext(script_context);
#if BUILDFLAG(ENABLE_EXTENSIONS_LEGACY_IPC)
WorkerThreadDispatcher::Get()->DidStopContext(service_worker_scope,
service_worker_version_id);
WorkerThreadDispatcher::Get()->DidStopContext(service_worker_scope,
service_worker_version_id);
#else
service_worker_data->GetServiceWorkerHost()->DidStopServiceWorkerContext(
script_context->GetExtensionID(),
service_worker_data->activation_sequence(), service_worker_scope,
service_worker_version_id, thread_id);
service_worker_data->GetServiceWorkerHost()->DidStopServiceWorkerContext(
script_context->GetExtensionID(),
*service_worker_data->activation_sequence(), service_worker_scope,
service_worker_version_id, thread_id);
#endif
}
// Note: we have to remove the context (and thus perform invalidation on
// the native handlers) prior to removing the worker data, which destroys
// the associated bindings system.
Expand Down

0 comments on commit 531abf9

Please sign in to comment.