#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_IMPL_H_
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_IMPL_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include "base/containers/flat_set.h"
#include "base/functional/bind.h"
#include "base/functional/callback_forward.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/memory/safe_ref.h"
#include "base/observer_list.h"
#include "base/scoped_observation_traits.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/sequence_bound.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/services/storage/public/cpp/buckets/bucket_id.h"
#include "components/services/storage/public/cpp/buckets/bucket_info.h"
#include "components/services/storage/public/cpp/quota_error_or.h"
#include "content/browser/child_process_launcher.h"
#include "content/browser/renderer_host/media/aec_dump_manager_impl.h"
#include "content/browser/renderer_host/render_process_host_internal_observer.h"
#include "content/browser/storage_partition_impl.h"
#include "content/browser/tracing/tracing_service_controller.h"
#include "content/common/child_process.mojom.h"
#include "content/common/content_export.h"
#include "content/common/media/media_log_records.mojom-forward.h"
#include "content/common/renderer.mojom.h"
#include "content/common/renderer_host.mojom.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "media/mojo/mojom/interface_factory.mojom-forward.h"
#include "media/mojo/mojom/video_decode_perf_history.mojom-forward.h"
#include "media/mojo/mojom/webrtc_video_perf.mojom-forward.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
#include "mojo/public/cpp/system/invitation.h"
#include "net/base/network_isolation_key.h"
#include "ppapi/buildflags/buildflags.h"
#include "services/network/public/mojom/p2p.mojom-forward.h"
#include "services/network/public/mojom/url_loader_factory.mojom-forward.h"
#include "services/resource_coordinator/public/mojom/memory_instrumentation/memory_instrumentation.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "services/tracing/public/mojom/traced_process.mojom-forward.h"
#include "services/viz/public/mojom/compositing/compositing_mode_watcher.mojom.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#include "third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom-forward.h"
#include "third_party/blink/public/mojom/background_sync/background_sync.mojom-forward.h"
#include "third_party/blink/public/mojom/buckets/bucket_manager_host.mojom-forward.h"
#include "third_party/blink/public/mojom/dom_storage/dom_storage.mojom.h"
#include "third_party/blink/public/mojom/filesystem/file_system.mojom-forward.h"
#include "third_party/blink/public/mojom/frame_sinks/embedded_frame_sink.mojom-forward.h"
#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-shared.h"
#include "third_party/blink/public/mojom/loader/code_cache.mojom-forward.h"
#include "third_party/blink/public/mojom/plugins/plugin_registry.mojom-forward.h"
#include "third_party/blink/public/mojom/push_messaging/push_messaging.mojom-forward.h"
#include "third_party/blink/public/mojom/webdatabase/web_database.mojom-forward.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_proto.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
#include "ui/gfx/gpu_memory_buffer.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/memory/memory_pressure_listener.h"
#include "content/public/browser/android/child_process_importance.h"
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#include "media/mojo/mojom/stable/stable_video_decoder.mojom.h"
#endif
#if BUILDFLAG(IS_FUCHSIA)
#include "media/fuchsia_media_codec_provider_impl.h"
#endif
namespace base {
class CommandLine;
class PersistentMemoryAllocator;
#if BUILDFLAG(IS_ANDROID)
namespace android {
enum class ChildBindingState;
}
#endif
#ifdef OHOS_THEME_FONT
class File;
class FilePath;
#endif
}
namespace blink {
class AssociatedInterfaceRegistry;
class StorageKey;
}
namespace perfetto {
namespace protos {
namespace pbzero {
class RenderProcessHost;
}
}
}
namespace tracing {
class SystemTracingService;
}
namespace url {
class Origin;
}
namespace viz {
class GpuClient;
}
namespace content {
class AgentSchedulingGroupHost;
class BucketContext;
class EmbeddedFrameSinkProviderImpl;
class FileSystemManagerImpl;
class FramelessMediaInterfaceProxy;
class InProcessChildThreadParams;
class IsolationContext;
class MediaStreamTrackMetricsHost;
class P2PSocketDispatcherHost;
class PepperRendererConnection;
class PermissionServiceContext;
class PluginRegistryImpl;
class ProcessLock;
class PushMessagingManager;
class RenderProcessHostCreationObserver;
class RenderProcessHostFactory;
class RenderProcessHostPriorityClients;
class RenderProcessHostTestBase;
class RenderWidgetHelper;
class SiteInfo;
class SiteInstance;
class SiteInstanceImpl;
struct ChildProcessTerminationInfo;
struct GlobalRenderFrameHostId;
typedef base::Thread* (*RendererMainThreadFactoryFunction)(
const InProcessChildThreadParams& params,
int32_t renderer_client_id);
#ifdef OHOS_THEME_FONT
struct ThemeFont {
base::FilePath flag_path;
base::FilePath manifest_path;
base::FilePath font_path;
base::File font_file;
};
#endif
#if defined(OHOS_RENDER_PROCESS_SHARE)
typedef std::map<std::string, RenderProcessHost*>
SharedProcessTokenToProcessMap;
#endif
class CONTENT_EXPORT RenderProcessHostImpl
: public RenderProcessHost,
public ChildProcessLauncher::Client,
public mojom::RendererHost,
public blink::mojom::DomStorageProvider,
public memory_instrumentation::mojom::CoordinatorConnector {
public:
static const unsigned int kMaxFrameDepthForPriority;
static constexpr int kKeepAliveHandleFactoryTimeoutInMSec = 30 * 1000;
static const base::TimeDelta kKeepAliveHandleFactoryTimeout;
static RenderProcessHost* CreateRenderProcessHost(
BrowserContext* browser_context,
SiteInstanceImpl* site_instance);
#if BUILDFLAG(IS_OHOS)
static void Refresh();
#endif
~RenderProcessHostImpl() override;
RenderProcessHostImpl(const RenderProcessHostImpl& other) = delete;
RenderProcessHostImpl& operator=(const RenderProcessHostImpl& other) = delete;
bool Init() override;
void EnableSendQueue() override;
int GetNextRoutingID() override;
void AddRoute(int32_t routing_id, IPC::Listener* listener) override;
void RemoveRoute(int32_t routing_id) override;
void AddObserver(RenderProcessHostObserver* observer) override;
void RemoveObserver(RenderProcessHostObserver* observer) override;
void ShutdownForBadMessage(CrashReportMode crash_report_mode) override;
void UpdateClientPriority(RenderProcessHostPriorityClient* client) override;
int VisibleClientCount() override;
unsigned int GetFrameDepth() override;
bool GetIntersectsViewport() override;
bool IsForGuestsOnly() override;
bool IsJitDisabled() override;
bool IsPdf() override;
StoragePartitionImpl* GetStoragePartition() override;
bool Shutdown(int exit_code) override;
bool ShutdownRequested() override;
bool FastShutdownIfPossible(size_t page_count = 0,
bool skip_unload_handlers = false) override;
const base::Process& GetProcess() override;
bool IsReady() override;
BrowserContext* GetBrowserContext() override;
bool InSameStoragePartition(StoragePartition* partition) override;
int GetID() const override;
base::SafeRef<RenderProcessHost> GetSafeRef() const override;
bool IsInitializedAndNotDead() override;
void SetBlocked(bool blocked) override;
bool IsBlocked() override;
base::CallbackListSubscription RegisterBlockStateChangedCallback(
const BlockStateChangedCallback& cb) override;
void Cleanup() override;
void AddPendingView() override;
void RemovePendingView() override;
void AddPriorityClient(
RenderProcessHostPriorityClient* priority_client) override;
void RemovePriorityClient(
RenderProcessHostPriorityClient* priority_client) override;
void SetPriorityOverride(bool foreground) override;
bool HasPriorityOverride() override;
void ClearPriorityOverride() override;
#if BUILDFLAG(IS_ANDROID)
ChildProcessImportance GetEffectiveImportance() override;
base::android::ChildBindingState GetEffectiveChildBindingState() override;
void DumpProcessStack() override;
#endif
void SetSuddenTerminationAllowed(bool enabled) override;
bool SuddenTerminationAllowed() override;
IPC::ChannelProxy* GetChannel() override;
void AddFilter(BrowserMessageFilter* filter) override;
bool FastShutdownStarted() override;
base::TimeDelta GetChildProcessIdleTime() override;
void FilterURL(bool empty_allowed, GURL* url) override;
void EnableAudioDebugRecordings(const base::FilePath& file) override;
void DisableAudioDebugRecordings() override;
WebRtcStopRtpDumpCallback StartRtpDump(
bool incoming,
bool outgoing,
WebRtcRtpPacketCallback packet_callback) override;
void BindReceiver(mojo::GenericPendingReceiver receiver) override;
std::unique_ptr<base::PersistentMemoryAllocator> TakeMetricsAllocator()
override;
const base::TimeTicks& GetLastInitTime() override;
bool IsProcessBackgrounded() override;
#ifdef OHOS_RENDER_PROCESS_MODE
const base::TimeTicks& ProcessBackgroundTime() override;
#endif
void IncrementKeepAliveRefCount(uint64_t handle_id_) override;
void DecrementKeepAliveRefCount(uint64_t handle_id_) override;
std::string GetKeepAliveDurations() const override;
size_t GetShutdownDelayRefCount() const override;
int GetRenderFrameHostCount() const override;
void RegisterRenderFrameHost(
const GlobalRenderFrameHostId& render_frame_host_id) override;
void UnregisterRenderFrameHost(
const GlobalRenderFrameHostId& render_frame_host_id) override;
void ForEachRenderFrameHost(base::RepeatingCallback<void(RenderFrameHost*)>
on_render_frame_host) override;
void IncrementWorkerRefCount() override;
void DecrementWorkerRefCount() override;
void IncrementPendingReuseRefCount() override;
void DecrementPendingReuseRefCount() override;
void DisableRefCounts() override;
bool AreRefCountsDisabled() override;
mojom::Renderer* GetRendererInterface() override;
void CreateURLLoaderFactory(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
network::mojom::URLLoaderFactoryParamsPtr params) override;
bool MayReuseHost() override;
bool IsUnused() override;
void SetIsUsed() override;
bool HostHasNotBeenUsed() override;
void SetProcessLock(const IsolationContext& isolation_context,
const ProcessLock& process_lock) override;
ProcessLock GetProcessLock() const override;
bool IsProcessLockedToSiteForTesting() override;
void BindCacheStorage(
const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter>
coep_reporter,
const storage::BucketLocator& bucket_locator,
mojo::PendingReceiver<blink::mojom::CacheStorage> receiver) override;
void BindIndexedDB(
const blink::StorageKey& storage_key,
const GlobalRenderFrameHostId& rfh_id,
mojo::PendingReceiver<blink::mojom::IDBFactory> receiver) override;
void BindBucketManagerHost(
base::WeakPtr<BucketContext> bucket_context,
mojo::PendingReceiver<blink::mojom::BucketManagerHost> receiver) override;
void ForceCrash() override;
std::string GetInfoForBrowserContextDestructionCrashReporting() override;
void WriteIntoTrace(perfetto::TracedProto<TraceProto> proto) const override;
#if BUILDFLAG(CLANG_PROFILING_INSIDE_SANDBOX)
void DumpProfilingData(base::OnceClosure callback) override;
#endif
void PauseSocketManagerForRenderFrameHost(
const GlobalRenderFrameHostId& render_frame_host_id) override;
void ResumeSocketManagerForRenderFrameHost(
const GlobalRenderFrameHostId& render_frame_host_id) override;
#if BUILDFLAG(IS_ANDROID)
void SetAttributionReportingSupport(
network::mojom::AttributionSupport) override;
#endif
bool Send(IPC::Message* msg) override;
bool OnMessageReceived(const IPC::Message& msg) override;
void OnAssociatedInterfaceRequest(
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle handle) override;
void OnChannelConnected(int32_t peer_pid) override;
void OnChannelError() override;
void OnBadMessageReceived(const IPC::Message& message) override;
void OnProcessLaunched() override;
void OnProcessLaunchFailed(int error_code) override;
void mark_child_process_activity_time() {
child_process_activity_time_ = base::TimeTicks::Now();
}
bool TakeFrameTokensForFrameRoutingID(
int32_t new_routing_id,
blink::LocalFrameToken& frame_token,
base::UnguessableToken& devtools_frame_token,
blink::DocumentToken& document_token);
void AddInternalObserver(RenderProcessHostInternalObserver* observer);
void RemoveInternalObserver(RenderProcessHostInternalObserver* observer);
static void RegisterHost(int host_id, RenderProcessHost* host);
static void UnregisterHost(int host_id);
static void RegisterCreationObserver(
RenderProcessHostCreationObserver* observer);
static void UnregisterCreationObserver(
RenderProcessHostCreationObserver* observer);
static void FilterURL(RenderProcessHost* rph, bool empty_allowed, GURL* url);
static size_t GetProcessCount();
static size_t GetProcessCountForLimit();
static bool IsSuitableHost(RenderProcessHost* host,
const IsolationContext& isolation_context,
const SiteInfo& site_info);
static bool MayReuseAndIsSuitable(RenderProcessHost* host,
const IsolationContext& isolation_context,
const SiteInfo& site_info);
static bool MayReuseAndIsSuitable(RenderProcessHost* host,
SiteInstanceImpl* site_instance);
static RenderProcessHost* GetSoleProcessHostForSite(
const IsolationContext& isolation_context,
const SiteInfo& site_info);
static void RegisterSoleProcessHostForSite(RenderProcessHost* process,
SiteInstanceImpl* site_instance);
static RenderProcessHost* GetProcessHostForSiteInstance(
SiteInstanceImpl* site_instance);
static void NotifySpareManagerAboutRecentlyUsedBrowserContext(
BrowserContext* browser_context);
enum class SpareProcessMaybeTakeAction {
kNoSparePresent = 0,
kMismatchedBrowserContext = 1,
kMismatchedStoragePartition = 2,
kRefusedByEmbedder = 3,
kSpareTaken = 4,
kRefusedBySiteInstance = 5,
kRefusedForPdfContent = 6,
kMaxValue = kRefusedForPdfContent
};
static scoped_refptr<base::SingleThreadTaskRunner>
GetInProcessRendererThreadTaskRunnerForTesting();
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
static size_t GetPlatformMaxRendererProcessCount();
#endif
static void ShutDownInProcessRenderer();
static void RegisterRendererMainThreadFactory(
RendererMainThreadFactoryFunction create);
using DomStorageBinder = base::RepeatingCallback<void(
RenderProcessHostImpl* rph,
mojo::PendingReceiver<blink::mojom::DomStorage> receiver)>;
static void SetDomStorageBinderForTesting(DomStorageBinder binder);
static bool HasDomStorageBinderForTesting();
using BadMojoMessageCallbackForTesting =
base::RepeatingCallback<void(int render_process_host_id,
const std::string& error)>;
static void SetBadMojoMessageCallbackForTesting(
BadMojoMessageCallbackForTesting callback);
void SetForGuestsOnlyForTesting();
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_MAC)
static void EarlyZygoteLaunch();
#endif
void OnMediaStreamAdded() override;
void OnMediaStreamRemoved() override;
int get_media_stream_count_for_testing() const { return media_stream_count_; }
void OnForegroundServiceWorkerAdded() override;
void OnForegroundServiceWorkerRemoved() override;
static void set_render_process_host_factory_for_testing(
RenderProcessHostFactory* rph_factory);
static RenderProcessHostFactory*
get_render_process_host_factory_for_testing();
static void AddFrameWithSite(BrowserContext* browser_context,
RenderProcessHost* render_process_host,
const SiteInfo& site_info);
static void RemoveFrameWithSite(BrowserContext* browser_context,
RenderProcessHost* render_process_host,
const SiteInfo& site_info);
static void AddExpectedNavigationToSite(
BrowserContext* browser_context,
RenderProcessHost* render_process_host,
const SiteInfo& site_info);
static void RemoveExpectedNavigationToSite(
BrowserContext* browser_context,
RenderProcessHost* render_process_host,
const SiteInfo& site_info);
static void DiscardSpareRenderProcessHostForTesting();
static bool IsSpareProcessKeptAtAllTimes();
static bool IsSpareProcessForCrashReporting(
RenderProcessHost* render_process_host);
PermissionServiceContext& permission_service_context() {
return *permission_service_context_;
}
bool is_initialized() const { return is_initialized_; }
bool is_dead() const {return is_dead_; }
void DelayProcessShutdown(const base::TimeDelta& subframe_shutdown_timeout,
const base::TimeDelta& unload_handler_timeout,
const SiteInfo& site_info) override;
bool IsProcessShutdownDelayedForTesting();
void StopTrackingProcessForShutdownDelay() override;
void BindFileSystemManager(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::FileSystemManager> receiver) override;
void BindFileSystemAccessManager(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::FileSystemAccessManager> receiver)
override;
void GetSandboxedFileSystemForBucket(
const storage::BucketLocator& bucket_locator,
blink::mojom::FileSystemAccessManager::GetSandboxedFileSystemCallback
callback) override;
FileSystemManagerImpl* GetFileSystemManagerForTesting() {
return file_system_manager_impl_.get();
}
void BindRestrictedCookieManagerForServiceWorker(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<network::mojom::RestrictedCookieManager> receiver)
override;
void BindVideoDecodePerfHistory(
mojo::PendingReceiver<media::mojom::VideoDecodePerfHistory> receiver)
override;
void BindWebrtcVideoPerfHistory(
mojo::PendingReceiver<media::mojom::WebrtcVideoPerfHistory> receiver);
void BindPushMessaging(
mojo::PendingReceiver<blink::mojom::PushMessaging> receiver);
#if BUILDFLAG(IS_FUCHSIA)
void BindMediaCodecProvider(
mojo::PendingReceiver<media::mojom::FuchsiaMediaCodecProvider> receiver)
override;
#endif
void CreateOneShotSyncService(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService>
receiver) override;
void CreatePeriodicSyncService(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService>
receiver) override;
void BindQuotaManagerHost(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver) override;
void CreateLockManager(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::LockManager> receiver) override;
void CreatePermissionService(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::PermissionService> receiver) override;
void CreatePaymentManagerForOrigin(
const url::Origin& origin,
mojo::PendingReceiver<payments::mojom::PaymentManager> receiver) override;
void CreateNotificationService(
GlobalRenderFrameHostId rfh_id,
RenderProcessHost::NotificationServiceCreatorType creator_type,
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::NotificationService> receiver)
override;
void CreateWebSocketConnector(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver)
override;
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
void CreateStableVideoDecoder(
mojo::PendingReceiver<media::stable::mojom::StableVideoDecoder> receiver)
override;
#endif
void BindP2PSocketManager(
net::NetworkAnonymizationKey isolation_key,
mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver,
GlobalRenderFrameHostId render_frame_host_id);
using IpcSendWatcher = base::RepeatingCallback<void(const IPC::Message& msg)>;
void SetIpcSendWatcherForTesting(IpcSendWatcher watcher) {
ipc_send_watcher_for_testing_ = std::move(watcher);
}
#if BUILDFLAG(ENABLE_PPAPI)
PepperRendererConnection* pepper_renderer_connection() {
return pepper_renderer_connection_.get();
}
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
void ReinitializeLogging(uint32_t logging_dest,
base::ScopedFD log_file_descriptor) override;
#endif
int keep_alive_ref_count() const { return keep_alive_ref_count_; }
int worker_ref_count() const { return worker_ref_count_; }
using CreateNetworkFactoryCallback = base::RepeatingCallback<void(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
int worker_process_id,
mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)>;
static void SetNetworkFactoryForTesting(
const CreateNetworkFactoryCallback& url_loader_factory_callback);
#if BUILDFLAG(IS_ANDROID)
void NotifyMemoryPressureToRenderer(
base::MemoryPressureListener::MemoryPressureLevel level);
uint64_t GetPrivateMemoryFootprint() const {
return private_memory_footprint_bytes_;
}
#endif
#if defined(OHOS_RENDERER_ANR_DUMP)
void dumpCurrentJavaScriptStackInMainThread(
base::OnceCallback<void(const std::string&)> dump_callback) override;
void InvokeRenderCrashDump() override;
#endif
#ifdef OHOS_THEME_FONT
static ThemeFont* EnsureThemeFont();
static bool IsThemeFontValid();
void OnThemeFontChange() override;
void UpdateThemeFontFile(base::File theme_font_file);
#endif
#if defined(OHOS_RENDER_PROCESS_SHARE)
static RenderProcessHost* GetProcessForSharedToken(
const std::string& shared_render_process_token);
static void RegisteProcessForSharedToken(
const std::string& shared_render_process_token,
RenderProcessHost* renderProcessHost);
static void RemoveFromSharedRenderProcessMap(
RenderProcessHost* renderProcessHost);
#endif
#ifdef OHOS_I18N
void NotifyLocaleChanged(const std::string& update_locale);
#endif
protected:
std::unique_ptr<IPC::ChannelProxy> channel_;
bool fast_shutdown_started_ = false;
bool shutdown_requested_ = false;
bool deleting_soon_ = false;
#ifndef NDEBUG
bool is_self_deleted_ = false;
#endif
int32_t pending_views_ = 0;
private:
friend class ChildProcessLauncherBrowserTest_ChildSpawnFail_Test;
friend class RenderFrameHostImplSubframeReuseBrowserTest_MultipleDelays_Test;
friend class VisitRelayingRenderProcessHost;
friend class StoragePartitonInterceptor;
friend class RenderProcessHostTestBase;
friend class AgentSchedulingGroupHost;
enum RenderProcessFlags : int {
kNone = 0,
kForGuestsOnly = 1 << 0,
kJitDisabled = 1 << 1,
kPdf = 1 << 2,
};
RenderProcessHostImpl(BrowserContext* browser_context,
StoragePartitionImpl* storage_partition_impl,
int flags);
void InitializeChannelProxy();
void ResetChannelProxy();
void CreateMessageFilters();
void RegisterMojoInterfaces();
using BrowserHistogramCallback =
mojom::RendererHost::GetBrowserHistogramCallback;
void GetBrowserHistogram(const std::string& name,
BrowserHistogramCallback callback) override;
void SuddenTerminationChanged(bool enabled) override;
void RecordUserMetricsAction(const std::string& action) override;
#if BUILDFLAG(IS_ANDROID)
void SetPrivateMemoryFootprint(
uint64_t private_memory_footprint_bytes) override;
#endif
#if defined(OHOS_LOGGER_REPORT)
void ReportRendererLog(int policy, const std::string& msg) override;
#endif
void CreateEmbeddedFrameSinkProvider(
mojo::PendingReceiver<blink::mojom::EmbeddedFrameSinkProvider> receiver);
void BindCompositingModeReporter(
mojo::PendingReceiver<viz::mojom::CompositingModeReporter> receiver);
void CreateDomStorageProvider(
mojo::PendingReceiver<blink::mojom::DomStorageProvider> receiver);
void CreateRendererHost(
mojo::PendingAssociatedReceiver<mojom::RendererHost> receiver);
void BindMediaInterfaceProxy(
mojo::PendingReceiver<media::mojom::InterfaceFactory> receiver);
void BindWebDatabaseHostImpl(
mojo::PendingReceiver<blink::mojom::WebDatabaseHost> receiver);
void BindAecDumpManager(
mojo::PendingReceiver<blink::mojom::AecDumpManager> receiver);
void CreateMediaLogRecordHost(
mojo::PendingReceiver<content::mojom::MediaInternalLogRecords> receiver);
#if BUILDFLAG(ENABLE_PLUGINS)
void BindPluginRegistry(
mojo::PendingReceiver<blink::mojom::PluginRegistry> receiver);
#endif
void BindDomStorage(
mojo::PendingReceiver<blink::mojom::DomStorage> receiver,
mojo::PendingRemote<blink::mojom::DomStorageClient> client) override;
void RegisterCoordinatorClient(
mojo::PendingReceiver<memory_instrumentation::mojom::Coordinator>
receiver,
mojo::PendingRemote<memory_instrumentation::mojom::ClientProcess>
client_process) override;
void AppendRendererCommandLine(base::CommandLine* command_line);
void PropagateBrowserCommandLineToRenderer(
const base::CommandLine& browser_cmd,
base::CommandLine* renderer_cmd);
void UpdateProcessPriorityInputs();
void UpdateProcessPriority();
void UpdateControllerServiceWorkerProcessPriority();
void SendProcessStateToRenderer();
void CreateSharedRendererHistogramAllocator();
ChildProcessTerminationInfo GetChildTerminationInfo(bool already_dead);
void ProcessDied(const ChildProcessTerminationInfo& termination_info);
void ResetIPC();
bool HasOnlyNonLiveRenderFrameHosts();
void CreateLockManagerWithBucketInfo(
mojo::PendingReceiver<blink::mojom::LockManager> receiver,
storage::QuotaErrorOr<storage::BucketInfo> bucket);
static RenderProcessHost* GetExistingProcessHost(
SiteInstanceImpl* site_instance);
FRIEND_TEST_ALL_PREFIXES(RenderProcessHostUnitTest,
GuestsAreNotSuitableHosts);
#ifdef OHOS_RENDER_PROCESS_MODE
static RenderProcessHost* GetExistingBackgroundProcessHost();
friend class DelayedRenderKiller;
#endif
static RenderProcessHost* FindReusableProcessHostForSiteInstance(
SiteInstanceImpl* site_instance,
absl::optional<size_t> main_frame_threshold = absl::nullopt);
void NotifyRendererOfLockedStateUpdate();
#if BUILDFLAG(IS_ANDROID)
void PopulateTerminationInfoRendererFields(ChildProcessTerminationInfo* info);
#endif
static void OnMojoError(int render_process_id, const std::string& error);
template <typename InterfaceType>
using AddReceiverCallback =
base::RepeatingCallback<void(mojo::PendingReceiver<InterfaceType>)>;
template <typename CallbackType>
struct InterfaceGetter;
template <typename InterfaceType>
struct InterfaceGetter<AddReceiverCallback<InterfaceType>> {
static void GetInterfaceOnUIThread(
base::WeakPtr<RenderProcessHostImpl> weak_host,
AddReceiverCallback<InterfaceType> callback,
mojo::PendingReceiver<InterfaceType> receiver) {
if (!weak_host)
return;
std::move(callback).Run(std::move(receiver));
}
};
template <typename CallbackType>
void AddUIThreadInterface(service_manager::BinderRegistry* registry,
CallbackType callback) {
registry->AddInterface(
base::BindRepeating(
&InterfaceGetter<CallbackType>::GetInterfaceOnUIThread,
instance_weak_factory_.GetWeakPtr(), std::move(callback)),
GetUIThreadTaskRunner({}));
}
void CancelProcessShutdownDelay(const SiteInfo& site_info);
void BindTracedProcess(
mojo::PendingReceiver<tracing::mojom::TracedProcess> receiver);
void OnBindHostReceiver(mojo::GenericPendingReceiver receiver);
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
void ProvideStatusFileForRenderer();
#endif
void ProvideSwapFileForRenderer();
bool AreAllRefCountsZero();
mojo::OutgoingInvitation mojo_invitation_;
int keep_alive_ref_count_ = 0;
int worker_ref_count_ = 0;
int shutdown_delay_ref_count_ = 0;
int pending_reuse_ref_count_ = 0;
base::flat_map<uint64_t, base::Time> keep_alive_start_times_;
bool are_ref_counts_disabled_ = false;
base::IDMap<IPC::Listener*> listeners_;
std::unique_ptr<blink::AssociatedInterfaceRegistry> associated_interfaces_;
int32_t visible_clients_ = 0;
unsigned int frame_depth_ = kMaxFrameDepthForPriority;
bool intersects_viewport_ = false;
#if BUILDFLAG(IS_ANDROID)
ChildProcessImportance effective_importance_ = ChildProcessImportance::NORMAL;
#endif
base::flat_set<RenderProcessHostPriorityClient*> priority_clients_;
RenderProcessPriority priority_;
absl::optional<bool> priority_override_;
scoped_refptr<RenderWidgetHelper> widget_helper_;
std::unique_ptr<base::Thread> in_process_renderer_;
bool is_initialized_ = false;
bool is_dead_ = false;
base::TimeTicks last_init_time_;
std::unique_ptr<ChildProcessLauncher> child_process_launcher_;
const int id_;
RAW_PTR_EXCLUSION BrowserContext* browser_context_ = nullptr;
base::WeakPtr<StoragePartitionImpl> storage_partition_impl_;
mojo::Receiver<blink::mojom::DomStorageProvider>
dom_storage_provider_receiver_{this};
std::set<mojo::ReceiverId> dom_storage_receiver_ids_;
std::set<GlobalRenderFrameHostId> render_frame_host_id_set_;
base::ObserverList<RenderProcessHostObserver> observers_;
base::ObserverList<RenderProcessHostInternalObserver> internal_observers_;
bool sudden_termination_allowed_ = true;
bool is_blocked_ = false;
BlockStateChangedCallbackList blocked_state_changed_callback_list_;
base::TimeTicks child_process_activity_time_;
int flags_;
bool is_unused_ = true;
bool delayed_cleanup_needed_ = false;
bool within_process_died_observer_ = false;
std::unique_ptr<P2PSocketDispatcherHost> p2p_socket_dispatcher_host_;
AecDumpManagerImpl aec_dump_manager_;
std::unique_ptr<MediaStreamTrackMetricsHost, BrowserThread::DeleteOnIOThread>
media_stream_track_metrics_host_;
std::unique_ptr<FramelessMediaInterfaceProxy> media_interface_proxy_;
std::unique_ptr<PermissionServiceContext> permission_service_context_;
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
mojo::Remote<media::stable::mojom::StableVideoDecoderFactory>
stable_video_decoder_factory_remote_;
#endif
#if BUILDFLAG(IS_FUCHSIA)
std::unique_ptr<FuchsiaMediaCodecProviderImpl> media_codec_provider_;
#endif
std::unique_ptr<base::PersistentMemoryAllocator> metrics_allocator_;
bool channel_connected_ = false;
bool sent_render_process_ready_ = false;
std::unique_ptr<FileSystemManagerImpl, BrowserThread::DeleteOnIOThread>
file_system_manager_impl_;
std::unique_ptr<viz::GpuClient> gpu_client_;
std::unique_ptr<PushMessagingManager> push_messaging_manager_;
std::unique_ptr<EmbeddedFrameSinkProviderImpl> embedded_frame_sink_provider_;
#if BUILDFLAG(ENABLE_PLUGINS)
std::unique_ptr<PluginRegistryImpl> plugin_registry_;
#endif
mojo::Remote<mojom::ChildProcess> child_process_;
mojo::PendingReceiver<mojom::ChildProcessHost> child_host_pending_receiver_;
mojo::AssociatedRemote<mojom::Renderer> renderer_interface_;
mojo::AssociatedReceiver<mojom::RendererHost> renderer_host_receiver_{this};
mojo::Receiver<memory_instrumentation::mojom::CoordinatorConnector>
coordinator_connector_receiver_{this};
int media_stream_count_ = 0;
int foreground_service_worker_count_ = 0;
std::unique_ptr<mojo::Receiver<viz::mojom::CompositingModeReporter>>
compositing_mode_reporter_;
base::TimeDelta time_spent_running_unload_handlers_;
int shutdown_exit_code_ = -1;
IpcSendWatcher ipc_send_watcher_for_testing_;
std::unique_ptr<TracingServiceController::ClientRegistration>
tracing_registration_;
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
std::unique_ptr<tracing::SystemTracingService> system_tracing_service_;
#endif
#if BUILDFLAG(ENABLE_PPAPI)
scoped_refptr<PepperRendererConnection> pepper_renderer_connection_;
#endif
#if BUILDFLAG(IS_ANDROID)
uint64_t private_memory_footprint_bytes_ = 0u;
#endif
#ifdef OHOS_THEME_FONT
static std::unique_ptr<ThemeFont> g_theme_font_;
#endif
class IOThreadHostImpl;
friend class IOThreadHostImpl;
absl::optional<base::SequenceBound<IOThreadHostImpl>> io_thread_host_impl_;
base::WeakPtrFactory<RenderProcessHostImpl> instance_weak_factory_{this};
base::WeakPtrFactory<RenderProcessHostImpl> safe_ref_factory_{this};
};
}
namespace base {
template <>
struct ScopedObservationTraits<content::RenderProcessHostImpl,
content::RenderProcessHostInternalObserver> {
static void AddObserver(
content::RenderProcessHostImpl* source,
content::RenderProcessHostInternalObserver* observer) {
source->AddInternalObserver(observer);
}
static void RemoveObserver(
content::RenderProcessHostImpl* source,
content::RenderProcessHostInternalObserver* observer) {
source->RemoveInternalObserver(observer);
}
};
}
#endif