diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-17 13:57:45 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-19 13:44:40 +0000 |
commit | 6ec7b8da05d21a3878bd21c691b41e675d74bb1c (patch) | |
tree | b87f250bc19413750b9bb9cdbf2da20ef5014820 /chromium/content/renderer/render_thread_impl.cc | |
parent | ec02ee4181c49b61fce1c8fb99292dbb8139cc90 (diff) | |
download | qtwebengine-chromium-6ec7b8da05d21a3878bd21c691b41e675d74bb1c.tar.gz |
BASELINE: Update Chromium to 60.0.3112.70
Change-Id: I9911c2280a014d4632f254857876a395d4baed2d
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/content/renderer/render_thread_impl.cc')
-rw-r--r-- | chromium/content/renderer/render_thread_impl.cc | 379 |
1 files changed, 212 insertions, 167 deletions
diff --git a/chromium/content/renderer/render_thread_impl.cc b/chromium/content/renderer/render_thread_impl.cc index 1d35db54bde..d7a0de4e48c 100644 --- a/chromium/content/renderer/render_thread_impl.cc +++ b/chromium/content/renderer/render_thread_impl.cc @@ -21,7 +21,9 @@ #include "base/memory/memory_coordinator_client_registry.h" #include "base/memory/ptr_util.h" #include "base/memory/shared_memory.h" +#include "base/message_loop/message_loop.h" #include "base/metrics/field_trial.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/process/process_metrics.h" @@ -51,6 +53,8 @@ #include "cc/trees/layer_tree_host_common.h" #include "cc/trees/layer_tree_settings.h" #include "components/discardable_memory/client/client_discardable_shared_memory_manager.h" +#include "components/metrics/public/interfaces/single_sample_metrics.mojom.h" +#include "components/metrics/single_sample_metrics.h" #include "content/child/appcache/appcache_dispatcher.h" #include "content/child/appcache/appcache_frontend_impl.h" #include "content/child/blob_storage/blob_message_filter.h" @@ -73,6 +77,7 @@ #include "content/common/field_trial_recorder.mojom.h" #include "content/common/frame_messages.h" #include "content/common/frame_owner_properties.h" +#include "content/common/gpu_stream_constants.h" #include "content/common/render_process_messages.h" #include "content/common/resource_messages.h" #include "content/common/site_isolation_policy.h" @@ -83,7 +88,9 @@ #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" #include "content/public/common/renderer_preferences.h" +#include "content/public/common/service_manager_connection.h" #include "content/public/common/service_names.mojom.h" +#include "content/public/common/simple_connection_filter.h" #include "content/public/common/url_constants.h" #include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/render_thread_observer.h" @@ -96,6 +103,7 @@ #include "content/renderer/dom_storage/dom_storage_dispatcher.h" #include "content/renderer/dom_storage/webstoragearea_impl.h" #include "content/renderer/dom_storage/webstoragenamespace_impl.h" +#include "content/renderer/effective_connection_type_helper.h" #include "content/renderer/gpu/compositor_external_begin_frame_source.h" #include "content/renderer/gpu/compositor_forwarding_message_filter.h" #include "content/renderer/gpu/frame_swap_message_queue.h" @@ -118,11 +126,11 @@ #include "content/renderer/render_view_impl.h" #include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/scheduler/resource_dispatch_throttler.h" -#include "content/renderer/service_worker/embedded_worker_dispatcher.h" #include "content/renderer/service_worker/embedded_worker_instance_client_impl.h" #include "content/renderer/service_worker/service_worker_context_client.h" #include "content/renderer/service_worker/service_worker_context_message_filter.h" #include "content/renderer/shared_worker/embedded_shared_worker_stub.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "gin/public/debug.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/shared_memory_limits.h" @@ -141,9 +149,9 @@ #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/base/url_util.h" #include "ppapi/features/features.h" +#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/interface_provider.h" -#include "services/service_manager/public/cpp/interface_registry.h" #include "services/ui/public/cpp/bitmap/child_shared_bitmap_manager.h" #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" #include "services/ui/public/interfaces/constants.mojom.h" @@ -153,6 +161,7 @@ #include "third_party/WebKit/public/platform/WebImageGenerator.h" #include "third_party/WebKit/public/platform/WebMemoryCoordinator.h" #include "third_party/WebKit/public/platform/WebNetworkStateNotifier.h" +#include "third_party/WebKit/public/platform/WebRuntimeFeatures.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebThread.h" #include "third_party/WebKit/public/platform/scheduler/child/webthread_base.h" @@ -161,7 +170,6 @@ #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebKit.h" -#include "third_party/WebKit/public/web/WebRuntimeFeatures.h" #include "third_party/WebKit/public/web/WebScriptController.h" #include "third_party/WebKit/public/web/WebSecurityPolicy.h" #include "third_party/WebKit/public/web/WebView.h" @@ -258,6 +266,10 @@ uint32_t g_next_compositor_frame_sink_id = 1; // for tests which may indirectly send messages over this interface. mojom::RenderMessageFilter* g_render_message_filter_for_testing; +// An implementation of RendererBlinkPlatformImpl which can be mocked out +// for tests. +RendererBlinkPlatformImpl* g_current_blink_platform_impl_for_testing; + // Keep the global RenderThreadImpl in a TLS slot so it is impossible to access // incorrectly from the wrong thread. base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl>>::DestructorAtExit @@ -315,13 +327,15 @@ void AddHistogramSample(void* hist, int sample) { class FrameFactoryImpl : public mojom::FrameFactory { public: - FrameFactoryImpl() : routing_id_highmark_(-1) {} + explicit FrameFactoryImpl(const service_manager::BindSourceInfo& source_info) + : source_info_(source_info), routing_id_highmark_(-1) {} private: // mojom::FrameFactory: - void CreateFrame(int32_t frame_routing_id, - mojom::FrameRequest frame_request, - mojom::FrameHostPtr frame_host) override { + void CreateFrame( + int32_t frame_routing_id, + mojom::FrameRequest frame_request, + mojom::FrameHostInterfaceBrokerPtr frame_host_interface_broker) override { // TODO(morrita): This is for investigating http://crbug.com/415059 and // should be removed once it is fixed. CHECK_LT(routing_id_highmark_, frame_routing_id); @@ -334,19 +348,23 @@ class FrameFactoryImpl : public mojom::FrameFactory { // we want. if (!frame) { RenderThreadImpl::current()->RegisterPendingFrameCreate( - frame_routing_id, std::move(frame_request), std::move(frame_host)); + source_info_, frame_routing_id, std::move(frame_request), + std::move(frame_host_interface_broker)); return; } - frame->BindFrame(std::move(frame_request), std::move(frame_host)); + frame->BindFrame(source_info_, std::move(frame_request), + std::move(frame_host_interface_broker)); } private: + service_manager::BindSourceInfo source_info_; int32_t routing_id_highmark_; }; -void CreateFrameFactory(mojom::FrameFactoryRequest request) { - mojo::MakeStrongBinding(base::MakeUnique<FrameFactoryImpl>(), +void CreateFrameFactory(const service_manager::BindSourceInfo& source_info, + mojom::FrameFactoryRequest request) { + mojo::MakeStrongBinding(base::MakeUnique<FrameFactoryImpl>(source_info), std::move(request)); } @@ -356,7 +374,7 @@ scoped_refptr<ui::ContextProviderCommandBuffer> CreateOffscreenContext( bool support_locking, ui::command_buffer_metrics::ContextType type, int32_t stream_id, - gpu::GpuStreamPriority stream_priority) { + gpu::SchedulingPriority stream_priority) { DCHECK(gpu_channel_host); // This is used to create a few different offscreen contexts: // - The shared main thread context (offscreen) used by blink for canvas. @@ -385,6 +403,23 @@ bool IsRunningInMash() { return cmdline->HasSwitch(switches::kIsRunningInMash); } +// Hook that allows single-sample metric code from //components/metrics to +// connect from the renderer process to the browser process. +void CreateSingleSampleMetricsProvider( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + service_manager::Connector* connector, + metrics::mojom::SingleSampleMetricsProviderRequest request) { + if (task_runner->BelongsToCurrentThread()) { + connector->BindInterface(mojom::kBrowserServiceName, std::move(request)); + return; + } + + task_runner->PostTask( + FROM_HERE, + base::Bind(&CreateSingleSampleMetricsProvider, std::move(task_runner), + connector, base::Passed(&request))); +} + } // namespace // For measuring memory usage after each task. Behind a command line flag. @@ -538,11 +573,25 @@ mojom::RenderMessageFilter* RenderThreadImpl::current_render_message_filter() { } // static +RendererBlinkPlatformImpl* RenderThreadImpl::current_blink_platform_impl() { + if (g_current_blink_platform_impl_for_testing) + return g_current_blink_platform_impl_for_testing; + DCHECK(current()); + return current()->blink_platform_impl(); +} + +// static void RenderThreadImpl::SetRenderMessageFilterForTesting( mojom::RenderMessageFilter* render_message_filter) { g_render_message_filter_for_testing = render_message_filter; } +// static +void RenderThreadImpl::SetRendererBlinkPlatformImplForTesting( + RendererBlinkPlatformImpl* blink_platform_impl) { + g_current_blink_platform_impl_for_testing = blink_platform_impl; +} + // In single-process mode used for debugging, we don't pass a renderer client // ID via command line because RenderThreadImpl lives in the same process as // the browser @@ -606,6 +655,10 @@ void RenderThreadImpl::Init( // Register this object as the main thread. ChildProcess::current()->set_main_thread(this); + metrics::InitializeSingleSampleMetricsFactory( + base::BindRepeating(&CreateSingleSampleMetricsProvider, + message_loop()->task_runner(), GetConnector())); + gpu_ = ui::Gpu::Create( GetConnector(), IsRunningInMash() ? ui::mojom::kServiceName : mojom::kBrowserServiceName, @@ -634,7 +687,6 @@ void RenderThreadImpl::Init( main_thread_indexed_db_dispatcher_.reset(new IndexedDBDispatcher()); main_thread_cache_storage_dispatcher_.reset( new CacheStorageDispatcher(thread_safe_sender())); - embedded_worker_dispatcher_.reset(new EmbeddedWorkerDispatcher()); // Note: This may reorder messages from the ResourceDispatcher with respect to // other subsystems. @@ -644,8 +696,6 @@ void RenderThreadImpl::Init( kMaxResourceRequestsPerFlushWhenThrottled)); resource_dispatcher()->set_message_sender(resource_dispatch_throttler_.get()); - media_stream_center_ = nullptr; - blob_message_filter_ = new BlobMessageFilter(GetFileThreadTaskRunner()); AddFilter(blob_message_filter_.get()); db_message_filter_ = new DBMessageFilter(); @@ -692,11 +742,18 @@ void RenderThreadImpl::Init( } #endif - // Must be called before RenderThreadStarted() below. - StartServiceManagerConnection(); + auto registry = base::MakeUnique<service_manager::BinderRegistry>(); + registry->AddInterface(base::Bind(&CreateFrameFactory), + base::ThreadTaskRunnerHandle::Get()); + registry->AddInterface(base::Bind(&EmbeddedWorkerInstanceClientImpl::Create), + base::ThreadTaskRunnerHandle::Get()); + GetServiceManagerConnection()->AddConnectionFilter( + base::MakeUnique<SimpleConnectionFilter>(std::move(registry))); GetContentClient()->renderer()->RenderThreadStarted(); + StartServiceManagerConnection(); + field_trial_syncer_.InitFieldTrialObserving( *base::CommandLine::ForCurrentProcess(), switches::kSingleProcess); @@ -798,12 +855,6 @@ void RenderThreadImpl::Init( } #endif - if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHDR) || - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableNewVp9CodecString)) { - media::EnableNewVp9CodecStringSupport(); - } - memory_pressure_listener_.reset(new base::MemoryPressureListener( base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)), base::Bind(&RenderThreadImpl::OnSyncMemoryPressure, @@ -831,10 +882,6 @@ void RenderThreadImpl::Init( DCHECK(parsed_num_raster_threads) << string_value; DCHECK_GT(num_raster_threads, 0); - // TODO(vmpstr): If the flag sticks, we should clean it up and always have - // image decode tasks. - are_image_decode_tasks_enabled_ = true; - categorized_worker_pool_->Start(num_raster_threads); discardable_memory::mojom::DiscardableSharedMemoryManagerPtr manager_ptr; @@ -860,14 +907,6 @@ void RenderThreadImpl::Init( base::DiscardableMemoryAllocator::SetInstance( discardable_shared_memory_manager_.get()); - GetContentClient()->renderer()->ExposeInterfacesToBrowser( - GetInterfaceRegistry()); - - GetInterfaceRegistry()->AddInterface(base::Bind(&CreateFrameFactory)); - GetInterfaceRegistry()->AddInterface( - base::Bind(&EmbeddedWorkerInstanceClientImpl::Create, - base::Unretained(embedded_worker_dispatcher_.get()))); - GetConnector()->BindInterface(mojom::kBrowserServiceName, mojo::MakeRequest(&storage_partition_service_)); @@ -878,11 +917,7 @@ void RenderThreadImpl::Init( base::ThreadPriority::BACKGROUND); #endif - record_purge_suspend_metric_closure_.Reset(base::Bind( - &RenderThreadImpl::RecordPurgeAndSuspendMetrics, base::Unretained(this))); - record_purge_suspend_growth_metric_closure_.Reset( - base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, - base::Unretained(this))); + process_foregrounded_count_ = 0; needs_to_record_first_active_paint_ = false; base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); @@ -980,11 +1015,6 @@ IPC::SyncMessageFilter* RenderThreadImpl::GetSyncMessageFilter() { return sync_message_filter(); } -scoped_refptr<base::SingleThreadTaskRunner> -RenderThreadImpl::GetIOTaskRunner() { - return ChildProcess::current()->io_task_runner(); -} - void RenderThreadImpl::AddRoute(int32_t routing_id, IPC::Listener* listener) { ChildThreadImpl::GetRouter()->AddRoute(routing_id, listener); auto it = pending_frame_creates_.find(routing_id); @@ -996,7 +1026,8 @@ void RenderThreadImpl::AddRoute(int32_t routing_id, IPC::Listener* listener) { return; scoped_refptr<PendingFrameCreate> create(it->second); - frame->BindFrame(it->second->TakeFrameRequest(), it->second->TakeFrameHost()); + frame->BindFrame(it->second->browser_info(), it->second->TakeFrameRequest(), + it->second->TakeInterfaceBroker()); pending_frame_creates_.erase(it); } @@ -1022,14 +1053,15 @@ void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32_t routing_id) { } void RenderThreadImpl::RegisterPendingFrameCreate( + const service_manager::BindSourceInfo& browser_info, int routing_id, mojom::FrameRequest frame_request, - mojom::FrameHostPtr frame_host) { + mojom::FrameHostInterfaceBrokerPtr frame_host_interface_broker) { std::pair<PendingFrameCreateMap::iterator, bool> result = pending_frame_creates_.insert(std::make_pair( - routing_id, - make_scoped_refptr(new PendingFrameCreate( - routing_id, std::move(frame_request), std::move(frame_host))))); + routing_id, make_scoped_refptr(new PendingFrameCreate( + browser_info, routing_id, std::move(frame_request), + std::move(frame_host_interface_broker))))); CHECK(result.second) << "Inserting a duplicate item."; } @@ -1157,7 +1189,7 @@ void RenderThreadImpl::InitializeWebKit( // same queue to ensure tasks are executed in the expected order. child_resource_message_filter()->SetMainThreadTaskRunner( resource_task_queue2); - resource_dispatcher()->SetMainThreadTaskRunner(resource_task_queue2); + resource_dispatcher()->SetThreadTaskRunner(resource_task_queue2); if (!command_line.HasSwitch(switches::kDisableThreadedCompositing)) InitializeCompositorThread(); @@ -1373,8 +1405,7 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() { scoped_refptr<ui::ContextProviderCommandBuffer> media_context_provider = CreateOffscreenContext(gpu_channel_host, limits, support_locking, ui::command_buffer_metrics::MEDIA_CONTEXT, - gpu::GPU_STREAM_DEFAULT, - gpu::GpuStreamPriority::NORMAL); + kGpuStreamIdDefault, kGpuStreamPriorityDefault); if (!media_context_provider->BindToCurrentThread()) return nullptr; @@ -1387,6 +1418,12 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() { !cmd_line->HasSwitch(switches::kDisableGpuMemoryBufferVideoFrames) && !cmd_line->HasSwitch(switches::kDisableGpuCompositing) && !gpu_channel_host->gpu_info().software_rendering; +#elif defined(OS_WIN) + !cmd_line->HasSwitch(switches::kDisableGpuMemoryBufferVideoFrames) && + !cmd_line->HasSwitch(switches::kDisableGpuCompositing) && + !gpu_channel_host->gpu_info().software_rendering && + (cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames) || + gpu_channel_host->gpu_info().supports_overlays); #else cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames); #endif @@ -1418,7 +1455,7 @@ RenderThreadImpl::SharedMainThreadContextProvider() { shared_main_thread_contexts_ = CreateOffscreenContext( std::move(gpu_channel_host), gpu::SharedMemoryLimits(), support_locking, ui::command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT, - gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL); + kGpuStreamIdDefault, kGpuStreamPriorityDefault); if (!shared_main_thread_contexts_->BindToCurrentThread()) shared_main_thread_contexts_ = nullptr; return shared_main_thread_contexts_; @@ -1491,6 +1528,11 @@ void RenderThreadImpl::OnAssociatedInterfaceRequest( ChildThreadImpl::OnAssociatedInterfaceRequest(name, std::move(handle)); } +scoped_refptr<base::SingleThreadTaskRunner> +RenderThreadImpl::GetIOTaskRunner() { + return ChildProcess::current()->io_task_runner(); +} + bool RenderThreadImpl::IsGpuRasterizationForced() { return is_gpu_rasterization_forced_; } @@ -1570,10 +1612,6 @@ cc::TaskGraphRunner* RenderThreadImpl::GetTaskGraphRunner() { return categorized_worker_pool_->GetTaskGraphRunner(); } -bool RenderThreadImpl::AreImageDecodeTasksEnabled() { - return are_image_decode_tasks_enabled_; -} - bool RenderThreadImpl::IsThreadedAnimationEnabled() { return is_threaded_animation_enabled_; } @@ -1613,8 +1651,7 @@ bool RenderThreadImpl::OnControlMessageReceived(const IPC::Message& msg) { // Some messages are handled by delegates. if (appcache_dispatcher_->OnMessageReceived(msg) || - dom_storage_dispatcher_->OnMessageReceived(msg) || - embedded_worker_dispatcher_->OnMessageReceived(msg)) { + dom_storage_dispatcher_->OnMessageReceived(msg)) { return true; } @@ -1634,15 +1671,7 @@ void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { needs_to_record_first_active_paint_ = false; } else { renderer_scheduler_->OnRendererForegrounded(); - - record_purge_suspend_metric_closure_.Cancel(); - record_purge_suspend_metric_closure_.Reset( - base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMetrics, - base::Unretained(this))); - record_purge_suspend_growth_metric_closure_.Cancel(); - record_purge_suspend_growth_metric_closure_.Reset( - base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, - base::Unretained(this))); + process_foregrounded_count_++; } } @@ -1651,18 +1680,32 @@ void RenderThreadImpl::OnProcessPurgeAndSuspend() { if (!RendererIsHidden()) return; - if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) { - base::MemoryCoordinatorClientRegistry::GetInstance()->PurgeMemory(); - } - // Since purging is not a synchronous task (e.g. v8 GC, oilpan GC, ...), - // we need to wait until the task is finished. So wait 15 seconds and - // update purge+suspend UMA histogram. - // TODO(tasak): use MemoryCoordinator's callback to report purge+suspend - // UMA when MemoryCoordinator is available. - GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( - FROM_HERE, record_purge_suspend_metric_closure_.callback(), - base::TimeDelta::FromSeconds(15)); + if (!base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) + return; + + base::MemoryCoordinatorClientRegistry::GetInstance()->PurgeMemory(); needs_to_record_first_active_paint_ = true; + + RendererMemoryMetrics memory_metrics; + if (!GetRendererMemoryMetrics(&memory_metrics)) + return; + + purge_and_suspend_memory_metrics_ = memory_metrics; + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( + FROM_HERE, + base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, + base::Unretained(this), "30min", process_foregrounded_count_), + base::TimeDelta::FromMinutes(30)); + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( + FROM_HERE, + base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, + base::Unretained(this), "60min", process_foregrounded_count_), + base::TimeDelta::FromMinutes(60)); + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( + FROM_HERE, + base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, + base::Unretained(this), "90min", process_foregrounded_count_), + base::TimeDelta::FromMinutes(90)); } // TODO(tasak): Replace the following GetMallocUsage() with memory-infra @@ -1759,85 +1802,58 @@ bool RenderThreadImpl::GetRendererMemoryMetrics( return true; } -// TODO(tasak): Once it is possible to use memory-infra without tracing, -// we should collect the metrics using memory-infra. -// TODO(tasak): We should also report a difference between the memory usages -// before and after purging by using memory-infra. -void RenderThreadImpl::RecordPurgeAndSuspendMetrics() { - // If this renderer is resumed, we should not update UMA. - if (!RendererIsHidden()) - return; - - // TODO(tasak): Compare memory metrics between purge-enabled renderers and - // purge-disabled renderers (A/B testing). - RendererMemoryMetrics memory_metrics; - if (!GetRendererMemoryMetrics(&memory_metrics)) - return; - - UMA_HISTOGRAM_MEMORY_KB("PurgeAndSuspend.Memory.PartitionAllocKB", - memory_metrics.partition_alloc_kb); - UMA_HISTOGRAM_MEMORY_KB("PurgeAndSuspend.Memory.BlinkGCKB", - memory_metrics.blink_gc_kb); - UMA_HISTOGRAM_MEMORY_MB("PurgeAndSuspend.Memory.MallocMB", - memory_metrics.malloc_mb); - UMA_HISTOGRAM_MEMORY_KB("PurgeAndSuspend.Memory.DiscardableKB", - memory_metrics.discardable_kb); - UMA_HISTOGRAM_MEMORY_MB("PurgeAndSuspend.Memory.V8MainThreadIsolateMB", - memory_metrics.v8_main_thread_isolate_mb); - UMA_HISTOGRAM_MEMORY_MB("PurgeAndSuspend.Memory.TotalAllocatedMB", - memory_metrics.total_allocated_mb); - purge_and_suspend_memory_metrics_ = memory_metrics; - - // record how many memory usage increases after purged. - GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( - FROM_HERE, record_purge_suspend_growth_metric_closure_.callback(), - base::TimeDelta::FromMinutes(5)); - GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( - FROM_HERE, record_purge_suspend_growth_metric_closure_.callback(), - base::TimeDelta::FromMinutes(10)); - GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( - FROM_HERE, record_purge_suspend_growth_metric_closure_.callback(), - base::TimeDelta::FromMinutes(15)); -} - #define GET_MEMORY_GROWTH(current, previous, allocator) \ (current.allocator > previous.allocator \ ? current.allocator - previous.allocator \ : 0) -void RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics() const { +static void RecordPurgeAndSuspendMemoryGrowthKB(const char* basename, + const char* suffix, + int memory_usage) { + std::string histogram_name = base::StringPrintf("%s.%s", basename, suffix); + base::UmaHistogramMemoryKB(histogram_name, memory_usage); +} + +void RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics( + const char* suffix, + int foregrounded_count_when_purged) { // If this renderer is resumed, we should not update UMA. if (!RendererIsHidden()) return; + if (foregrounded_count_when_purged != process_foregrounded_count_) + return; RendererMemoryMetrics memory_metrics; if (!GetRendererMemoryMetrics(&memory_metrics)) return; - UMA_HISTOGRAM_MEMORY_KB( - "PurgeAndSuspend.Experimental.MemoryGrowth.PartitionAllocKB", + RecordPurgeAndSuspendMemoryGrowthKB( + "PurgeAndSuspend.Experimental.MemoryGrowth.PartitionAllocKB", suffix, GET_MEMORY_GROWTH(memory_metrics, purge_and_suspend_memory_metrics_, partition_alloc_kb)); - UMA_HISTOGRAM_MEMORY_KB( - "PurgeAndSuspend.Experimental.MemoryGrowth.BlinkGCKB", + RecordPurgeAndSuspendMemoryGrowthKB( + "PurgeAndSuspend.Experimental.MemoryGrowth.BlinkGCKB", suffix, GET_MEMORY_GROWTH(memory_metrics, purge_and_suspend_memory_metrics_, blink_gc_kb)); - UMA_HISTOGRAM_MEMORY_KB( - "PurgeAndSuspend.Experimental.MemoryGrowth.MallocKB", + RecordPurgeAndSuspendMemoryGrowthKB( + "PurgeAndSuspend.Experimental.MemoryGrowth.MallocKB", suffix, GET_MEMORY_GROWTH(memory_metrics, purge_and_suspend_memory_metrics_, - malloc_mb) * 1024); - UMA_HISTOGRAM_MEMORY_KB( - "PurgeAndSuspend.Experimental.MemoryGrowth.DiscardableKB", + malloc_mb) * + 1024); + RecordPurgeAndSuspendMemoryGrowthKB( + "PurgeAndSuspend.Experimental.MemoryGrowth.DiscardableKB", suffix, GET_MEMORY_GROWTH(memory_metrics, purge_and_suspend_memory_metrics_, discardable_kb)); - UMA_HISTOGRAM_MEMORY_KB( - "PurgeAndSuspend.Experimental.MemoryGrowth.V8MainThreadIsolateKB", + RecordPurgeAndSuspendMemoryGrowthKB( + "PurgeAndSuspend.Experimental.MemoryGrowth.V8MainThreadIsolateKB", suffix, GET_MEMORY_GROWTH(memory_metrics, purge_and_suspend_memory_metrics_, - v8_main_thread_isolate_mb) * 1024); - UMA_HISTOGRAM_MEMORY_KB( - "PurgeAndSuspend.Experimental.MemoryGrowth.TotalAllocatedKB", + v8_main_thread_isolate_mb) * + 1024); + RecordPurgeAndSuspendMemoryGrowthKB( + "PurgeAndSuspend.Experimental.MemoryGrowth.TotalAllocatedKB", suffix, GET_MEMORY_GROWTH(memory_metrics, purge_and_suspend_memory_metrics_, - total_allocated_mb) * 1024); + total_allocated_mb) * + 1024); } scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() { @@ -1899,15 +1915,24 @@ void RenderThreadImpl::RequestNewCompositorFrameSink( } #endif + cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info; + cc::mojom::MojoCompositorFrameSinkRequest sink_request = + mojo::MakeRequest(&sink_info); + cc::mojom::MojoCompositorFrameSinkClientPtr client; + cc::mojom::MojoCompositorFrameSinkClientRequest client_request = + mojo::MakeRequest(&client); + if (command_line.HasSwitch(switches::kEnableVulkan)) { scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider = cc::VulkanInProcessContextProvider::Create(); if (vulkan_context_provider) { DCHECK(!layout_test_mode()); + frame_sink_provider_->CreateForWidget(routing_id, std::move(sink_request), + std::move(client)); callback.Run(base::MakeUnique<RendererCompositorFrameSink>( routing_id, std::move(synthetic_begin_frame_source), - std::move(vulkan_context_provider), - std::move(frame_swap_message_queue))); + std::move(vulkan_context_provider), std::move(sink_info), + std::move(client_request), std::move(frame_swap_message_queue))); return; } } @@ -1930,9 +1955,12 @@ void RenderThreadImpl::RequestNewCompositorFrameSink( if (use_software) { DCHECK(!layout_test_mode()); + frame_sink_provider_->CreateForWidget(routing_id, std::move(sink_request), + std::move(client)); callback.Run(base::MakeUnique<RendererCompositorFrameSink>( routing_id, std::move(synthetic_begin_frame_source), nullptr, nullptr, - nullptr, shared_bitmap_manager(), std::move(frame_swap_message_queue))); + nullptr, shared_bitmap_manager(), std::move(sink_info), + std::move(client_request), std::move(frame_swap_message_queue))); return; } @@ -1972,9 +2000,9 @@ void RenderThreadImpl::RequestNewCompositorFrameSink( scoped_refptr<ui::ContextProviderCommandBuffer> context_provider( new ui::ContextProviderCommandBuffer( - gpu_channel_host, gpu::GPU_STREAM_DEFAULT, - gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle, url, - automatic_flushes, support_locking, limits, attributes, share_context, + gpu_channel_host, kGpuStreamIdDefault, kGpuStreamPriorityDefault, + gpu::kNullSurfaceHandle, url, automatic_flushes, support_locking, + limits, attributes, share_context, ui::command_buffer_metrics::RENDER_COMPOSITOR_CONTEXT)); if (layout_test_deps_) { @@ -1999,11 +2027,13 @@ void RenderThreadImpl::RequestNewCompositorFrameSink( return; } #endif + frame_sink_provider_->CreateForWidget(routing_id, std::move(sink_request), + std::move(client)); callback.Run(base::WrapUnique(new RendererCompositorFrameSink( routing_id, std::move(synthetic_begin_frame_source), std::move(context_provider), std::move(worker_context_provider), - GetGpuMemoryBufferManager(), nullptr, - std::move(frame_swap_message_queue)))); + GetGpuMemoryBufferManager(), nullptr, std::move(sink_info), + std::move(client_request), std::move(frame_swap_message_queue)))); } AssociatedInterfaceRegistry* @@ -2019,20 +2049,22 @@ RenderThreadImpl::RequestCopyOfOutputForLayoutTest( return layout_test_deps_->RequestCopyOfOutput(routing_id, std::move(request)); } -blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter( +std::unique_ptr<blink::WebMediaStreamCenter> +RenderThreadImpl::CreateMediaStreamCenter( blink::WebMediaStreamCenterClient* client) { + std::unique_ptr<blink::WebMediaStreamCenter> media_stream_center; #if BUILDFLAG(ENABLE_WEBRTC) - if (!media_stream_center_) { - media_stream_center_ = GetContentClient()->renderer() - ->OverrideCreateWebMediaStreamCenter(client); - if (!media_stream_center_) { - std::unique_ptr<MediaStreamCenter> media_stream_center( - new MediaStreamCenter(client, GetPeerConnectionDependencyFactory())); - media_stream_center_ = media_stream_center.release(); + if (!media_stream_center) { + media_stream_center = + GetContentClient()->renderer()->OverrideCreateWebMediaStreamCenter( + client); + if (!media_stream_center) { + media_stream_center = base::MakeUnique<MediaStreamCenter>( + client, GetPeerConnectionDependencyFactory()); } } #endif - return media_stream_center_; + return media_stream_center; } #if BUILDFLAG(ENABLE_WEBRTC) @@ -2130,6 +2162,17 @@ void RenderThreadImpl::OnNetworkConnectionChanged( NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); } +void RenderThreadImpl::OnNetworkQualityChanged( + net::EffectiveConnectionType type, + base::TimeDelta http_rtt, + base::TimeDelta transport_rtt, + double downlink_throughput_kbps) { + UMA_HISTOGRAM_BOOLEAN("NQE.RenderThreadNotified", true); + WebNetworkStateNotifier::SetNetworkQuality( + EffectiveConnectionTypeToWebEffectiveConnectionType(type), http_rtt, + transport_rtt, downlink_throughput_kbps); +} + void RenderThreadImpl::SetWebKitSharedTimersSuspended(bool suspend) { #if defined(OS_ANDROID) if (suspend) { @@ -2194,7 +2237,7 @@ void RenderThreadImpl::OnCreateNewSharedWorker( new EmbeddedSharedWorkerStub( params.url, params.name, params.content_security_policy, params.security_policy_type, params.creation_address_space, - params.pause_on_start, params.route_id); + params.pause_on_start, params.route_id, params.data_saver_enabled); } void RenderThreadImpl::OnMemoryPressure( @@ -2304,11 +2347,11 @@ RenderThreadImpl::SharedCompositorWorkerContextProvider() { return shared_worker_context_provider_; } - int32_t stream_id = gpu::GPU_STREAM_DEFAULT; - gpu::GpuStreamPriority stream_priority = gpu::GpuStreamPriority::NORMAL; + int32_t stream_id = kGpuStreamIdDefault; + gpu::SchedulingPriority stream_priority = kGpuStreamPriorityDefault; if (is_async_worker_context_enabled_) { - stream_id = gpu_channel_host->GenerateStreamID(); - stream_priority = gpu::GpuStreamPriority::LOW; + stream_id = kGpuStreamIdWorker; + stream_priority = kGpuStreamPriorityWorker; } bool support_locking = true; @@ -2321,7 +2364,7 @@ RenderThreadImpl::SharedCompositorWorkerContextProvider() { return shared_worker_context_provider_; } -void RenderThreadImpl::SampleGamepads(blink::WebGamepads* data) { +void RenderThreadImpl::SampleGamepads(device::Gamepads* data) { blink_platform_impl_->SampleGamepads(*data); } @@ -2386,18 +2429,20 @@ void RenderThreadImpl::ReleaseFreeMemory() { } RenderThreadImpl::PendingFrameCreate::PendingFrameCreate( + const service_manager::BindSourceInfo& browser_info, int routing_id, mojom::FrameRequest frame_request, - mojom::FrameHostPtr frame_host) - : routing_id_(routing_id), + mojom::FrameHostInterfaceBrokerPtr frame_host_interface_broker) + : browser_info_(browser_info), + routing_id_(routing_id), frame_request_(std::move(frame_request)), - frame_host_(std::move(frame_host)) { + frame_host_interface_broker_(std::move(frame_host_interface_broker)) { // The RenderFrame may be deleted before the CreateFrame message is received. // In that case, the RenderFrameHost should cancel the create, which is - // detected by setting an error handler on |frame_host_|. - frame_host_.set_connection_error_handler(base::Bind( - &RenderThreadImpl::PendingFrameCreate::OnConnectionError, - base::Unretained(this))); + // detected by setting an error handler on |frame_host_interface_broker_|. + frame_host_interface_broker_.set_connection_error_handler( + base::Bind(&RenderThreadImpl::PendingFrameCreate::OnConnectionError, + base::Unretained(this))); } RenderThreadImpl::PendingFrameCreate::~PendingFrameCreate() { |