Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1103)

Unified Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 1214883004: Fixed the audio backgrounding bug (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed bad rebase merge Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_process_host_impl.cc
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index ff87202bcccaf9b7b6daa3be1592569b477f4287..c6f6a5a2d00b0d5f8fb97938a322317df39a4d03 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -259,9 +259,8 @@ void GetContexts(
ResourceContext** resource_context_out,
net::URLRequestContext** request_context_out) {
*resource_context_out = resource_context;
- *request_context_out =
- GetRequestContext(request_context, media_request_context,
- request.resource_type);
+ *request_context_out = GetRequestContext(
+ request_context, media_request_context, request.resource_type);
}
#if defined(ENABLE_WEBRTC)
@@ -278,8 +277,8 @@ IPC::PlatformFileForTransit CreateAecDumpFileForProcess(
base::File dump_file(file_path,
base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND);
if (!dump_file.IsValid()) {
- VLOG(1) << "Could not open AEC dump file, error=" <<
- dump_file.error_details();
+ VLOG(1) << "Could not open AEC dump file, error="
+ << dump_file.error_details();
return IPC::InvalidPlatformFileForTransit();
}
return IPC::TakeFileHandleForProcess(dump_file.Pass(), process);
@@ -292,8 +291,8 @@ void DisableAecDumpOnFileThread() {
#endif
// the global list of all renderer processes
-base::LazyInstance<IDMap<RenderProcessHost> >::Leaky
- g_all_hosts = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<IDMap<RenderProcessHost>>::Leaky g_all_hosts =
+ LAZY_INSTANCE_INITIALIZER;
// Map of site to process, to ensure we only have one RenderProcessHost per
// site in process-per-site mode. Each map is specific to a BrowserContext.
@@ -317,14 +316,12 @@ class SiteProcessMap : public base::SupportsUserData::Data {
// Find all instances of this process in the map, then separately remove
// them.
std::set<std::string> sites;
- for (SiteToProcessMap::const_iterator i = map_.begin();
- i != map_.end();
+ for (SiteToProcessMap::const_iterator i = map_.begin(); i != map_.end();
i++) {
if (i->second == host)
sites.insert(i->first);
}
- for (std::set<std::string>::iterator i = sites.begin();
- i != sites.end();
+ for (std::set<std::string>::iterator i = sites.begin(); i != sites.end();
i++) {
SiteToProcessMap::iterator iter = map_.find(*i);
if (iter != map_.end()) {
@@ -358,7 +355,8 @@ class RendererSandboxedProcessLauncherDelegate
#if defined(OS_POSIX)
: ipc_fd_(channel->TakeClientFileDescriptor())
#endif // OS_POSIX
- {}
+ {
+ }
~RendererSandboxedProcessLauncherDelegate() override {}
@@ -386,9 +384,7 @@ class RendererSandboxedProcessLauncherDelegate
base::ScopedFD TakeIpcFd() override { return ipc_fd_.Pass(); }
#endif // OS_WIN
- SandboxType GetSandboxType() override {
- return SANDBOX_TYPE_RENDERER;
- }
+ SandboxType GetSandboxType() override { return SANDBOX_TYPE_RENDERER; }
private:
#if defined(OS_POSIX)
@@ -412,7 +408,7 @@ class SessionStorageHolder : public base::SupportsUserData::Data {
}
private:
- std::map<int, SessionStorageNamespaceMap >
+ std::map<int, SessionStorageNamespaceMap>
session_storage_namespaces_awaiting_close_;
DISALLOW_COPY_AND_ASSIGN(SessionStorageHolder);
};
@@ -434,7 +430,7 @@ RendererMainThreadFactoryFunction g_renderer_main_thread_factory = NULL;
base::MessageLoop* g_in_process_thread;
base::MessageLoop*
- RenderProcessHostImpl::GetInProcessRendererThreadForTesting() {
+RenderProcessHostImpl::GetInProcessRendererThreadForTesting() {
return g_in_process_thread;
}
@@ -508,7 +504,7 @@ RenderProcessHostImpl::RenderProcessHostImpl(
pending_views_(0),
mojo_application_host_(new MojoApplicationHost),
visible_widgets_(0),
- backgrounded_(true),
+ is_process_backgrounded_(false),
is_initialized_(false),
id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()),
browser_context_(browser_context),
@@ -553,11 +549,6 @@ RenderProcessHostImpl::RenderProcessHostImpl(
if (BootstrapSandboxManager::ShouldEnable())
AddObserver(BootstrapSandboxManager::GetInstance());
#endif
-
- // Note: When we create the RenderProcessHostImpl, it's technically
- // backgrounded, because it has no visible listeners. But the process
- // doesn't actually exist yet, so we'll Background it later, after
- // creation.
}
// static
@@ -570,8 +561,7 @@ void RenderProcessHostImpl::ShutDownInProcessRenderer() {
case 1: {
RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
AllHostsIterator().GetCurrentValue());
- FOR_EACH_OBSERVER(RenderProcessHostObserver,
- host->observers_,
+ FOR_EACH_OBSERVER(RenderProcessHostObserver, host->observers_,
RenderProcessHostDestroyed(host));
#ifndef NDEBUG
host->is_self_deleted_ = true;
@@ -617,7 +607,7 @@ RenderProcessHostImpl::~RenderProcessHostImpl() {
UnregisterHost(GetID());
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableGpuShaderDiskCache)) {
+ switches::kDisableGpuShaderDiskCache)) {
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
base::Bind(&RemoveShaderInfo, GetID()));
}
@@ -642,8 +632,8 @@ bool RenderProcessHostImpl::Init() {
browser_command_line.GetSwitchValueNative(switches::kRendererCmdPrefix);
#if defined(OS_LINUX)
- int flags = renderer_prefix.empty() ? ChildProcessHost::CHILD_ALLOW_SELF :
- ChildProcessHost::CHILD_NORMAL;
+ int flags = renderer_prefix.empty() ? ChildProcessHost::CHILD_ALLOW_SELF
+ : ChildProcessHost::CHILD_NORMAL;
#else
int flags = ChildProcessHost::CHILD_NORMAL;
#endif
@@ -681,8 +671,9 @@ bool RenderProcessHostImpl::Init() {
// on separate threads.
in_process_renderer_.reset(
g_renderer_main_thread_factory(InProcessChildThreadParams(
- channel_id, BrowserThread::UnsafeGetMessageLoopForThread(
- BrowserThread::IO)->task_runner())));
+ channel_id,
+ BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::IO)
+ ->task_runner())));
base::Thread::Options options;
#if defined(OS_WIN) && !defined(OS_MACOSX)
@@ -717,10 +708,8 @@ bool RenderProcessHostImpl::Init() {
// As long as there's no renderer prefix, we can use the zygote process
// at this stage.
child_process_launcher_.reset(new ChildProcessLauncher(
- new RendererSandboxedProcessLauncherDelegate(channel_.get()),
- cmd_line,
- GetID(),
- this));
+ new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line,
+ GetID(), this));
fast_shutdown_started_ = false;
}
@@ -743,7 +732,7 @@ scoped_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy(
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
scoped_refptr<base::SequencedTaskRunner> mojo_task_runner =
BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::IO)
- ->task_runner();
+ ->task_runner();
if (ShouldUseMojoChannel()) {
VLOG(1) << "Mojo Channel is enabled on host";
@@ -772,12 +761,9 @@ void RenderProcessHostImpl::CreateMessageFilters() {
scoped_refptr<RenderMessageFilter> render_message_filter(
new RenderMessageFilter(
- GetID(),
- GetBrowserContext(),
+ GetID(), GetBrowserContext(),
GetBrowserContext()->GetRequestContextForRenderProcess(GetID()),
- widget_helper_.get(),
- audio_manager,
- media_internals,
+ widget_helper_.get(), audio_manager, media_internals,
storage_partition_impl_->GetDOMStorageContext()));
AddFilter(render_message_filter.get());
AddFilter(new RenderFrameMessageFilter(
@@ -817,33 +803,25 @@ void RenderProcessHostImpl::CreateMessageFilters() {
// The AudioInputRendererHost and AudioRendererHost needs to be available for
// lookup, so it's stashed in a member variable.
audio_input_renderer_host_ = new AudioInputRendererHost(
- GetID(),
- base::GetProcId(GetHandle()),
- audio_manager,
- media_stream_manager,
- AudioMirroringManager::GetInstance(),
+ GetID(), base::GetProcId(GetHandle()), audio_manager,
+ media_stream_manager, AudioMirroringManager::GetInstance(),
BrowserMainLoop::GetInstance()->user_input_monitor());
AddFilter(audio_input_renderer_host_.get());
audio_renderer_host_ = new AudioRendererHost(
- GetID(),
- audio_manager,
- AudioMirroringManager::GetInstance(),
- media_internals,
- media_stream_manager,
+ GetID(), audio_manager, AudioMirroringManager::GetInstance(),
+ media_internals, media_stream_manager,
browser_context->GetResourceContext()->GetMediaDeviceIDSalt());
AddFilter(audio_renderer_host_.get());
AddFilter(
new MidiHost(GetID(), BrowserMainLoop::GetInstance()->midi_manager()));
AddFilter(new VideoCaptureHost(media_stream_manager));
AddFilter(new AppCacheDispatcherHost(
- storage_partition_impl_->GetAppCacheService(),
- GetID()));
+ storage_partition_impl_->GetAppCacheService(), GetID()));
AddFilter(new ClipboardMessageFilter);
AddFilter(new DOMStorageMessageFilter(
storage_partition_impl_->GetDOMStorageContext()));
AddFilter(new IndexedDBDispatcherHost(
- GetID(),
- storage_partition_impl_->GetURLRequestContext(),
+ GetID(), storage_partition_impl_->GetURLRequestContext(),
storage_partition_impl_->GetIndexedDBContext(),
ChromeBlobStorageContext::GetFor(browser_context)));
@@ -851,14 +829,12 @@ void RenderProcessHostImpl::CreateMessageFilters() {
AddFilter(gpu_message_filter_);
#if defined(ENABLE_WEBRTC)
AddFilter(new WebRTCIdentityServiceHost(
- GetID(),
- storage_partition_impl_->GetWebRTCIdentityStore(),
+ GetID(), storage_partition_impl_->GetWebRTCIdentityStore(),
resource_context));
peer_connection_tracker_host_ = new PeerConnectionTrackerHost(GetID());
AddFilter(peer_connection_tracker_host_.get());
AddFilter(new MediaStreamDispatcherHost(
- GetID(),
- browser_context->GetResourceContext()->GetMediaDeviceIDSalt(),
+ GetID(), browser_context->GetResourceContext()->GetMediaDeviceIDSalt(),
media_stream_manager));
AddFilter(new MediaStreamTrackMetricsHost());
#endif
@@ -868,15 +844,14 @@ void RenderProcessHostImpl::CreateMessageFilters() {
AddFilter(new SpeechRecognitionDispatcherHost(
GetID(), storage_partition_impl_->GetURLRequestContext()));
AddFilter(new FileAPIMessageFilter(
- GetID(),
- storage_partition_impl_->GetURLRequestContext(),
+ GetID(), storage_partition_impl_->GetURLRequestContext(),
storage_partition_impl_->GetFileSystemContext(),
ChromeBlobStorageContext::GetFor(browser_context),
StreamContext::GetFor(browser_context)));
AddFilter(new FileUtilitiesMessageFilter(GetID()));
AddFilter(new MimeRegistryMessageFilter());
- AddFilter(new DatabaseMessageFilter(
- storage_partition_impl_->GetDatabaseTracker()));
+ AddFilter(
+ new DatabaseMessageFilter(storage_partition_impl_->GetDatabaseTracker()));
#if defined(OS_MACOSX)
AddFilter(new TextInputClientMessageFilter(GetID()));
#elif defined(OS_WIN)
@@ -895,8 +870,8 @@ void RenderProcessHostImpl::CreateMessageFilters() {
WebSocketDispatcherHost::GetRequestContextCallback
websocket_request_context_callback(
- base::Bind(&GetRequestContext, request_context,
- media_request_context, RESOURCE_TYPE_SUB_RESOURCE));
+ base::Bind(&GetRequestContext, request_context, media_request_context,
+ RESOURCE_TYPE_SUB_RESOURCE));
AddFilter(
new WebSocketDispatcherHost(GetID(), websocket_request_context_callback));
@@ -919,8 +894,7 @@ void RenderProcessHostImpl::CreateMessageFilters() {
AddFilter(service_worker_filter.get());
AddFilter(new SharedWorkerMessageFilter(
- GetID(),
- resource_context,
+ GetID(), resource_context,
WorkerStoragePartition(
storage_partition_impl_->GetURLRequestContext(),
storage_partition_impl_->GetMediaURLRequestContext(),
@@ -943,15 +917,12 @@ void RenderProcessHostImpl::CreateMessageFilters() {
AddFilter(new ResolveProxyMsgHelper(
browser_context->GetRequestContextForRenderProcess(GetID())));
AddFilter(new QuotaDispatcherHost(
- GetID(),
- storage_partition_impl_->GetQuotaManager(),
+ GetID(), storage_partition_impl_->GetQuotaManager(),
GetContentClient()->browser()->CreateQuotaPermissionContext()));
notification_message_filter_ = new NotificationMessageFilter(
- GetID(),
- storage_partition_impl_->GetPlatformNotificationContext(),
- resource_context,
- browser_context);
+ GetID(), storage_partition_impl_->GetPlatformNotificationContext(),
+ resource_context, browser_context);
AddFilter(notification_message_filter_.get());
AddFilter(new GamepadBrowserMessageFilter());
@@ -1054,10 +1025,9 @@ void RenderProcessHostImpl::SendUpdateValueState(unsigned int target,
const gpu::ValueState& state) {
DCHECK(subscribe_uniform_enabled_);
if (subscription_set_.find(target) != subscription_set_.end()) {
- GpuProcessHost::SendOnIO(
- GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
- CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH,
- new GpuMsg_UpdateValueState(id_, target, state));
+ GpuProcessHost::SendOnIO(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
+ CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH,
+ new GpuMsg_UpdateValueState(id_, target, state));
} else {
// Store the ValueState locally in case a Valuebuffer subscribes to it later
pending_valuebuffer_state_->UpdateState(target, state);
@@ -1075,11 +1045,10 @@ media::BrowserCdm* RenderProcessHostImpl::GetBrowserCdm(int render_frame_id,
}
#endif
-void RenderProcessHostImpl::AddRoute(
- int32 routing_id,
- IPC::Listener* listener) {
- CHECK(!listeners_.Lookup(routing_id))
- << "Found Routing ID Conflict: " << routing_id;
+void RenderProcessHostImpl::AddRoute(int32 routing_id,
+ IPC::Listener* listener) {
+ CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: "
+ << routing_id;
listeners_.AddWithID(listener, routing_id);
}
@@ -1117,23 +1086,20 @@ void RenderProcessHostImpl::ShutdownForBadMessage() {
}
void RenderProcessHostImpl::WidgetRestored() {
- // Verify we were properly backgrounded.
- DCHECK_EQ(backgrounded_, (visible_widgets_ == 0));
visible_widgets_++;
- SetBackgrounded(false);
+ UpdateProcessPriority();
+ DCHECK(!is_process_backgrounded_);
}
void RenderProcessHostImpl::WidgetHidden() {
- // On startup, the browser will call Hide
- if (backgrounded_)
+ // On startup, the browser will call Hide. We ignore this call.
+ if (visible_widgets_ == 0)
return;
- DCHECK_EQ(backgrounded_, (visible_widgets_ == 0));
- visible_widgets_--;
- DCHECK_GE(visible_widgets_, 0);
+ --visible_widgets_;
if (visible_widgets_ == 0) {
- DCHECK(!backgrounded_);
- SetBackgrounded(true);
+ DCHECK(!is_process_backgrounded_);
+ UpdateProcessPriority();
}
}
@@ -1141,6 +1107,10 @@ int RenderProcessHostImpl::VisibleWidgetCount() const {
return visible_widgets_;
}
+void RenderProcessHostImpl::AudioStateChanged() {
+ UpdateProcessPriority();
+}
+
bool RenderProcessHostImpl::IsForGuestsOnly() const {
return is_for_guests_only_;
}
@@ -1162,9 +1132,8 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) {
int msaa_sample_count = GpuRasterizationMSAASampleCount();
if (msaa_sample_count >= 0) {
- command_line->AppendSwitchASCII(
- switches::kGpuRasterizationMSAASampleCount,
- base::IntToString(msaa_sample_count));
+ command_line->AppendSwitchASCII(switches::kGpuRasterizationMSAASampleCount,
+ base::IntToString(msaa_sample_count));
}
if (IsZeroCopyUploadEnabled())
@@ -1226,8 +1195,8 @@ void RenderProcessHostImpl::AppendRendererCommandLine(
field_trial_states);
}
- GetContentClient()->browser()->AppendExtraCommandLineSwitches(
- command_line, GetID());
+ GetContentClient()->browser()->AppendExtraCommandLineSwitches(command_line,
+ GetID());
if (IsPinchToZoomEnabled())
command_line->AppendSwitch(switches::kEnablePinch);
@@ -1516,8 +1485,7 @@ bool RenderProcessHostImpl::FastShutdownIfPossible() {
if (!GetContentClient()->browser()->IsFastShutdownPossible())
return false;
- if (!child_process_launcher_.get() ||
- child_process_launcher_->IsStarting() ||
+ if (!child_process_launcher_.get() || child_process_launcher_->IsStarting() ||
!GetHandle())
return false; // Render process hasn't started or is probably crashed.
@@ -1588,9 +1556,9 @@ bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(AecDumpMsg_UnregisterAecDumpConsumer,
OnUnregisterAecDumpConsumer)
#endif
- // Adding single handlers for your service here is fine, but once your
- // service needs more than one handler, please extract them into a new
- // message filter and add that filter to CreateMessageFilters().
+ // Adding single handlers for your service here is fine, but once your
+ // service needs more than one handler, please extract them into a new
+ // message filter and add that filter to CreateMessageFilters().
IPC_END_MESSAGE_MAP()
return true;
@@ -1647,11 +1615,9 @@ void RenderProcessHostImpl::OnChannelConnected(int32 peer_pid) {
// Inform AudioInputRendererHost about the new render process PID.
// AudioInputRendererHost is reference counted, so it's lifetime is
// guarantueed during the lifetime of the closure.
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&AudioInputRendererHost::set_renderer_pid,
- audio_input_renderer_host_,
- peer_pid));
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&AudioInputRendererHost::set_renderer_pid,
+ audio_input_renderer_host_, peer_pid));
}
void RenderProcessHostImpl::OnChannelError() {
@@ -1738,13 +1704,11 @@ void RenderProcessHostImpl::Cleanup() {
DCHECK(!deleting_soon_);
DCHECK_EQ(0, pending_views_);
- FOR_EACH_OBSERVER(RenderProcessHostObserver,
- observers_,
+ FOR_EACH_OBSERVER(RenderProcessHostObserver, observers_,
RenderProcessHostDestroyed(this));
NotificationService::current()->Notify(
NOTIFICATION_RENDERER_PROCESS_TERMINATED,
- Source<RenderProcessHost>(this),
- NotificationService::NoDetails());
+ Source<RenderProcessHost>(this), NotificationService::NoDetails());
#ifndef NDEBUG
is_self_deleted_ = true;
@@ -1813,8 +1777,7 @@ void RenderProcessHostImpl::EnableAudioDebugRecordings(
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Enable AEC dump for each registered consumer.
- base::FilePath file_with_extensions =
- GetAecDumpFilePathWithExtensions(file);
+ base::FilePath file_with_extensions = GetAecDumpFilePathWithExtensions(file);
for (std::vector<int>::iterator it = aec_dump_consumers_.begin();
it != aec_dump_consumers_.end(); ++it) {
EnableAecDumpForId(file_with_extensions, *it);
@@ -1825,8 +1788,7 @@ void RenderProcessHostImpl::EnableAudioDebugRecordings(
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&AudioInputRendererHost::EnableDebugRecording,
- audio_input_renderer_host_,
- file));
+ audio_input_renderer_host_, file));
}
void RenderProcessHostImpl::DisableAudioDebugRecordings() {
@@ -1836,8 +1798,7 @@ void RenderProcessHostImpl::DisableAudioDebugRecordings() {
// for avoiding races between enable and disable. Nothing is done on the FILE
// thread.
BrowserThread::PostTaskAndReply(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&DisableAecDumpOnFileThread),
+ BrowserThread::FILE, FROM_HERE, base::Bind(&DisableAecDumpOnFileThread),
base::Bind(&RenderProcessHostImpl::SendDisableAecDumpToRenderer,
weak_factory_.GetWeakPtr()));
@@ -1845,9 +1806,8 @@ void RenderProcessHostImpl::DisableAudioDebugRecordings() {
// guaranteed during the lifetime of the closure.
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(
- &AudioInputRendererHost::DisableDebugRecording,
- audio_input_renderer_host_));
+ base::Bind(&AudioInputRendererHost::DisableDebugRecording,
+ audio_input_renderer_host_));
}
void RenderProcessHostImpl::SetWebRtcLogMessageCallback(
@@ -1863,13 +1823,10 @@ RenderProcessHostImpl::StartRtpDump(
if (!p2p_socket_dispatcher_host_.get())
return WebRtcStopRtpDumpCallback();
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
base::Bind(&P2PSocketDispatcherHost::StartRtpDump,
- p2p_socket_dispatcher_host_,
- incoming,
- outgoing,
- packet_callback));
+ p2p_socket_dispatcher_host_, incoming,
+ outgoing, packet_callback));
if (stop_rtp_dump_callback_.is_null()) {
stop_rtp_dump_callback_ =
@@ -1951,7 +1908,8 @@ void RenderProcessHostImpl::FilterURL(RenderProcessHost* rph,
// Do not allow browser plugin guests to navigate to non-web URLs, since they
// cannot swap processes or grant bindings.
- bool non_web_url_in_guest = rph->IsForGuestsOnly() &&
+ bool non_web_url_in_guest =
+ rph->IsForGuestsOnly() &&
!(url->is_valid() && policy->IsWebSafeScheme(url->scheme()));
if (non_web_url_in_guest || !policy->CanRequestURL(rph->GetID(), *url)) {
@@ -1964,10 +1922,9 @@ void RenderProcessHostImpl::FilterURL(RenderProcessHost* rph,
}
// static
-bool RenderProcessHostImpl::IsSuitableHost(
- RenderProcessHost* host,
- BrowserContext* browser_context,
- const GURL& site_url) {
+bool RenderProcessHostImpl::IsSuitableHost(RenderProcessHost* host,
+ BrowserContext* browser_context,
+ const GURL& site_url) {
if (run_renderer_in_process())
return true;
@@ -2039,7 +1996,8 @@ RenderProcessHost* RenderProcessHost::FromID(int render_process_id) {
// static
bool RenderProcessHost::ShouldTryToUseExistingProcessHost(
- BrowserContext* browser_context, const GURL& url) {
+ BrowserContext* browser_context,
+ const GURL& url) {
// If --site-per-process is enabled, do not try to reuse renderer processes
// when over the limit.
// TODO(nick): This is overly conservative and isn't launchable. Move this
@@ -2060,8 +2018,8 @@ bool RenderProcessHost::ShouldTryToUseExistingProcessHost(
if (g_all_hosts.Get().size() >= GetMaxRendererProcessCount())
return true;
- return GetContentClient()->browser()->
- ShouldTryToUseExistingProcessHost(browser_context, url);
+ return GetContentClient()->browser()->ShouldTryToUseExistingProcessHost(
+ browser_context, url);
}
// static
@@ -2075,9 +2033,8 @@ RenderProcessHost* RenderProcessHost::GetExistingProcessHost(
iterator iter(AllHostsIterator());
while (!iter.IsAtEnd()) {
if (GetContentClient()->browser()->MayReuseHost(iter.GetCurrentValue()) &&
- RenderProcessHostImpl::IsSuitableHost(
- iter.GetCurrentValue(),
- browser_context, site_url)) {
+ RenderProcessHostImpl::IsSuitableHost(iter.GetCurrentValue(),
+ browser_context, site_url)) {
suitable_renderers.push_back(iter.GetCurrentValue());
}
iter.Advance();
@@ -2094,9 +2051,8 @@ RenderProcessHost* RenderProcessHost::GetExistingProcessHost(
}
// static
-bool RenderProcessHost::ShouldUseProcessPerSite(
- BrowserContext* browser_context,
- const GURL& url) {
+bool RenderProcessHost::ShouldUseProcessPerSite(BrowserContext* browser_context,
+ const GURL& url) {
// Returns true if we should use the process-per-site model. This will be
// the case if the --process-per-site switch is specified, or in
// process-per-site-instance for particular sites (e.g., WebUI).
@@ -2125,13 +2081,12 @@ RenderProcessHost* RenderProcessHostImpl::GetProcessHostForSite(
BrowserContext* browser_context,
const GURL& url) {
// Look up the map of site to process for the given browser_context.
- SiteProcessMap* map =
- GetSiteProcessMapForBrowserContext(browser_context);
+ SiteProcessMap* map = GetSiteProcessMapForBrowserContext(browser_context);
// See if we have an existing process with appropriate bindings for this site.
// If not, the caller should create a new process and register it.
- std::string site = SiteInstance::GetSiteForURL(browser_context, url)
- .possibly_invalid_spec();
+ std::string site =
+ SiteInstance::GetSiteForURL(browser_context, url).possibly_invalid_spec();
RenderProcessHost* host = map->FindProcess(site);
if (host && (!GetContentClient()->browser()->MayReuseHost(host) ||
!IsSuitableHost(host, browser_context, url))) {
@@ -2151,14 +2106,13 @@ void RenderProcessHostImpl::RegisterProcessHostForSite(
RenderProcessHost* process,
const GURL& url) {
// Look up the map of site to process for the given browser_context.
- SiteProcessMap* map =
- GetSiteProcessMapForBrowserContext(browser_context);
+ SiteProcessMap* map = GetSiteProcessMapForBrowserContext(browser_context);
// Only register valid, non-empty sites. Empty or invalid sites will not
// use process-per-site mode. We cannot check whether the process has
// appropriate bindings here, because the bindings have not yet been granted.
- std::string site = SiteInstance::GetSiteForURL(browser_context, url)
- .possibly_invalid_spec();
+ std::string site =
+ SiteInstance::GetSiteForURL(browser_context, url).possibly_invalid_spec();
if (!site.empty())
map->RegisterProcess(site, process);
}
@@ -2208,14 +2162,14 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead,
delete queued_messages_.front();
queued_messages_.pop();
}
+ UpdateProcessPriority();
+ DCHECK(!is_process_backgrounded_);
within_process_died_observer_ = true;
NotificationService::current()->Notify(
- NOTIFICATION_RENDERER_PROCESS_CLOSED,
- Source<RenderProcessHost>(this),
+ NOTIFICATION_RENDERER_PROCESS_CLOSED, Source<RenderProcessHost>(this),
Details<RendererClosedDetails>(&details));
- FOR_EACH_OBSERVER(RenderProcessHostObserver,
- observers_,
+ FOR_EACH_OBSERVER(RenderProcessHostObserver, observers_,
RenderProcessExited(this, status, exit_code));
within_process_died_observer_ = false;
@@ -2229,10 +2183,8 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead,
IDMap<IPC::Listener>::iterator iter(&listeners_);
while (!iter.IsAtEnd()) {
- iter.GetCurrentValue()->OnMessageReceived(
- FrameHostMsg_RenderProcessGone(iter.GetCurrentKey(),
- static_cast<int>(status),
- exit_code));
+ iter.GetCurrentValue()->OnMessageReceived(FrameHostMsg_RenderProcessGone(
+ iter.GetCurrentKey(), static_cast<int>(status), exit_code));
iter.Advance();
}
@@ -2272,13 +2224,11 @@ void RenderProcessHostImpl::ReleaseOnCloseACK(
DCHECK(host);
if (sessions.empty())
return;
- SessionStorageHolder* holder = static_cast<SessionStorageHolder*>
- (host->GetUserData(kSessionStorageHolderKey));
+ SessionStorageHolder* holder = static_cast<SessionStorageHolder*>(
+ host->GetUserData(kSessionStorageHolderKey));
if (!holder) {
holder = new SessionStorageHolder();
- host->SetUserData(
- kSessionStorageHolderKey,
- holder);
+ host->SetUserData(kSessionStorageHolderKey, holder);
}
holder->Hold(sessions, view_route_id);
}
@@ -2304,24 +2254,29 @@ void RenderProcessHostImpl::SuddenTerminationChanged(bool enabled) {
SetSuddenTerminationAllowed(enabled);
}
-void RenderProcessHostImpl::SetBackgrounded(bool backgrounded) {
- TRACE_EVENT1("renderer_host", "RenderProcessHostImpl::SetBackgrounded",
- "backgrounded", backgrounded);
- // Note: we always set the backgrounded_ value. If the process is NULL
- // (and hence hasn't been created yet), we will set the process priority
- // later when we create the process.
- backgrounded_ = backgrounded;
- if (!child_process_launcher_.get() || child_process_launcher_->IsStarting())
+void RenderProcessHostImpl::UpdateProcessPriority() {
+ if (!child_process_launcher_.get() || child_process_launcher_->IsStarting()) {
+ is_process_backgrounded_ = false;
return;
+ }
- // Don't background processes which have active audio streams.
- if (backgrounded_ && audio_renderer_host_->HasActiveAudio())
- return;
+ // We background a process as soon as it hosts no active audio streams and no
+ // visible widgets -- the callers must call this function whenever we
+ // transition in/out of those states.
+ const bool should_background =
+ visible_widgets_ == 0 && !audio_renderer_host_->HasActiveAudio() &&
+ !base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableRendererBackgrounding);
- const base::CommandLine* command_line =
- base::CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(switches::kDisableRendererBackgrounding))
+// TODO(sebsg): Remove this ifdef when https://crbug.com/537671 is fixed.
+#if !defined(OS_ANDROID)
+ if (is_process_backgrounded_ == should_background)
return;
+#endif
+
+ TRACE_EVENT1("renderer_host", "RenderProcessHostImpl::UpdateProcessPriority",
+ "should_background", should_background);
+ is_process_backgrounded_ = should_background;
#if defined(OS_WIN)
// The cbstext.dll loads as a global GetMessage hook in the browser process
@@ -2339,10 +2294,10 @@ void RenderProcessHostImpl::SetBackgrounded(bool backgrounded) {
// tasks executing at lowered priority ahead of it or simply by not being
// swiftly scheduled by the OS per the low process priority
// (http://crbug.com/398103).
- child_process_launcher_->SetProcessBackgrounded(backgrounded);
+ child_process_launcher_->SetProcessBackgrounded(should_background);
// Notify the child process of background state.
- Send(new ChildProcessMsg_SetProcessBackgrounded(backgrounded));
+ Send(new ChildProcessMsg_SetProcessBackgrounded(should_background));
}
void RenderProcessHostImpl::OnProcessLaunched() {
@@ -2365,7 +2320,15 @@ void RenderProcessHostImpl::OnProcessLaunched() {
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"465841 RenderProcessHostImpl::OnProcessLaunched::Backgrounded"));
DCHECK(child_process_launcher_->GetProcess().IsValid());
- SetBackgrounded(backgrounded_);
+ DCHECK(!is_process_backgrounded_);
+
+ // Not all platforms launch processes in the same backgrounded state. Make
+ // sure |is_process_backgrounded_| reflects this platform's initial process
+ // state.
+ is_process_backgrounded_ =
+ child_process_launcher_->GetProcess().IsProcessBackgrounded();
+
+ UpdateProcessPriority();
}
// TODO(erikchen): Remove ScopedTracker below once http://crbug.com/465841
@@ -2380,10 +2343,9 @@ void RenderProcessHostImpl::OnProcessLaunched() {
// The queued messages contain such things as "navigate". If this notification
// was after, we can end up executing JavaScript before the initialization
// happens.
- NotificationService::current()->Notify(
- NOTIFICATION_RENDERER_PROCESS_CREATED,
- Source<RenderProcessHost>(this),
- NotificationService::NoDetails());
+ NotificationService::current()->Notify(NOTIFICATION_RENDERER_PROCESS_CREATED,
+ Source<RenderProcessHost>(this),
+ NotificationService::NoDetails());
// TODO(erikchen): Remove ScopedTracker below once http://crbug.com/465841
// is fixed.
@@ -2442,13 +2404,12 @@ void RenderProcessHostImpl::OnProcessLaunchFailed() {
return;
// TODO(wfh): Fill in the real error code here see crbug.com/526198.
- RendererClosedDetails details { base::TERMINATION_STATUS_LAUNCH_FAILED,
- -1 };
+ RendererClosedDetails details{base::TERMINATION_STATUS_LAUNCH_FAILED, -1};
ProcessDied(true, &details);
}
-scoped_refptr<AudioRendererHost>
-RenderProcessHostImpl::audio_renderer_host() const {
+scoped_refptr<AudioRendererHost> RenderProcessHostImpl::audio_renderer_host()
+ const {
return audio_renderer_host_;
}
@@ -2458,8 +2419,8 @@ void RenderProcessHostImpl::OnUserMetricsRecordAction(
}
void RenderProcessHostImpl::OnCloseACK(int old_route_id) {
- SessionStorageHolder* holder = static_cast<SessionStorageHolder*>
- (GetUserData(kSessionStorageHolderKey));
+ SessionStorageHolder* holder =
+ static_cast<SessionStorageHolder*>(GetUserData(kSessionStorageHolderKey));
if (!holder)
return;
holder->Release(old_route_id);
@@ -2489,22 +2450,16 @@ void RenderProcessHostImpl::OnGpuSwitched() {
#if defined(ENABLE_WEBRTC)
void RenderProcessHostImpl::OnRegisterAecDumpConsumer(int id) {
BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(
- &RenderProcessHostImpl::RegisterAecDumpConsumerOnUIThread,
- weak_factory_.GetWeakPtr(),
- id));
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&RenderProcessHostImpl::RegisterAecDumpConsumerOnUIThread,
+ weak_factory_.GetWeakPtr(), id));
}
void RenderProcessHostImpl::OnUnregisterAecDumpConsumer(int id) {
BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(
- &RenderProcessHostImpl::UnregisterAecDumpConsumerOnUIThread,
- weak_factory_.GetWeakPtr(),
- id));
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&RenderProcessHostImpl::UnregisterAecDumpConsumerOnUIThread,
+ weak_factory_.GetWeakPtr(), id));
}
void RenderProcessHostImpl::RegisterAecDumpConsumerOnUIThread(int id) {
@@ -2535,11 +2490,9 @@ void RenderProcessHostImpl::EnableAecDumpForId(const base::FilePath& file,
BrowserThread::PostTaskAndReplyWithResult(
BrowserThread::FILE, FROM_HERE,
base::Bind(&CreateAecDumpFileForProcess,
- file.AddExtension(IntToStringType(id)),
- GetHandle()),
+ file.AddExtension(IntToStringType(id)), GetHandle()),
base::Bind(&RenderProcessHostImpl::SendAecDumpFileToRenderer,
- weak_factory_.GetWeakPtr(),
- id));
+ weak_factory_.GetWeakPtr(), id));
}
void RenderProcessHostImpl::SendAecDumpFileToRenderer(
@@ -2557,7 +2510,7 @@ void RenderProcessHostImpl::SendDisableAecDumpToRenderer() {
base::FilePath RenderProcessHostImpl::GetAecDumpFilePathWithExtensions(
const base::FilePath& file) {
return file.AddExtension(IntToStringType(base::GetProcId(GetHandle())))
- .AddExtension(kAecDumpFileNameAddition);
+ .AddExtension(kAecDumpFileNameAddition);
}
#endif // defined(ENABLE_WEBRTC)
« no previous file with comments | « content/browser/renderer_host/render_process_host_impl.h ('k') | content/public/browser/render_process_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698