blob: a10ec11f67f4c58938b800a47d0a32b9bcf0f46f [file] [log] [blame]
[email protected]d3d6325d2012-01-03 21:17:361// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]f1a29a02011-10-06 23:08:445#include "content/renderer/render_thread_impl.h"
initial.commit09911bf2008-07-26 23:55:296
[email protected]da00a2882009-03-09 17:51:197#include <algorithm>
[email protected]61a9b2d82010-02-26 00:31:088#include <limits>
[email protected]75e126b932009-09-28 19:38:499#include <map>
dcheng07945f632015-12-26 07:59:3210#include <utility>
[email protected]da00a2882009-03-09 17:51:1911#include <vector>
12
[email protected]237a14852012-04-28 02:56:3813#include "base/allocator/allocator_extension.h"
[email protected]06533c0b2009-03-05 21:39:1114#include "base/command_line.h"
creis9f7248b2016-01-27 20:27:3915#include "base/debug/crash_logging.h"
[email protected]94f9a0f682009-06-15 18:30:3016#include "base/lazy_instance.h"
[email protected]bee16aab2009-08-26 15:55:0317#include "base/logging.h"
avi1023d012015-12-25 02:39:1418#include "base/macros.h"
reveman1af05cb32015-03-17 23:18:1619#include "base/memory/discardable_memory_allocator.h"
dchengcedca5612016-04-09 01:40:1520#include "base/memory/ptr_util.h"
[email protected]8bac37b2013-07-18 19:13:5621#include "base/memory/shared_memory.h"
[email protected]835d7c82010-10-14 04:38:3822#include "base/metrics/field_trial.h"
asvitkine8d51e9d2016-09-02 23:55:4323#include "base/metrics/histogram_macros.h"
[email protected]433df472012-03-07 20:33:3924#include "base/path_service.h"
fdoray2df4a9e2016-07-18 23:47:1625#include "base/run_loop.h"
[email protected]21aa99682013-06-11 07:17:0126#include "base/strings/string16.h"
[email protected]1e1d1e12014-01-17 16:14:2927#include "base/strings/string_number_conversions.h"
hablichd6a4f122015-10-28 11:34:4928#include "base/strings/string_split.h"
ccameron6728bae32015-01-09 20:18:0629#include "base/strings/sys_string_conversions.h"
[email protected]74ebfb12013-06-07 20:48:0030#include "base/strings/utf_string_conversions.h"
reveman34b7a1522015-03-23 20:27:4731#include "base/threading/simple_thread.h"
[email protected]1357c322010-12-30 22:18:5632#include "base/threading/thread_local.h"
[email protected]d293572a2013-05-23 18:50:4533#include "base/threading/thread_restrictions.h"
gab30f26df2016-05-11 19:37:5534#include "base/threading/thread_task_runner_handle.h"
primiano9e38d552015-01-28 04:18:0135#include "base/trace_event/trace_event.h"
[email protected]7a4de7a62010-08-17 18:38:2436#include "base/values.h"
avi1023d012015-12-25 02:39:1437#include "build/build_config.h"
jbroman0d302162015-09-05 05:46:2338#include "cc/base/histograms.h"
[email protected]d72493152014-01-08 17:37:4539#include "cc/base/switches.h"
[email protected]38564622014-08-19 02:47:1840#include "cc/blink/web_layer_impl.h"
ericrk9151705c2016-07-26 19:53:1641#include "cc/output/buffer_to_texture_target_map.h"
danakj1120f4c2016-09-15 02:05:3242#include "cc/output/compositor_frame_sink.h"
jbroman6ccbc7d472016-07-27 04:45:4143#include "cc/output/copy_output_request.h"
danakj83066a32016-06-21 02:34:4944#include "cc/output/vulkan_in_process_context_provider.h"
danakj920156852015-05-18 20:22:2945#include "cc/raster/task_graph_runner.h"
vollick1050cc62015-12-03 07:04:5446#include "cc/trees/layer_tree_host_common.h"
loysoa6edaaff2015-05-25 03:26:4447#include "cc/trees/layer_tree_settings.h"
[email protected]a8cb3b73b2013-08-12 05:50:5048#include "content/child/appcache/appcache_dispatcher.h"
49#include "content/child/appcache/appcache_frontend_impl.h"
dmurph1fb98482016-03-30 21:14:2650#include "content/child/blob_storage/blob_message_filter.h"
revemancb5a66af2014-10-25 00:34:3951#include "content/child/child_discardable_shared_memory_manager.h"
reveman22dd9292014-10-13 20:52:0552#include "content/child/child_gpu_memory_buffer_manager.h"
[email protected]10208ea2013-06-06 20:08:0353#include "content/child/child_histogram_message_filter.h"
alexclarke0bc36e8d32014-12-17 17:29:2054#include "content/child/child_resource_message_filter.h"
jbauman2f5c1942014-12-06 03:28:2455#include "content/child/child_shared_bitmap_manager.h"
[email protected]fdeac262014-07-10 12:52:5156#include "content/child/content_child_helpers.h"
[email protected]89c36f82013-07-17 06:23:2757#include "content/child/db_message_filter.h"
[email protected]c7199a6e2013-06-04 12:56:0158#include "content/child/indexed_db/indexed_db_dispatcher.h"
59#include "content/child/indexed_db/indexed_db_message_filter.h"
bashia6264042016-09-15 04:49:5160#include "content/child/memory/child_memory_coordinator_impl.h"
[email protected]10208ea2013-06-06 20:08:0361#include "content/child/resource_dispatcher.h"
alexclarke0bc36e8d32014-12-17 17:29:2062#include "content/child/resource_scheduling_filter.h"
[email protected]643255da2013-06-12 20:55:1363#include "content/child/runtime_features.h"
[email protected]57cf97882013-06-26 20:39:0164#include "content/child/thread_safe_sender.h"
[email protected]c7199a6e2013-06-04 12:56:0165#include "content/child/web_database_observer_impl.h"
kinukoef647412015-12-23 06:10:4366#include "content/child/worker_thread_registry.h"
[email protected]bdae9812011-10-15 00:33:0367#include "content/common/child_process_messages.h"
[email protected]89c36f82013-07-17 06:23:2768#include "content/common/content_constants_internal.h"
[email protected]5f2aa722013-08-07 16:59:4169#include "content/common/dom_storage/dom_storage_messages.h"
[email protected]82307f6b2014-08-07 03:30:1270#include "content/common/frame_messages.h"
raymesbba82b32016-07-19 00:41:3871#include "content/common/frame_owner_properties.h"
[email protected]c29b7ff2013-03-06 03:51:0472#include "content/common/gpu/client/context_provider_command_buffer.h"
avia7c3f51c2015-09-16 00:30:3173#include "content/common/render_process_messages.h"
[email protected]94dc971d2011-03-05 19:08:3274#include "content/common/resource_messages.h"
mek27c9d742015-07-16 18:30:1875#include "content/common/service_worker/embedded_worker_setup.mojom.h"
alexmos68734212016-08-27 00:06:3176#include "content/common/site_isolation_policy.h"
[email protected]778574e2011-03-21 22:03:5077#include "content/common/view_messages.h"
[email protected]0ec90d522014-03-12 16:28:1978#include "content/common/worker_messages.h"
[email protected]a458504b2012-07-23 19:57:0679#include "content/public/common/content_constants.h"
bashia6264042016-09-15 04:49:5180#include "content/public/common/content_features.h"
[email protected]433df472012-03-07 20:33:3981#include "content/public/common/content_paths.h"
[email protected]c08950d22011-10-13 22:20:2982#include "content/public/common/content_switches.h"
[email protected]daf82f82011-10-31 22:35:3183#include "content/public/common/renderer_preferences.h"
[email protected]58436a12012-03-21 17:10:2684#include "content/public/common/url_constants.h"
[email protected]d344114c2011-10-01 01:24:3485#include "content/public/renderer/content_renderer_client.h"
tyoshino832a58a2016-04-18 08:14:0886#include "content/public/renderer/render_thread_observer.h"
[email protected]64ffa0442011-10-03 22:08:3687#include "content/public/renderer/render_view_visitor.h"
fsamuel6c1dfeb2014-12-18 19:21:3388#include "content/renderer/browser_plugin/browser_plugin_manager.h"
jsbell279efb42015-03-31 17:02:4689#include "content/renderer/cache_storage/cache_storage_dispatcher.h"
90#include "content/renderer/cache_storage/cache_storage_message_filter.h"
prashant.nfad657e2016-06-01 07:52:1791#include "content/renderer/categorized_worker_pool.h"
[email protected]70019152012-12-19 11:44:1992#include "content/renderer/devtools/devtools_agent_filter.h"
alph666f80f2014-12-08 15:52:1193#include "content/renderer/devtools/v8_sampling_profiler.h"
[email protected]1910fe82012-05-10 00:04:1094#include "content/renderer/dom_storage/dom_storage_dispatcher.h"
95#include "content/renderer/dom_storage/webstoragearea_impl.h"
96#include "content/renderer/dom_storage/webstoragenamespace_impl.h"
simonhonga7e3ac42014-11-11 20:50:2297#include "content/renderer/gpu/compositor_external_begin_frame_source.h"
98#include "content/renderer/gpu/compositor_forwarding_message_filter.h"
danakj83066a32016-06-21 02:34:4999#include "content/renderer/gpu/frame_swap_message_queue.h"
danakj1120f4c2016-09-15 02:05:32100#include "content/renderer/gpu/renderer_compositor_frame_sink.h"
[email protected]7a72d452013-12-13 10:01:13101#include "content/renderer/input/input_event_filter.h"
102#include "content/renderer/input/input_handler_manager.h"
jdduke691dd572014-12-02 20:47:52103#include "content/renderer/input/main_thread_input_event_filter.h"
[email protected]f7eb0a392011-07-12 10:19:51104#include "content/renderer/media/audio_input_message_filter.h"
105#include "content/renderer/media/audio_message_filter.h"
[email protected]3958e972012-07-17 00:25:41106#include "content/renderer/media/audio_renderer_mixer_manager.h"
[email protected]d8cd8372012-03-09 10:49:51107#include "content/renderer/media/media_stream_center.h"
[email protected]a9875152013-06-22 04:03:03108#include "content/renderer/media/midi_message_filter.h"
xhwang194acae2014-11-12 22:46:33109#include "content/renderer/media/render_media_client.h"
[email protected]2329bfc72014-02-28 02:03:21110#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
[email protected]80b161a2011-06-27 17:42:11111#include "content/renderer/media/video_capture_impl_manager.h"
[email protected]ba164c912011-06-14 22:07:34112#include "content/renderer/media/video_capture_message_filter.h"
[email protected]d7ff5fb2014-05-29 19:50:25113#include "content/renderer/net_info_helper.h"
[email protected]4761cf12012-09-12 10:37:55114#include "content/renderer/p2p/socket_dispatcher.h"
[email protected]82307f6b2014-08-07 03:30:12115#include "content/renderer/render_frame_proxy.h"
[email protected]8704f89b2011-04-15 00:30:05116#include "content/renderer/render_process_impl.h"
[email protected]310ebd6302011-10-10 19:06:28117#include "content/renderer/render_view_impl.h"
tfarina556a7232014-10-05 01:02:09118#include "content/renderer/renderer_blink_platform_impl.h"
jdduke94ae1f32015-02-05 06:27:13119#include "content/renderer/scheduler/resource_dispatch_throttler.h"
[email protected]7670d4332013-11-29 04:35:00120#include "content/renderer/service_worker/embedded_worker_dispatcher.h"
mek27c9d742015-07-16 18:30:18121#include "content/renderer/service_worker/service_worker_context_client.h"
kinuko5af4ffe2015-06-09 03:38:46122#include "content/renderer/service_worker/service_worker_context_message_filter.h"
[email protected]0ec90d522014-03-12 16:28:19123#include "content/renderer/shared_worker/embedded_shared_worker_stub.h"
chunyang.daibe874c52014-11-14 06:45:05124#include "gin/public/debug.h"
dongseong.hwang72183b02014-12-08 10:41:55125#include "gpu/GLES2/gl2extchromium.h"
danakj6f4e1e22016-04-20 03:27:34126#include "gpu/command_buffer/client/shared_memory_limits.h"
danakj870925d42016-05-03 20:07:38127#include "gpu/ipc/client/command_buffer_proxy_impl.h"
penghuang346a46f92016-03-31 21:37:52128#include "gpu/ipc/client/gpu_channel_host.h"
[email protected]46f36a492010-07-28 19:36:41129#include "ipc/ipc_channel_handle.h"
amistryd4aa70d2016-06-23 07:52:37130#include "ipc/ipc_channel_mojo.h"
[email protected]cb6037d2009-11-16 22:55:17131#include "ipc/ipc_platform_file.h"
[email protected]433df472012-03-07 20:33:39132#include "media/base/media.h"
servolk8b3b39b2015-03-03 19:08:18133#include "media/renderers/gpu_video_accelerator_factories.h"
[email protected]f68c1462014-04-24 18:17:53134#include "mojo/common/common_type_converters.h"
rockot85dce0862015-11-13 01:33:59135#include "mojo/public/cpp/bindings/strong_binding.h"
[email protected]620161e2011-03-07 18:05:26136#include "net/base/net_errors.h"
eroman9ab64842015-07-21 05:07:52137#include "net/base/port_util.h"
hablichd6a4f122015-10-28 11:34:49138#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
tfarina7a4a7fd2016-01-20 14:23:44139#include "net/base/url_util.h"
rockotcef38272016-07-15 22:47:47140#include "services/shell/public/cpp/interface_provider.h"
141#include "services/shell/public/cpp/interface_registry.h"
[email protected]b48c53ad2014-02-05 21:59:18142#include "skia/ext/event_tracer_impl.h"
ssid59c969162015-07-28 13:02:58143#include "skia/ext/skia_memory_dump_provider.h"
reed6e5a72222015-08-06 20:37:16144#include "third_party/WebKit/public/platform/WebImageGenerator.h"
bashi5f4c78922016-08-18 23:06:08145#include "third_party/WebKit/public/platform/WebMemoryCoordinator.h"
[email protected]89c36f82013-07-17 06:23:27146#include "third_party/WebKit/public/platform/WebString.h"
skyostil457b0a12014-09-09 10:12:07147#include "third_party/WebKit/public/platform/WebThread.h"
skyostil529caa292016-08-10 17:44:51148#include "third_party/WebKit/public/platform/scheduler/child/compositor_worker_scheduler.h"
149#include "third_party/WebKit/public/platform/scheduler/child/webthread_impl_for_worker_scheduler.h"
150#include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h"
hong.zhenga35a480d2014-12-25 17:11:09151#include "third_party/WebKit/public/web/WebCache.h"
[email protected]2255a9332013-06-17 05:12:31152#include "third_party/WebKit/public/web/WebDatabase.h"
153#include "third_party/WebKit/public/web/WebDocument.h"
154#include "third_party/WebKit/public/web/WebFrame.h"
155#include "third_party/WebKit/public/web/WebKit.h"
156#include "third_party/WebKit/public/web/WebNetworkStateNotifier.h"
[email protected]2255a9332013-06-17 05:12:31157#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
158#include "third_party/WebKit/public/web/WebScriptController.h"
159#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
[email protected]2255a9332013-06-17 05:12:31160#include "third_party/WebKit/public/web/WebView.h"
jshin0a9aa632015-04-29 18:35:29161#include "third_party/icu/source/i18n/unicode/timezone.h"
[email protected]ddbb53342014-01-06 10:59:47162#include "third_party/skia/include/core/SkGraphics.h"
[email protected]c49201a2012-05-24 11:04:57163#include "ui/base/layout.h"
[email protected]18ad6772011-09-20 21:51:32164#include "ui/base/ui_base_switches.h"
ennee292bdc2016-09-15 19:57:15165#include "ui/gl/gl_switches.h"
[email protected]2c62b562009-01-27 19:04:50166
[email protected]33b02992014-03-01 01:06:29167#if defined(OS_ANDROID)
168#include <cpu-features.h>
boliubee541f42015-11-05 00:52:53169#include "content/renderer/android/synchronous_compositor_filter.h"
danakj1120f4c2016-09-15 02:05:32170#include "content/renderer/android/synchronous_compositor_frame_sink.h"
[email protected]33b02992014-03-01 01:06:29171#include "content/renderer/media/android/renderer_demuxer_android.h"
boliue81d16132016-04-26 00:54:41172#include "content/renderer/media/android/stream_texture_factory.h"
dalecurtis88af3932016-02-20 00:12:20173#include "media/base/android/media_codec_util.h"
[email protected]33b02992014-03-01 01:06:29174#endif
175
176#if defined(OS_MACOSX)
ccamerona7644752014-12-30 01:16:31177#include "base/mac/mac_util.h"
rsesek1efb3c32015-09-29 15:39:50178#include "content/renderer/theme_helper_mac.h"
[email protected]33b02992014-03-01 01:06:29179#include "content/renderer/webscrollbarbehavior_impl_mac.h"
180#endif
181
182#if defined(OS_POSIX)
183#include "ipc/ipc_channel_posix.h"
184#endif
185
[email protected]da00a2882009-03-09 17:51:19186#if defined(OS_WIN)
187#include <windows.h>
188#include <objbase.h>
189#endif
190
[email protected]22fe91d2014-08-12 17:07:12191#if defined(ENABLE_WEBRTC)
liushouqun517b1292016-09-14 05:58:59192#include "content/renderer/media/aec_dump_message_filter.h"
[email protected]22fe91d2014-08-12 17:07:12193#include "content/renderer/media/peer_connection_tracker.h"
194#include "content/renderer/media/rtc_peer_connection_handler.h"
195#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
[email protected]22fe91d2014-08-12 17:07:12196#endif
197
chunyang.daibe874c52014-11-14 06:45:05198#ifdef ENABLE_VTUNE_JIT_INTERFACE
199#include "v8/src/third_party/vtune/v8-vtune.h"
200#endif
201
sadrul943e3b32016-08-04 18:22:59202#if defined(USE_AURA)
fsamuel6c6da0232015-11-26 05:13:46203#include "content/public/common/mojo_shell_connection.h"
danakj83066a32016-06-21 02:34:49204#include "content/renderer/mus/render_widget_mus_connection.h"
fsamuel2545ecc2015-12-05 00:44:46205#include "content/renderer/mus/render_widget_window_tree_client_factory.h"
sadrul99097442016-08-11 16:10:12206#include "services/ui/public/cpp/gpu_service.h"
fsamuel6c6da0232015-11-26 05:13:46207#endif
208
ochangdd89a1e2016-06-08 16:39:01209#if defined(ENABLE_IPC_FUZZER)
210#include "content/common/external_ipc_dumper.h"
211#endif
212
[email protected]d293572a2013-05-23 18:50:45213using base::ThreadRestrictions;
[email protected]180ef242013-11-07 06:50:46214using blink::WebDocument;
215using blink::WebFrame;
216using blink::WebNetworkStateNotifier;
217using blink::WebRuntimeFeatures;
218using blink::WebScriptController;
219using blink::WebSecurityPolicy;
220using blink::WebString;
221using blink::WebView;
skyostil529caa292016-08-10 17:44:51222using blink::scheduler::WebThreadImplForWorkerScheduler;
[email protected]e9ff79c2012-10-19 21:31:26223
224namespace content {
initial.commit09911bf2008-07-26 23:55:29225
[email protected]42f1d7822009-07-23 18:17:55226namespace {
[email protected]da9ccfb2012-01-28 00:34:40227
avi1023d012015-12-25 02:39:14228const int64_t kInitialIdleHandlerDelayMs = 1000;
229const int64_t kLongIdleHandlerDelayMs = 30 * 1000;
[email protected]bee16aab2009-08-26 15:55:03230
jdduke94ae1f32015-02-05 06:27:13231#if defined(OS_ANDROID)
232// On Android, resource messages can each take ~1.5ms to dispatch on the browser
233// IO thread. Limiting the message rate to 3/frame at 60hz ensures that the
234// induced work takes but a fraction (~1/4) of the overall frame budget.
235const int kMaxResourceRequestsPerFlushWhenThrottled = 3;
236#else
237const int kMaxResourceRequestsPerFlushWhenThrottled = 8;
238#endif
239const double kThrottledResourceRequestFlushPeriodS = 1. / 60.;
240
[email protected]dd2c1022014-07-22 23:13:57241// Maximum allocation size allowed for image scaling filters that
242// require pre-scaling. Skia will fallback to a filter that doesn't
243// require pre-scaling if the default filter would require an
244// allocation that exceeds this limit.
245const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024;
246
danakj83066a32016-06-21 02:34:49247// Unique identifier for each output surface created.
danakj1120f4c2016-09-15 02:05:32248uint32_t g_next_compositor_frame_sink_id = 1;
danakj83066a32016-06-21 02:34:49249
[email protected]f1a29a02011-10-06 23:08:44250// Keep the global RenderThreadImpl in a TLS slot so it is impossible to access
[email protected]f3ede412010-06-21 22:52:16251// incorrectly from the wrong thread.
[email protected]da9ccfb2012-01-28 00:34:40252base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> >
[email protected]6de0fd1d2011-11-15 13:31:49253 lazy_tls = LAZY_INSTANCE_INITIALIZER;
[email protected]1edc16b82009-04-07 17:45:54254
hong.zhengb28b5332016-05-11 02:33:39255// v8::MemoryPressureLevel should correspond to base::MemoryPressureListener.
256static_assert(static_cast<v8::MemoryPressureLevel>(
257 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) ==
258 v8::MemoryPressureLevel::kNone, "none level not align");
259static_assert(static_cast<v8::MemoryPressureLevel>(
260 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) ==
261 v8::MemoryPressureLevel::kModerate, "moderate level not align");
262static_assert(static_cast<v8::MemoryPressureLevel>(
263 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) ==
264 v8::MemoryPressureLevel::kCritical, "critical level not align");
265
hong.zheng2e296f822016-06-29 02:47:44266// WebMemoryPressureLevel should correspond to base::MemoryPressureListener.
267static_assert(static_cast<blink::WebMemoryPressureLevel>(
268 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) ==
269 blink::WebMemoryPressureLevelNone,
270 "blink::WebMemoryPressureLevelNone not align");
271static_assert(static_cast<blink::WebMemoryPressureLevel>(
272 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) ==
273 blink::WebMemoryPressureLevelModerate,
274 "blink::WebMemoryPressureLevelModerate not align");
275static_assert(static_cast<blink::WebMemoryPressureLevel>(
276 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) ==
277 blink::WebMemoryPressureLevelCritical,
278 "blink::WebMemoryPressureLevelCritical not align");
279
sadrulff12c002016-01-14 20:52:20280class WebThreadForCompositor : public WebThreadImplForWorkerScheduler {
281 public:
282 explicit WebThreadForCompositor(base::Thread::Options options)
283 : WebThreadImplForWorkerScheduler("Compositor", options) {
284 Init();
285 }
286 ~WebThreadForCompositor() override {}
287
288 private:
289 // WebThreadImplForWorkerScheduler:
skyostil529caa292016-08-10 17:44:51290 std::unique_ptr<blink::scheduler::WorkerScheduler> CreateWorkerScheduler()
291 override {
ricea29649b92016-08-31 09:30:21292 return base::MakeUnique<blink::scheduler::CompositorWorkerScheduler>(
293 thread());
sadrulff12c002016-01-14 20:52:20294 }
295
296 DISALLOW_COPY_AND_ASSIGN(WebThreadForCompositor);
297};
298
[email protected]b2d98762012-09-03 17:04:06299void* CreateHistogram(
[email protected]d1b8fccc2011-08-03 01:20:13300 const char *name, int min, int max, size_t buckets) {
301 if (min <= 0)
302 min = 1;
[email protected]b2d98762012-09-03 17:04:06303 std::string histogram_name;
304 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
305 if (render_thread_impl) { // Can be null in tests.
306 histogram_name = render_thread_impl->
307 histogram_customizer()->ConvertToCustomHistogramName(name);
308 } else {
309 histogram_name = std::string(name);
310 }
[email protected]de415552013-01-23 04:12:17311 base::HistogramBase* histogram = base::Histogram::FactoryGet(
[email protected]b2d98762012-09-03 17:04:06312 histogram_name, min, max, buckets,
313 base::Histogram::kUmaTargetedHistogramFlag);
[email protected]d1b8fccc2011-08-03 01:20:13314 return histogram;
315}
316
[email protected]b2d98762012-09-03 17:04:06317void AddHistogramSample(void* hist, int sample) {
[email protected]d1b8fccc2011-08-03 01:20:13318 base::Histogram* histogram = static_cast<base::Histogram*>(hist);
319 histogram->Add(sample);
320}
321
[email protected]df9accd2014-03-13 18:18:30322void NotifyTimezoneChangeOnThisThread() {
323 v8::Isolate* isolate = v8::Isolate::GetCurrent();
324 if (!isolate)
325 return;
326 v8::Date::DateTimeConfigurationChangeNotification(isolate);
327}
328
ben76f52b242016-06-18 05:42:48329class FrameFactoryImpl : public mojom::FrameFactory {
rockotf8fdd9b2015-12-16 22:22:35330 public:
rockot8e66a08d2016-09-13 00:48:21331 FrameFactoryImpl() : routing_id_highmark_(-1) {}
rockotf8fdd9b2015-12-16 22:22:35332
ben76f52b242016-06-18 05:42:48333 private:
334 // mojom::FrameFactory:
335 void CreateFrame(int32_t frame_routing_id,
336 mojom::FrameRequest frame_request,
337 mojom::FrameHostPtr frame_host) override {
rockotf8fdd9b2015-12-16 22:22:35338 // TODO(morrita): This is for investigating http://crbug.com/415059 and
339 // should be removed once it is fixed.
340 CHECK_LT(routing_id_highmark_, frame_routing_id);
341 routing_id_highmark_ = frame_routing_id;
342
343 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id);
344 // We can receive a GetServiceProviderForFrame message for a frame not yet
345 // created due to a race between the message and a ViewMsg_New IPC that
346 // triggers creation of the RenderFrame we want.
347 if (!frame) {
ben76f52b242016-06-18 05:42:48348 RenderThreadImpl::current()->RegisterPendingFrameCreate(
349 frame_routing_id, std::move(frame_request), std::move(frame_host));
rockotf8fdd9b2015-12-16 22:22:35350 return;
351 }
352
ben76f52b242016-06-18 05:42:48353 frame->Bind(std::move(frame_request), std::move(frame_host));
rockotf8fdd9b2015-12-16 22:22:35354 }
355
356 private:
357 int32_t routing_id_highmark_;
rockotf8fdd9b2015-12-16 22:22:35358};
359
ben76f52b242016-06-18 05:42:48360void CreateFrameFactory(mojom::FrameFactoryRequest request) {
rockot8e66a08d2016-09-13 00:48:21361 mojo::MakeStrongBinding(base::MakeUnique<FrameFactoryImpl>(),
362 std::move(request));
rockotf8fdd9b2015-12-16 22:22:35363}
364
mek27c9d742015-07-16 18:30:18365void SetupEmbeddedWorkerOnWorkerThread(
ben13be6082016-06-29 15:08:58366 shell::mojom::InterfaceProviderRequest request,
367 shell::mojom::InterfaceProviderPtrInfo remote_interfaces) {
mek27c9d742015-07-16 18:30:18368 ServiceWorkerContextClient* client =
369 ServiceWorkerContextClient::ThreadSpecificInstance();
370 // It is possible for client to be null if for some reason the worker died
371 // before this call made it to the worker thread. In that case just do
372 // nothing and let mojo close the connection.
373 if (!client)
374 return;
ben13be6082016-06-29 15:08:58375 client->BindInterfaceProviders(std::move(request),
376 mojo::MakeProxy(std::move(remote_interfaces)));
mek27c9d742015-07-16 18:30:18377}
378
leon.hanbe782c42016-03-22 05:05:22379class EmbeddedWorkerSetupImpl : public mojom::EmbeddedWorkerSetup {
mek27c9d742015-07-16 18:30:18380 public:
rockot8e66a08d2016-09-13 00:48:21381 EmbeddedWorkerSetupImpl() = default;
mek27c9d742015-07-16 18:30:18382
ben95787952016-02-10 07:46:20383 void ExchangeInterfaceProviders(
mek27c9d742015-07-16 18:30:18384 int32_t thread_id,
ben13be6082016-06-29 15:08:58385 shell::mojom::InterfaceProviderRequest request,
386 shell::mojom::InterfaceProviderPtr remote_interfaces) override {
kinukoef647412015-12-23 06:10:43387 WorkerThreadRegistry::Instance()->GetTaskRunnerFor(thread_id)->PostTask(
mek27c9d742015-07-16 18:30:18388 FROM_HERE,
ben13be6082016-06-29 15:08:58389 base::Bind(&SetupEmbeddedWorkerOnWorkerThread, base::Passed(&request),
390 base::Passed(remote_interfaces.PassInterface())));
mek27c9d742015-07-16 18:30:18391 }
mek27c9d742015-07-16 18:30:18392};
393
rockot8e66a08d2016-09-13 00:48:21394void CreateEmbeddedWorkerSetup(mojom::EmbeddedWorkerSetupRequest request) {
395 mojo::MakeStrongBinding(base::MakeUnique<EmbeddedWorkerSetupImpl>(),
396 std::move(request));
mek27c9d742015-07-16 18:30:18397}
398
danakjc3983552016-05-03 00:04:35399scoped_refptr<ContextProviderCommandBuffer> CreateOffscreenContext(
400 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
danakj0dd9e1e2016-05-11 22:15:09401 const gpu::SharedMemoryLimits& limits,
danakj9a04adc2016-05-16 22:45:07402 bool support_locking,
sunnypsd8ce1c22016-05-10 18:02:40403 command_buffer_metrics::ContextType type,
404 int32_t stream_id,
405 gpu::GpuStreamPriority stream_priority) {
danakje8ec797e2016-04-19 04:08:43406 DCHECK(gpu_channel_host);
407 // This is used to create a few different offscreen contexts:
408 // - The shared main thread context (offscreen) used by blink for canvas.
409 // - The worker context (offscreen) used for GPU raster and video decoding.
410 // This is for an offscreen context, so the default framebuffer doesn't need
411 // alpha, depth, stencil, antialiasing.
412 gpu::gles2::ContextCreationAttribHelper attributes;
413 attributes.alpha_size = -1;
414 attributes.depth_size = 0;
415 attributes.stencil_size = 0;
416 attributes.samples = 0;
417 attributes.sample_buffers = 0;
418 attributes.bind_generates_resource = false;
419 attributes.lose_context_when_out_of_memory = true;
sunnypsd8ce1c22016-05-10 18:02:40420 const bool automatic_flushes = false;
danakjc3983552016-05-03 00:04:35421 return make_scoped_refptr(new ContextProviderCommandBuffer(
sunnypsd8ce1c22016-05-10 18:02:40422 std::move(gpu_channel_host), stream_id, stream_priority,
423 gpu::kNullSurfaceHandle,
danakjba37f812016-05-03 03:58:03424 GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext"),
pimand488e8b42016-06-30 19:06:59425 automatic_flushes, support_locking, limits, attributes, nullptr, type));
danakje8ec797e2016-04-19 04:08:43426}
427
penghuange1d86512016-07-08 18:15:00428bool IsRunningInMash() {
429 const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
430 return cmdline->HasSwitch(switches::kIsRunningInMash);
431}
432
[email protected]b2d98762012-09-03 17:04:06433} // namespace
434
[email protected]fdeac262014-07-10 12:52:51435// For measuring memory usage after each task. Behind a command line flag.
436class MemoryObserver : public base::MessageLoop::TaskObserver {
437 public:
438 MemoryObserver() {}
dcheng6d18e402014-10-21 12:32:52439 ~MemoryObserver() override {}
[email protected]fdeac262014-07-10 12:52:51440
dcheng6d18e402014-10-21 12:32:52441 void WillProcessTask(const base::PendingTask& pending_task) override {}
[email protected]fdeac262014-07-10 12:52:51442
dcheng6d18e402014-10-21 12:32:52443 void DidProcessTask(const base::PendingTask& pending_task) override {
asvitkinec0fb8022014-08-26 04:39:35444 LOCAL_HISTOGRAM_MEMORY_KB("Memory.RendererUsed", GetMemoryUsageKB());
[email protected]fdeac262014-07-10 12:52:51445 }
446
447 private:
448 DISALLOW_COPY_AND_ASSIGN(MemoryObserver);
449};
450
[email protected]b2d98762012-09-03 17:04:06451RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() {
452 custom_histograms_.insert("V8.MemoryExternalFragmentationTotal");
453 custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted");
454 custom_histograms_.insert("V8.MemoryHeapSampleTotalUsed");
hablich4598ddc2015-11-07 18:37:28455 custom_histograms_.insert("V8.MemoryHeapUsed");
456 custom_histograms_.insert("V8.MemoryHeapCommitted");
[email protected]b2d98762012-09-03 17:04:06457}
458
459RenderThreadImpl::HistogramCustomizer::~HistogramCustomizer() {}
460
461void RenderThreadImpl::HistogramCustomizer::RenderViewNavigatedToHost(
462 const std::string& host, size_t view_count) {
avi83883c82014-12-23 00:08:49463 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
464 switches::kDisableHistogramCustomizer)) {
[email protected]9baee832012-12-10 11:07:15465 return;
466 }
[email protected]b2d98762012-09-03 17:04:06467 // Check if all RenderViews are displaying a page from the same host. If there
468 // is only one RenderView, the common host is this view's host. If there are
469 // many, check if this one shares the common host of the other
470 // RenderViews. It's ok to not detect some cases where the RenderViews share a
471 // common host. This information is only used for producing custom histograms.
472 if (view_count == 1)
473 SetCommonHost(host);
474 else if (host != common_host_)
475 SetCommonHost(std::string());
476}
477
478std::string RenderThreadImpl::HistogramCustomizer::ConvertToCustomHistogramName(
479 const char* histogram_name) const {
480 std::string name(histogram_name);
481 if (!common_host_histogram_suffix_.empty() &&
482 custom_histograms_.find(name) != custom_histograms_.end())
483 name += common_host_histogram_suffix_;
484 return name;
485}
486
487void RenderThreadImpl::HistogramCustomizer::SetCommonHost(
488 const std::string& host) {
489 if (host != common_host_) {
490 common_host_ = host;
491 common_host_histogram_suffix_ = HostToCustomHistogramSuffix(host);
[email protected]4b5340282014-07-08 11:37:34492 blink::mainThreadIsolate()->SetCreateHistogramFunction(CreateHistogram);
[email protected]b2d98762012-09-03 17:04:06493 }
494}
495
hablichd6a4f122015-10-28 11:34:49496std::string RenderThreadImpl::HistogramCustomizer::HostToCustomHistogramSuffix(
497 const std::string& host) {
498 if (host == "mail.google.com")
499 return ".gmail";
500 if (host == "docs.google.com" || host == "drive.google.com")
501 return ".docs";
502 if (host == "plus.google.com")
503 return ".plus";
504 if (host == "inbox.google.com")
505 return ".inbox";
hpayerdd4def052016-02-06 19:06:10506 if (host == "calendar.google.com")
507 return ".calendar";
hablichd6a4f122015-10-28 11:34:49508 if (host == "www.youtube.com")
509 return ".youtube";
510 if (IsAlexaTop10NonGoogleSite(host))
511 return ".top10";
512
513 return std::string();
514}
515
516bool RenderThreadImpl::HistogramCustomizer::IsAlexaTop10NonGoogleSite(
517 const std::string& host) {
518 // The Top10 sites have different TLD and/or subdomains depending on the
519 // localization.
520 if (host == "sina.com.cn")
521 return true;
522
523 std::string sanitized_host =
524 net::registry_controlled_domains::GetDomainAndRegistry(
525 host, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
526
527 if (sanitized_host == "facebook.com")
528 return true;
529 if (sanitized_host == "baidu.com")
530 return true;
531 if (sanitized_host == "qq.com")
532 return true;
533 if (sanitized_host == "twitter.com")
534 return true;
535 if (sanitized_host == "taobao.com")
536 return true;
537 if (sanitized_host == "live.com")
538 return true;
539
540 if (!sanitized_host.empty()) {
541 std::vector<base::StringPiece> host_tokens = base::SplitStringPiece(
542 sanitized_host, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
543
544 if (host_tokens.size() >= 2) {
545 if ((host_tokens[0] == "yahoo") || (host_tokens[0] == "amazon") ||
546 (host_tokens[0] == "wikipedia")) {
547 return true;
548 }
549 }
550 }
551 return false;
552}
553
leon.han2c0f9f12015-07-11 02:01:19554// static
555RenderThreadImpl* RenderThreadImpl::Create(
556 const InProcessChildThreadParams& params) {
skyostil529caa292016-08-10 17:44:51557 std::unique_ptr<blink::scheduler::RendererScheduler> renderer_scheduler =
558 blink::scheduler::RendererScheduler::Create();
jam75c44222016-03-23 05:34:24559 scoped_refptr<base::SingleThreadTaskRunner> test_task_counter;
560 return new RenderThreadImpl(
561 params, std::move(renderer_scheduler), test_task_counter);
leon.han2c0f9f12015-07-11 02:01:19562}
563
564// static
565RenderThreadImpl* RenderThreadImpl::Create(
dchengcedca5612016-04-09 01:40:15566 std::unique_ptr<base::MessageLoop> main_message_loop,
skyostil529caa292016-08-10 17:44:51567 std::unique_ptr<blink::scheduler::RendererScheduler> renderer_scheduler) {
dcheng07945f632015-12-26 07:59:32568 return new RenderThreadImpl(std::move(main_message_loop),
569 std::move(renderer_scheduler));
leon.han2c0f9f12015-07-11 02:01:19570}
571
[email protected]f1a29a02011-10-06 23:08:44572RenderThreadImpl* RenderThreadImpl::current() {
[email protected]526476902011-10-06 20:34:06573 return lazy_tls.Pointer()->Get();
574}
575
leon.han2c0f9f12015-07-11 02:01:19576RenderThreadImpl::RenderThreadImpl(
577 const InProcessChildThreadParams& params,
skyostil529caa292016-08-10 17:44:51578 std::unique_ptr<blink::scheduler::RendererScheduler> scheduler,
jam75c44222016-03-23 05:34:24579 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue)
morritac6238ab2015-03-18 01:48:29580 : ChildThreadImpl(Options::Builder()
prashant.nfad657e2016-06-01 07:52:17581 .InBrowserProcess(params)
582 .UseMojoChannel(true)
rockotcef38272016-07-15 22:47:47583 .AutoStartMojoShellConnection(false)
ben5be0b9132016-08-03 00:17:18584 .ConnectToBrowser(true)
prashant.nfad657e2016-06-01 07:52:17585 .Build()),
dcheng07945f632015-12-26 07:59:32586 renderer_scheduler_(std::move(scheduler)),
blundellc00adf442016-09-16 10:43:41587 time_zone_monitor_binding_(this),
prashant.nfad657e2016-06-01 07:52:17588 categorized_worker_pool_(new CategorizedWorkerPool()) {
jam75c44222016-03-23 05:34:24589 Init(resource_task_queue);
morritac6238ab2015-03-18 01:48:29590}
591
[email protected]42f1d7822009-07-23 18:17:55592// When we run plugins in process, we actually run them on the render thread,
593// which means that we need to make the render thread pump UI events.
haraken53f081d2014-11-11 01:03:40594RenderThreadImpl::RenderThreadImpl(
dchengcedca5612016-04-09 01:40:15595 std::unique_ptr<base::MessageLoop> main_message_loop,
skyostil529caa292016-08-10 17:44:51596 std::unique_ptr<blink::scheduler::RendererScheduler> scheduler)
rockotcef38272016-07-15 22:47:47597 : ChildThreadImpl(Options::Builder()
598 .UseMojoChannel(true)
599 .AutoStartMojoShellConnection(false)
ben5be0b9132016-08-03 00:17:18600 .ConnectToBrowser(true)
rockotcef38272016-07-15 22:47:47601 .Build()),
dcheng07945f632015-12-26 07:59:32602 renderer_scheduler_(std::move(scheduler)),
blundellc00adf442016-09-16 10:43:41603 time_zone_monitor_binding_(this),
dcheng07945f632015-12-26 07:59:32604 main_message_loop_(std::move(main_message_loop)),
prashant.nfad657e2016-06-01 07:52:17605 categorized_worker_pool_(new CategorizedWorkerPool()) {
jam75c44222016-03-23 05:34:24606 scoped_refptr<base::SingleThreadTaskRunner> test_task_counter;
607 Init(test_task_counter);
haraken53f081d2014-11-11 01:03:40608}
609
jam75c44222016-03-23 05:34:24610void RenderThreadImpl::Init(
611 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) {
fdorayf6d86242015-10-08 16:49:53612 TRACE_EVENT0("startup", "RenderThreadImpl::Init");
[email protected]a872ea1f2010-08-11 04:45:33613
ssidb2e3ece2015-02-09 16:02:20614 base::trace_event::TraceLog::GetInstance()->SetThreadSortIndex(
[email protected]91a2aea2013-07-08 23:14:39615 base::PlatformThread::CurrentId(),
616 kTraceEventRendererMainThreadSortIndex);
617
haibinluc643d33c2016-06-03 02:22:34618#if defined(USE_EXTERNAL_POPUP_MENU)
sievers9dff72052015-11-16 18:35:57619 // On Mac and Android Java UI, the select popups are rendered by the browser.
[email protected]180ef242013-11-07 06:50:46620 blink::WebView::setUseExternalPopupMenus(true);
[email protected]53c607c2011-03-21 23:19:04621#endif
622
[email protected]94f9a0f682009-06-15 18:30:30623 lazy_tls.Pointer()->Set(this);
[email protected]b3e83de2012-02-07 03:33:28624
[email protected]06c694d2012-02-01 22:26:16625 // Register this object as the main thread.
626 ChildProcess::current()->set_main_thread(this);
627
sadrul943e3b32016-08-04 18:22:59628#if defined(USE_AURA)
sadrul62c31132016-08-11 04:13:17629 if (IsRunningInMash()) {
sadrul9e0bb1d2016-08-04 20:18:39630 gpu_service_ =
sadrul75f7dde2016-08-22 23:37:24631 ui::GpuService::Create(GetMojoShellConnection()->GetConnector(),
632 ChildProcess::current()->io_task_runner());
sadrul62c31132016-08-11 04:13:17633 }
penghuange1d86512016-07-08 18:15:00634#endif
635
jam75c44222016-03-23 05:34:24636 InitializeWebKit(resource_task_queue);
637
[email protected]31f87132010-04-21 23:36:21638 // In single process the single process is all there is.
[email protected]26e82322014-01-20 14:18:22639 webkit_shared_timer_suspended_ = false;
[email protected]bee16aab2009-08-26 15:55:03640 widget_count_ = 0;
641 hidden_widget_count_ = 0;
[email protected]6593ae12011-11-14 12:09:44642 idle_notification_delay_in_ms_ = kInitialIdleHandlerDelayMs;
[email protected]1784b2f2011-11-24 10:53:48643 idle_notifications_to_skip_ = 0;
[email protected]8d86fce2009-02-26 23:37:55644
[email protected]d5b2fdf2013-06-05 09:36:55645 appcache_dispatcher_.reset(
[email protected]a8cb3b73b2013-08-12 05:50:50646 new AppCacheDispatcher(Get(), new AppCacheFrontendImpl()));
[email protected]1910fe82012-05-10 00:04:10647 dom_storage_dispatcher_.reset(new DomStorageDispatcher());
[email protected]1e8d91e2013-06-27 00:12:43648 main_thread_indexed_db_dispatcher_.reset(new IndexedDBDispatcher(
649 thread_safe_sender()));
jsbellabadb9b2015-03-23 21:03:44650 main_thread_cache_storage_dispatcher_.reset(
jsbell279efb42015-03-31 17:02:46651 new CacheStorageDispatcher(thread_safe_sender()));
[email protected]7670d4332013-11-29 04:35:00652 embedded_worker_dispatcher_.reset(new EmbeddedWorkerDispatcher());
[email protected]dd9241932010-02-24 19:23:13653
jdduke94ae1f32015-02-05 06:27:13654 // Note: This may reorder messages from the ResourceDispatcher with respect to
655 // other subsystems.
656 resource_dispatch_throttler_.reset(new ResourceDispatchThrottler(
657 static_cast<RenderThread*>(this), renderer_scheduler_.get(),
658 base::TimeDelta::FromSecondsD(kThrottledResourceRequestFlushPeriodS),
659 kMaxResourceRequestsPerFlushWhenThrottled));
660 resource_dispatcher()->set_message_sender(resource_dispatch_throttler_.get());
661
penghuange1d86512016-07-08 18:15:00662 media_stream_center_ = nullptr;
[email protected]d8cd8372012-03-09 10:49:51663
thestig529ad8a2016-07-08 20:30:12664 blob_message_filter_ = new BlobMessageFilter(GetFileThreadTaskRunner());
dmurph1fb98482016-03-30 21:14:26665 AddFilter(blob_message_filter_.get());
[email protected]017022b2009-07-27 23:06:34666 db_message_filter_ = new DBMessageFilter();
667 AddFilter(db_message_filter_.get());
[email protected]dd9241932010-02-24 19:23:13668
[email protected]45048072014-01-14 13:51:29669 vc_manager_.reset(new VideoCaptureImplManager());
[email protected]c9c43a02013-12-17 08:59:54670 AddFilter(vc_manager_->video_capture_message_filter());
671
fsamuel6c1dfeb2014-12-18 19:21:33672 browser_plugin_manager_.reset(new BrowserPluginManager());
673 AddObserver(browser_plugin_manager_.get());
674
[email protected]4761cf12012-09-12 10:37:55675#if defined(ENABLE_WEBRTC)
[email protected]af089972013-01-10 04:04:40676 peer_connection_tracker_.reset(new PeerConnectionTracker());
677 AddObserver(peer_connection_tracker_.get());
678
thestig529ad8a2016-07-08 20:30:12679 p2p_socket_dispatcher_ = new P2PSocketDispatcher(GetIOTaskRunner().get());
[email protected]fc72bb12013-06-02 21:13:46680 AddFilter(p2p_socket_dispatcher_.get());
[email protected]921480f62013-07-20 03:42:57681
ivocadd54f0d2015-12-18 23:17:05682 peer_connection_factory_.reset(
683 new PeerConnectionDependencyFactory(p2p_socket_dispatcher_.get()));
684
skyostil2d3b5bd2015-05-27 15:40:59685 aec_dump_message_filter_ = new AecDumpMessageFilter(
thestig529ad8a2016-07-08 20:30:12686 GetIOTaskRunner(), message_loop()->task_runner());
ivocadd54f0d2015-12-18 23:17:05687
[email protected]da9f30a2014-06-18 19:39:04688 AddFilter(aec_dump_message_filter_.get());
689
[email protected]4761cf12012-09-12 10:37:55690#endif // defined(ENABLE_WEBRTC)
[email protected]e25f4d72011-06-08 20:58:46691
thestig529ad8a2016-07-08 20:30:12692 audio_input_message_filter_ = new AudioInputMessageFilter(GetIOTaskRunner());
[email protected]f7eb0a392011-07-12 10:19:51693 AddFilter(audio_input_message_filter_.get());
694
thestig529ad8a2016-07-08 20:30:12695 audio_message_filter_ = new AudioMessageFilter(GetIOTaskRunner());
[email protected]f7eb0a392011-07-12 10:19:51696 AddFilter(audio_message_filter_.get());
697
thestig529ad8a2016-07-08 20:30:12698 midi_message_filter_ = new MidiMessageFilter(GetIOTaskRunner());
[email protected]a9875152013-06-22 04:03:03699 AddFilter(midi_message_filter_.get());
700
[email protected]ce944c62013-11-19 16:34:36701 AddFilter((new IndexedDBMessageFilter(thread_safe_sender()))->GetFilter());
[email protected]31bfae72011-12-16 02:04:38702
jsbellabadb9b2015-03-23 21:03:44703 AddFilter((new CacheStorageMessageFilter(thread_safe_sender()))->GetFilter());
704
kinuko5af4ffe2015-06-09 03:38:46705 AddFilter((new ServiceWorkerContextMessageFilter())->GetFilter());
[email protected]ddbb53342014-01-06 10:59:47706
sadrul943e3b32016-08-04 18:22:59707#if defined(USE_AURA)
rockotcef38272016-07-15 22:47:47708 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
709 switches::kUseMusInRenderer)) {
710 CreateRenderWidgetWindowTreeClientFactory(GetMojoShellConnection());
711 }
712#endif
713
714 // Must be called before RenderThreadStarted() below.
715 StartMojoShellConnection();
716
[email protected]e9ff79c2012-10-19 21:31:26717 GetContentClient()->renderer()->RenderThreadStarted();
[email protected]6779aa12011-03-29 17:32:24718
[email protected]b48c53ad2014-02-05 21:59:18719 InitSkiaEventTracer();
ssid59c969162015-07-28 13:02:58720 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
primiano186d6bfe2015-10-30 13:21:40721 skia::SkiaMemoryDumpProvider::GetInstance(), "Skia", nullptr);
[email protected]b48c53ad2014-02-05 21:59:18722
avi83883c82014-12-23 00:08:49723 const base::CommandLine& command_line =
724 *base::CommandLine::ForCurrentProcess();
[email protected]e54ab492012-06-12 19:40:01725
ochangdd89a1e2016-06-08 16:39:01726#if defined(ENABLE_IPC_FUZZER)
727 if (command_line.HasSwitch(switches::kIpcDumpDirectory)) {
728 base::FilePath dump_directory =
729 command_line.GetSwitchValuePath(switches::kIpcDumpDirectory);
730 IPC::ChannelProxy::OutgoingMessageFilter* filter =
731 LoadExternalIPCDumper(dump_directory);
732 GetChannel()->set_outgoing_message_filter(filter);
733 }
734#endif
735
jbroman0d302162015-09-05 05:46:23736 cc::SetClientNameForMetrics("Renderer");
loysoa6edaaff2015-05-25 03:26:44737
loyso65c93c602015-08-11 05:15:57738 is_threaded_animation_enabled_ =
739 !command_line.HasSwitch(cc::switches::kDisableThreadedAnimation);
740
reveman91a0a872014-11-04 03:40:32741 is_zero_copy_enabled_ = command_line.HasSwitch(switches::kEnableZeroCopy);
ericrk1d17f752015-10-20 03:03:07742 is_partial_raster_enabled_ =
dongseong.hwang23db47f2016-03-08 07:50:02743 !command_line.HasSwitch(switches::kDisablePartialRaster);
ccameronc7fcd132015-11-03 20:14:31744 is_gpu_memory_buffer_compositor_resources_enabled_ = command_line.HasSwitch(
745 switches::kEnableGpuMemoryBufferCompositorResources);
[email protected]a23530d2014-03-11 06:04:14746
jame1f453c2016-03-21 15:51:34747#if defined(OS_MACOSX)
thakis114a1ef2016-04-26 16:02:59748 base::ScopedCFTypeRef<CFStringRef> key(
749 base::SysUTF8ToCFStringRef("NSScrollViewRubberbanding"));
750 Boolean key_exists = false;
751 Boolean value = CFPreferencesGetAppBooleanValue(
752 key, kCFPreferencesCurrentApplication, &key_exists);
753 is_elastic_overscroll_enabled_ = !key_exists || value;
ccamerona7644752014-12-30 01:16:31754#else
755 is_elastic_overscroll_enabled_ = false;
756#endif
757
danakje6eb185c2015-02-27 23:52:05758 std::string image_texture_target_string =
dcastagna7f2f7192015-06-16 18:44:35759 command_line.GetSwitchValueASCII(switches::kContentImageTextureTarget);
ericrk9151705c2016-07-26 19:53:16760 buffer_to_texture_target_map_ =
761 cc::StringToBufferToTextureTargetMap(image_texture_target_string);
reveman44b807f12014-11-26 02:44:50762
[email protected]a23530d2014-03-11 06:04:14763 if (command_line.HasSwitch(switches::kDisableLCDText)) {
764 is_lcd_text_enabled_ = false;
765 } else if (command_line.HasSwitch(switches::kEnableLCDText)) {
766 is_lcd_text_enabled_ = true;
767 } else {
768#if defined(OS_ANDROID)
769 is_lcd_text_enabled_ = false;
770#else
771 is_lcd_text_enabled_ = true;
772#endif
773 }
774
[email protected]b8d82c22014-03-31 20:12:46775 is_gpu_rasterization_enabled_ =
776 command_line.HasSwitch(switches::kEnableGpuRasterization);
777 is_gpu_rasterization_forced_ =
778 command_line.HasSwitch(switches::kForceGpuRasterization);
sunnypsd8ce1c22016-05-10 18:02:40779 is_async_worker_context_enabled_ =
780 command_line.HasSwitch(switches::kEnableGpuAsyncWorkerContext);
[email protected]a23530d2014-03-11 06:04:14781
senorblancob60ba952015-01-27 19:12:36782 if (command_line.HasSwitch(switches::kGpuRasterizationMSAASampleCount)) {
783 std::string string_value = command_line.GetSwitchValueASCII(
784 switches::kGpuRasterizationMSAASampleCount);
785 bool parsed_msaa_sample_count =
786 base::StringToInt(string_value, &gpu_rasterization_msaa_sample_count_);
787 DCHECK(parsed_msaa_sample_count) << string_value;
788 DCHECK_GE(gpu_rasterization_msaa_sample_count_, 0);
789 } else {
senorblanco2a5b0e12015-08-14 21:55:37790 gpu_rasterization_msaa_sample_count_ = -1;
senorblancob60ba952015-01-27 19:12:36791 }
792
[email protected]b242b142014-05-07 14:48:49793 if (command_line.HasSwitch(switches::kDisableDistanceFieldText)) {
794 is_distance_field_text_enabled_ = false;
795 } else if (command_line.HasSwitch(switches::kEnableDistanceFieldText)) {
796 is_distance_field_text_enabled_ = true;
797 } else {
798 is_distance_field_text_enabled_ = false;
799 }
800
[email protected]433df472012-03-07 20:33:39801 // Note that under Linux, the media library will normally already have
802 // been initialized by the Zygote before this instance became a Renderer.
chcunninghamfd11b3c2015-06-09 02:09:42803 media::InitializeMediaLibrary();
[email protected]433df472012-03-07 20:33:39804
dalecurtis88af3932016-02-20 00:12:20805#if defined(OS_ANDROID)
806 if (!command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode) &&
807 media::MediaCodecUtil::IsMediaCodecAvailable()) {
808 media::EnablePlatformDecoderSupport();
809 }
810#endif
811
[email protected]5071cb22013-07-10 02:19:06812 memory_pressure_listener_.reset(new base::MemoryPressureListener(
hong.zhengb28b5332016-05-11 02:33:39813 base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)),
814 base::Bind(&RenderThreadImpl::OnSyncMemoryPressure,
815 base::Unretained(this))));
[email protected]5071cb22013-07-10 02:19:06816
bashia6264042016-09-15 04:49:51817 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) {
bashi77f19b32016-07-19 11:19:43818 // TODO(bashi): Revisit how to manage the lifetime of
819 // ChildMemoryCoordinatorImpl.
820 // https://codereview.chromium.org/2094583002/#msg52
bashia6264042016-09-15 04:49:51821 mojom::MemoryCoordinatorHandlePtr parent_coordinator;
bashi77f19b32016-07-19 11:19:43822 GetRemoteInterfaces()->GetInterface(mojo::GetProxy(&parent_coordinator));
bashia6264042016-09-15 04:49:51823 memory_coordinator_ = CreateChildMemoryCoordinator(
bashic4b4afcb2016-08-23 06:37:52824 std::move(parent_coordinator), this);
bashi77f19b32016-07-19 11:19:43825 }
826
danakj16275d4c2015-06-11 19:23:51827 int num_raster_threads = 0;
828 std::string string_value =
829 command_line.GetSwitchValueASCII(switches::kNumRasterThreads);
830 bool parsed_num_raster_threads =
831 base::StringToInt(string_value, &num_raster_threads);
832 DCHECK(parsed_num_raster_threads) << string_value;
833 DCHECK_GT(num_raster_threads, 0);
vmiura78b69282015-02-14 00:01:17834
vmpstr6c0b5112016-04-25 22:12:14835 // TODO(vmpstr): If the flag sticks, we should clean it up and always have
836 // image decode tasks.
vmpstr9dd810a2016-01-19 21:16:10837 are_image_decode_tasks_enabled_ = true;
halliwell4b3deee2014-12-19 19:57:49838
prashant.nfad657e2016-06-01 07:52:17839 categorized_worker_pool_->Start(num_raster_threads);
[email protected]1e1d1e12014-01-17 16:14:29840
boliu9760e212015-06-23 22:49:06841 // TODO(boliu): In single process, browser main loop should set up the
842 // discardable memory manager, and should skip this if kSingleProcess.
843 // See crbug.com/503724.
844 base::DiscardableMemoryAllocator::SetInstance(
845 ChildThreadImpl::discardable_shared_memory_manager());
revemancb5a66af2014-10-25 00:34:39846
bend1dd50f52016-06-26 22:10:48847 GetContentClient()->renderer()->ExposeInterfacesToBrowser(
848 GetInterfaceRegistry());
rockot229fb28e2016-06-16 04:46:16849
bend1dd50f52016-06-26 22:10:48850 GetInterfaceRegistry()->AddInterface(base::Bind(CreateFrameFactory));
851 GetInterfaceRegistry()->AddInterface(base::Bind(CreateEmbeddedWorkerSetup));
fsamuel6c6da0232015-11-26 05:13:46852
bend1dd50f52016-06-26 22:10:48853 GetRemoteInterfaces()->GetInterface(
jamc912ca32016-02-24 20:17:31854 mojo::GetProxy(&storage_partition_service_));
hajimehoshi69093272016-05-13 08:30:58855
blundellc00adf442016-09-16 10:43:41856 device::mojom::TimeZoneMonitorPtr time_zone_monitor;
857 GetRemoteInterfaces()->GetInterface(mojo::GetProxy(&time_zone_monitor));
858 time_zone_monitor->AddClient(
859 time_zone_monitor_binding_.CreateInterfacePtrAndBind());
860
hajimehoshi69093272016-05-13 08:30:58861 is_renderer_suspended_ = false;
initial.commit09911bf2008-07-26 23:55:29862}
863
[email protected]f1a29a02011-10-06 23:08:44864RenderThreadImpl::~RenderThreadImpl() {
[email protected]ce79d8512013-04-22 22:44:41865}
866
867void RenderThreadImpl::Shutdown() {
[email protected]1223d6ef2011-03-28 16:47:50868 FOR_EACH_OBSERVER(
tyoshino832a58a2016-04-18 08:14:08869 RenderThreadObserver, observers_, OnRenderProcessShutdown());
[email protected]1223d6ef2011-03-28 16:47:50870
[email protected]fdeac262014-07-10 12:52:51871 if (memory_observer_) {
872 message_loop()->RemoveTaskObserver(memory_observer_.get());
873 memory_observer_.reset();
874 }
875
[email protected]12cbfda32010-01-30 01:04:25876 // Wait for all databases to be closed.
tfarina556a7232014-10-05 01:02:09877 if (blink_platform_impl_) {
michaelnb15028542015-10-29 03:33:24878 // Crash the process if they fail to close after a generous amount of time.
879 bool all_closed = blink_platform_impl_->web_database_observer_impl()
880 ->WaitForAllDatabasesToClose(base::TimeDelta::FromSeconds(60));
881 CHECK(all_closed);
[email protected]1406f892013-11-12 19:38:19882 }
[email protected]12cbfda32010-01-30 01:04:25883
[email protected]8d86fce2009-02-26 23:37:55884 // Shutdown in reverse of the initialization order.
[email protected]fc72bb12013-06-02 21:13:46885 if (devtools_agent_message_filter_.get()) {
[email protected]b146d6d2012-09-11 10:20:05886 RemoveFilter(devtools_agent_message_filter_.get());
penghuange1d86512016-07-08 18:15:00887 devtools_agent_message_filter_ = nullptr;
[email protected]b146d6d2012-09-11 10:20:05888 }
[email protected]82622452011-07-22 09:57:20889
[email protected]f7eb0a392011-07-12 10:19:51890 RemoveFilter(audio_input_message_filter_.get());
penghuange1d86512016-07-08 18:15:00891 audio_input_message_filter_ = nullptr;
[email protected]f7eb0a392011-07-12 10:19:51892
[email protected]45048072014-01-14 13:51:29893#if defined(ENABLE_WEBRTC)
[email protected]51c7985e2014-05-23 22:00:08894 RTCPeerConnectionHandler::DestructAllHandlers();
tommi6c33f252014-11-24 12:29:51895 // |peer_connection_factory_| cannot be deleted until after the main message
896 // loop has been destroyed. This is because there may be pending tasks that
897 // hold on to objects produced by the PC factory that depend on threads owned
898 // by the PC factory. Once those tasks have been freed, the factory can be
899 // deleted.
[email protected]45048072014-01-14 13:51:29900#endif
[email protected]80b161a2011-06-27 17:42:11901 RemoveFilter(vc_manager_->video_capture_message_filter());
[email protected]45048072014-01-14 13:51:29902 vc_manager_.reset();
[email protected]80b161a2011-06-27 17:42:11903
[email protected]017022b2009-07-27 23:06:34904 RemoveFilter(db_message_filter_.get());
penghuange1d86512016-07-08 18:15:00905 db_message_filter_ = nullptr;
[email protected]12cbfda32010-01-30 01:04:25906
[email protected]c6a7b862010-08-20 22:19:38907 // Shutdown the file thread if it's running.
[email protected]59383c782013-04-17 16:43:27908 if (file_thread_)
[email protected]c6a7b862010-08-20 22:19:38909 file_thread_->Stop();
910
simonhonga7e3ac42014-11-11 20:50:22911 if (compositor_message_filter_.get()) {
912 RemoveFilter(compositor_message_filter_.get());
penghuange1d86512016-07-08 18:15:00913 compositor_message_filter_ = nullptr;
[email protected]23d2b7e2012-08-14 00:34:09914 }
[email protected]1842fe22012-08-13 23:24:35915
boliubee541f42015-11-05 00:52:53916#if defined(OS_ANDROID)
917 if (sync_compositor_message_filter_) {
918 RemoveFilter(sync_compositor_message_filter_.get());
919 sync_compositor_message_filter_ = nullptr;
920 }
siva.gunturi5d4feb052015-11-15 16:15:31921 stream_texture_factory_ = nullptr;
boliubee541f42015-11-05 00:52:53922#endif
923
[email protected]b4ef7742014-03-19 06:12:56924 media_thread_.reset();
dalecurtis3ba0480e2014-09-09 20:21:30925
sadrulff12c002016-01-14 20:52:20926 blink_platform_impl_->SetCompositorThread(nullptr);
vollick1050cc62015-12-03 07:04:54927
dcastagna7f45dada2015-10-19 20:17:35928 compositor_thread_.reset();
929
dalecurtis3ba0480e2014-09-09 20:21:30930 // AudioMessageFilter may be accessed on |media_thread_|, so shutdown after.
931 RemoveFilter(audio_message_filter_.get());
penghuange1d86512016-07-08 18:15:00932 audio_message_filter_ = nullptr;
dalecurtis3ba0480e2014-09-09 20:21:30933
prashant.nfad657e2016-06-01 07:52:17934 categorized_worker_pool_->Shutdown();
reveman34b7a1522015-03-23 20:27:47935
jdduke691dd572014-12-02 20:47:52936 main_input_callback_.Cancel();
[email protected]b0255682013-06-07 21:24:08937 input_handler_manager_.reset();
[email protected]cadac622013-06-11 16:46:36938 if (input_event_filter_.get()) {
[email protected]b0255682013-06-07 21:24:08939 RemoveFilter(input_event_filter_.get());
penghuange1d86512016-07-08 18:15:00940 input_event_filter_ = nullptr;
[email protected]a9fb30aa2011-10-06 06:58:46941 }
942
[email protected]51f82b02014-05-27 00:02:57943 // RemoveEmbeddedWorkerRoute may be called while deleting
944 // EmbeddedWorkerDispatcher. So it must be deleted before deleting
945 // RenderThreadImpl.
946 embedded_worker_dispatcher_.reset();
947
[email protected]c5739b9e2013-11-07 06:30:22948 // Ramp down IDB before we ramp down WebKit (and V8), since IDB classes might
949 // hold pointers to V8 objects (e.g., via pending requests).
950 main_thread_indexed_db_dispatcher_.reset();
951
penghuange1d86512016-07-08 18:15:00952 main_thread_compositor_task_runner_ = nullptr;
skyostil457b0a12014-09-09 10:12:07953
dcastagna09bd6b32016-02-01 21:54:28954 gpu_factories_.clear();
dcastagna7f45dada2015-10-19 20:17:35955
vmiuraeeb91772015-04-15 01:00:51956 // Context providers must be released prior to destroying the GPU channel.
revemand180dfc32015-09-24 00:19:43957 shared_worker_context_provider_ = nullptr;
piman765e5282015-05-08 03:43:01958 shared_main_thread_contexts_ = nullptr;
vmiuraeeb91772015-04-15 01:00:51959
haraken53f081d2014-11-11 01:03:40960 if (gpu_channel_.get())
961 gpu_channel_->DestroyChannel();
[email protected]8fd8de92008-08-12 23:50:30962
reveman413413fb2016-01-14 00:43:07963 ChildThreadImpl::Shutdown();
964
fdoray2df4a9e2016-07-18 23:47:16965 // Shut down the message loop (if provided when the RenderThreadImpl was
966 // constructed) and the renderer scheduler before shutting down Blink. This
967 // prevents a scenario where a pending task in the message loop accesses Blink
968 // objects after Blink shuts down.
skyostila37c2a72016-06-29 17:30:07969 renderer_scheduler_->SetRAILModeObserver(nullptr);
rmcilroy168f3dc2015-03-17 13:09:15970 renderer_scheduler_->Shutdown();
haraken6e79a752016-09-05 01:33:50971 if (main_message_loop_)
972 base::RunLoop().RunUntilIdle();
973
haraken19a7c51a2016-09-05 04:19:50974 if (blink_platform_impl_) {
975 blink_platform_impl_->Shutdown();
976 // This must be at the very end of the shutdown sequence.
977 // blink::shutdown() must be called after all strong references from
978 // Chromium to Blink are cleared.
979 blink::shutdown();
980 }
981
982 // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown
983 // is complete, because blink::shutdown destructs Blink Resources and they
984 // may try to unlock their underlying discardable memory.
985 ChildThreadImpl::ShutdownDiscardableSharedMemoryManager();
986
987 // The message loop must be cleared after shutting down
988 // the DiscardableSharedMemoryManager, which needs to send messages
989 // to the browser process.
haraken6e79a752016-09-05 01:33:50990 main_message_loop_.reset();
991
penghuange1d86512016-07-08 18:15:00992 lazy_tls.Pointer()->Set(nullptr);
initial.commit09911bf2008-07-26 23:55:29993}
994
[email protected]f1a29a02011-10-06 23:08:44995bool RenderThreadImpl::Send(IPC::Message* msg) {
changwan6ed4d432016-05-19 22:03:54996 // There are cases where we want to pump asynchronous messages while waiting
997 // synchronously for the replies to the message to be sent here. However, this
998 // may create an opportunity for re-entrancy into WebKit and other subsystems,
999 // so we need to take care to disable callbacks, timers, and pending network
1000 // loads that could trigger such callbacks.
[email protected]38b592902011-04-16 02:08:421001 bool pumping_events = false;
[email protected]80fc08c52010-03-09 07:43:501002 if (msg->is_sync()) {
1003 if (msg->is_caller_pumping_messages()) {
1004 pumping_events = true;
[email protected]80fc08c52010-03-09 07:43:501005 }
[email protected]c1f50aa2010-02-18 03:46:571006 }
1007
[email protected]c1f50aa2010-02-18 03:46:571008 if (pumping_events) {
jdduked73ae5412015-05-11 20:07:161009 renderer_scheduler_->SuspendTimerQueue();
changwan6ed4d432016-05-19 22:03:541010 WebView::willEnterModalLoop();
[email protected]c1f50aa2010-02-18 03:46:571011 }
1012
jam8a021512a2015-02-03 18:16:081013 bool rv = ChildThreadImpl::Send(msg);
[email protected]c1f50aa2010-02-18 03:46:571014
1015 if (pumping_events) {
changwan6ed4d432016-05-19 22:03:541016 WebView::didExitModalLoop();
jdduked73ae5412015-05-11 20:07:161017 renderer_scheduler_->ResumeTimerQueue();
[email protected]c1f50aa2010-02-18 03:46:571018 }
1019
1020 return rv;
1021}
1022
[email protected]f1a29a02011-10-06 23:08:441023IPC::SyncChannel* RenderThreadImpl::GetChannel() {
[email protected]526476902011-10-06 20:34:061024 return channel();
1025}
1026
[email protected]f1a29a02011-10-06 23:08:441027std::string RenderThreadImpl::GetLocale() {
[email protected]526476902011-10-06 20:34:061028 // The browser process should have passed the locale to the renderer via the
[email protected]dfd53652012-10-25 00:20:021029 // --lang command line flag.
avi83883c82014-12-23 00:08:491030 const base::CommandLine& parsed_command_line =
1031 *base::CommandLine::ForCurrentProcess();
[email protected]526476902011-10-06 20:34:061032 const std::string& lang =
1033 parsed_command_line.GetSwitchValueASCII(switches::kLang);
[email protected]dfd53652012-10-25 00:20:021034 DCHECK(!lang.empty());
[email protected]526476902011-10-06 20:34:061035 return lang;
1036}
1037
[email protected]07bb6332012-01-21 01:07:571038IPC::SyncMessageFilter* RenderThreadImpl::GetSyncMessageFilter() {
1039 return sync_message_filter();
1040}
1041
skyostil12262cf2015-05-21 14:49:311042scoped_refptr<base::SingleThreadTaskRunner>
thestig529ad8a2016-07-08 20:30:121043RenderThreadImpl::GetIOTaskRunner() {
skyostil12262cf2015-05-21 14:49:311044 return ChildProcess::current()->io_task_runner();
[email protected]96191d52012-05-17 01:37:111045}
1046
avi1023d012015-12-25 02:39:141047void RenderThreadImpl::AddRoute(int32_t routing_id, IPC::Listener* listener) {
jam8a021512a2015-02-03 18:16:081048 ChildThreadImpl::GetRouter()->AddRoute(routing_id, listener);
ben76f52b242016-06-18 05:42:481049 auto it = pending_frame_creates_.find(routing_id);
1050 if (it == pending_frame_creates_.end())
rockotf8fdd9b2015-12-16 22:22:351051 return;
1052
1053 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(routing_id);
1054 if (!frame)
1055 return;
1056
ben76f52b242016-06-18 05:42:481057 scoped_refptr<PendingFrameCreate> create(it->second);
1058 frame->Bind(it->second->TakeFrameRequest(), it->second->TakeFrameHost());
1059 pending_frame_creates_.erase(it);
[email protected]c1f50aa2010-02-18 03:46:571060}
1061
avi1023d012015-12-25 02:39:141062void RenderThreadImpl::RemoveRoute(int32_t routing_id) {
jam8a021512a2015-02-03 18:16:081063 ChildThreadImpl::GetRouter()->RemoveRoute(routing_id);
[email protected]c1f50aa2010-02-18 03:46:571064}
[email protected]0ec90d522014-03-12 16:28:191065
avi1023d012015-12-25 02:39:141066void RenderThreadImpl::AddEmbeddedWorkerRoute(int32_t routing_id,
[email protected]a620b132014-04-30 22:39:171067 IPC::Listener* listener) {
[email protected]48e52e42014-03-20 06:58:071068 AddRoute(routing_id, listener);
1069 if (devtools_agent_message_filter_.get()) {
[email protected]a620b132014-04-30 22:39:171070 devtools_agent_message_filter_->AddEmbeddedWorkerRouteOnMainThread(
[email protected]48e52e42014-03-20 06:58:071071 routing_id);
1072 }
1073}
1074
avi1023d012015-12-25 02:39:141075void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32_t routing_id) {
[email protected]48e52e42014-03-20 06:58:071076 RemoveRoute(routing_id);
1077 if (devtools_agent_message_filter_.get()) {
[email protected]a620b132014-04-30 22:39:171078 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread(
[email protected]48e52e42014-03-20 06:58:071079 routing_id);
1080 }
1081}
1082
ben76f52b242016-06-18 05:42:481083void RenderThreadImpl::RegisterPendingFrameCreate(
rockotf8fdd9b2015-12-16 22:22:351084 int routing_id,
ben76f52b242016-06-18 05:42:481085 mojom::FrameRequest frame_request,
1086 mojom::FrameHostPtr frame_host) {
1087 std::pair<PendingFrameCreateMap::iterator, bool> result =
1088 pending_frame_creates_.insert(std::make_pair(
rockotf8fdd9b2015-12-16 22:22:351089 routing_id,
ben76f52b242016-06-18 05:42:481090 make_scoped_refptr(new PendingFrameCreate(
1091 routing_id, std::move(frame_request), std::move(frame_host)))));
rockotf8fdd9b2015-12-16 22:22:351092 CHECK(result.second) << "Inserting a duplicate item.";
1093}
1094
leon.han06e55662016-03-26 17:19:421095mojom::StoragePartitionService* RenderThreadImpl::GetStoragePartitionService() {
jamc912ca32016-02-24 20:17:311096 return storage_partition_service_.get();
1097}
1098
[email protected]77fc9b92011-10-15 16:20:371099int RenderThreadImpl::GenerateRoutingID() {
1100 int routing_id = MSG_ROUTING_NONE;
1101 Send(new ViewHostMsg_GenerateRoutingID(&routing_id));
1102 return routing_id;
1103}
1104
[email protected]74122042014-04-25 00:07:301105void RenderThreadImpl::AddFilter(IPC::MessageFilter* filter) {
[email protected]42f1d7822009-07-23 18:17:551106 channel()->AddFilter(filter);
1107}
1108
[email protected]74122042014-04-25 00:07:301109void RenderThreadImpl::RemoveFilter(IPC::MessageFilter* filter) {
[email protected]42f1d7822009-07-23 18:17:551110 channel()->RemoveFilter(filter);
1111}
1112
tyoshino832a58a2016-04-18 08:14:081113void RenderThreadImpl::AddObserver(RenderThreadObserver* observer) {
[email protected]526476902011-10-06 20:34:061114 observers_.AddObserver(observer);
1115}
1116
tyoshino832a58a2016-04-18 08:14:081117void RenderThreadImpl::RemoveObserver(RenderThreadObserver* observer) {
[email protected]526476902011-10-06 20:34:061118 observers_.RemoveObserver(observer);
1119}
1120
[email protected]359dfa32011-10-12 01:10:151121void RenderThreadImpl::SetResourceDispatcherDelegate(
[email protected]e9ff79c2012-10-19 21:31:261122 ResourceDispatcherDelegate* delegate) {
[email protected]359dfa32011-10-12 01:10:151123 resource_dispatcher()->set_delegate(delegate);
1124}
1125
vollick1050cc62015-12-03 07:04:541126void RenderThreadImpl::InitializeCompositorThread() {
boliu66024c62016-04-20 04:00:411127 base::Thread::Options options;
vollick1050cc62015-12-03 07:04:541128#if defined(OS_ANDROID)
boliu66024c62016-04-20 04:00:411129 options.priority = base::ThreadPriority::DISPLAY;
vollick1050cc62015-12-03 07:04:541130#endif
boliu66024c62016-04-20 04:00:411131 compositor_thread_.reset(new WebThreadForCompositor(options));
1132 blink_platform_impl_->SetCompositorThread(compositor_thread_.get());
1133 compositor_task_runner_ = compositor_thread_->GetTaskRunner();
1134 compositor_task_runner_->PostTask(
1135 FROM_HERE,
1136 base::Bind(base::IgnoreResult(&ThreadRestrictions::SetIOAllowed), false));
vollick1050cc62015-12-03 07:04:541137
boliude5b75b2016-03-11 07:02:141138 SynchronousInputHandlerProxyClient* synchronous_input_handler_proxy_client =
1139 nullptr;
vollick1050cc62015-12-03 07:04:541140#if defined(OS_ANDROID)
boliu66024c62016-04-20 04:00:411141 if (GetContentClient()->UsingSynchronousCompositing()) {
vollick1050cc62015-12-03 07:04:541142 sync_compositor_message_filter_ =
1143 new SynchronousCompositorFilter(compositor_task_runner_);
1144 AddFilter(sync_compositor_message_filter_.get());
boliude5b75b2016-03-11 07:02:141145 synchronous_input_handler_proxy_client =
1146 sync_compositor_message_filter_.get();
vollick1050cc62015-12-03 07:04:541147 }
1148#endif
boliub2768db2016-06-03 23:35:161149 scoped_refptr<InputEventFilter> compositor_input_event_filter(
1150 new InputEventFilter(main_input_callback_.callback(),
1151 main_thread_compositor_task_runner_,
1152 compositor_task_runner_));
1153 InputHandlerManagerClient* input_handler_manager_client =
1154 compositor_input_event_filter.get();
1155 input_event_filter_ = compositor_input_event_filter;
vollick1050cc62015-12-03 07:04:541156 input_handler_manager_.reset(new InputHandlerManager(
1157 compositor_task_runner_, input_handler_manager_client,
boliude5b75b2016-03-11 07:02:141158 synchronous_input_handler_proxy_client, renderer_scheduler_.get()));
vollick1050cc62015-12-03 07:04:541159}
1160
jam75c44222016-03-23 05:34:241161void RenderThreadImpl::InitializeWebKit(
1162 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) {
1163 DCHECK(!blink_platform_impl_);
[email protected]d1b8fccc2011-08-03 01:20:131164
avi83883c82014-12-23 00:08:491165 const base::CommandLine& command_line =
1166 *base::CommandLine::ForCurrentProcess();
chunyang.daibe874c52014-11-14 06:45:051167
1168#ifdef ENABLE_VTUNE_JIT_INTERFACE
1169 if (command_line.HasSwitch(switches::kEnableVtune))
1170 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler());
1171#endif
1172
rmcilroy4073ae12015-01-08 13:08:101173 SetRuntimeFeaturesDefaultsAndUpdateFromArgs(command_line);
1174
sammcbebeb602016-04-06 06:42:551175 blink_platform_impl_.reset(new RendererBlinkPlatformImpl(
1176 renderer_scheduler_.get(),
bend1dd50f52016-06-26 22:10:481177 GetRemoteInterfaces()->GetWeakPtr()));
tfarina556a7232014-10-05 01:02:091178 blink::initialize(blink_platform_impl_.get());
[email protected]d1b8fccc2011-08-03 01:20:131179
[email protected]4b5340282014-07-08 11:37:341180 v8::Isolate* isolate = blink::mainThreadIsolate();
[email protected]4b5340282014-07-08 11:37:341181 isolate->SetCreateHistogramFunction(CreateHistogram);
1182 isolate->SetAddHistogramSampleFunction(AddHistogramSample);
skyostila37c2a72016-06-29 17:30:071183 renderer_scheduler_->SetRAILModeObserver(this);
[email protected]4b5340282014-07-08 11:37:341184
rmcilroy321f924d2014-11-06 00:56:001185 main_thread_compositor_task_runner_ =
danakj6e3bf8012014-12-16 18:27:531186 renderer_scheduler_->CompositorTaskRunner();
skyostilc30aa402014-10-10 13:49:091187
jdduke691dd572014-12-02 20:47:521188 main_input_callback_.Reset(
1189 base::Bind(base::IgnoreResult(&RenderThreadImpl::OnMessageReceived),
1190 base::Unretained(this)));
1191
jam75c44222016-03-23 05:34:241192 scoped_refptr<base::SingleThreadTaskRunner> resource_task_queue2;
1193 if (resource_task_queue) {
1194 resource_task_queue2 = resource_task_queue;
1195 } else {
1196 resource_task_queue2 = renderer_scheduler_->LoadingTaskRunner();
1197 }
1198 // Add a filter that forces resource messages to be dispatched via a
1199 // particular task runner.
1200 scoped_refptr<ResourceSchedulingFilter> filter(
1201 new ResourceSchedulingFilter(
1202 resource_task_queue2, resource_dispatcher()));
1203 channel()->AddFilter(filter.get());
1204 resource_dispatcher()->SetResourceSchedulingFilter(filter);
1205
1206 // The ChildResourceMessageFilter and the ResourceDispatcher need to use the
1207 // same queue to ensure tasks are executed in the expected order.
1208 child_resource_message_filter()->SetMainThreadTaskRunner(
1209 resource_task_queue2);
1210 resource_dispatcher()->SetMainThreadTaskRunner(resource_task_queue2);
1211
khushalsagara5b15d72016-01-07 06:15:401212 if (!command_line.HasSwitch(switches::kDisableThreadedCompositing) &&
1213 !command_line.HasSwitch(switches::kUseRemoteCompositing))
vollick1050cc62015-12-03 07:04:541214 InitializeCompositorThread();
[email protected]a9fb30aa2011-10-06 06:58:461215
jdduke691dd572014-12-02 20:47:521216 if (!input_event_filter_.get()) {
1217 // Always provide an input event filter implementation to ensure consistent
1218 // input event scheduling and prioritization.
1219 // TODO(jdduke): Merge InputEventFilter, InputHandlerManager and
1220 // MainThreadInputEventFilter, crbug.com/436057.
1221 input_event_filter_ = new MainThreadInputEventFilter(
1222 main_input_callback_.callback(), main_thread_compositor_task_runner_);
1223 }
1224 AddFilter(input_event_filter_.get());
1225
skyostil2d3b5bd2015-05-27 15:40:591226 scoped_refptr<base::SingleThreadTaskRunner> compositor_impl_side_task_runner;
vollick1050cc62015-12-03 07:04:541227 if (compositor_task_runner_)
skyostil2d3b5bd2015-05-27 15:40:591228 compositor_impl_side_task_runner = compositor_task_runner_;
[email protected]7f1f63f2013-03-07 06:07:291229 else
skyostil2d3b5bd2015-05-27 15:40:591230 compositor_impl_side_task_runner = base::ThreadTaskRunnerHandle::Get();
[email protected]1842fe22012-08-13 23:24:351231
simonhonga7e3ac42014-11-11 20:50:221232 compositor_message_filter_ = new CompositorForwardingMessageFilter(
skyostil2d3b5bd2015-05-27 15:40:591233 compositor_impl_side_task_runner.get());
simonhonga7e3ac42014-11-11 20:50:221234 AddFilter(compositor_message_filter_.get());
[email protected]1842fe22012-08-13 23:24:351235
[email protected]58436a12012-03-21 17:10:261236 RenderThreadImpl::RegisterSchemes();
1237
xhwang194acae2014-11-12 22:46:331238 RenderMediaClient::Initialize();
1239
[email protected]b146d6d2012-09-11 10:20:051240 devtools_agent_message_filter_ = new DevToolsAgentFilter();
1241 AddFilter(devtools_agent_message_filter_.get());
1242
alph666f80f2014-12-08 15:52:111243 v8_sampling_profiler_.reset(new V8SamplingProfiler());
1244
ulan4a385192015-11-11 10:59:181245 if (GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) {
[email protected]1784b2f2011-11-24 10:53:481246 ScheduleIdleHandler(kLongIdleHandlerDelayMs);
ulan4a385192015-11-11 10:59:181247 } else {
1248 // If we do not track widget visibility, then assume conservatively that
1249 // the isolate is in background. This reduces memory usage.
1250 isolate->IsolateInBackgroundNotification();
1251 }
[email protected]2541d1a2013-07-10 07:33:271252
jdduke73220f02015-09-04 17:03:511253 renderer_scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled(
1254 GetContentClient()
1255 ->renderer()
1256 ->AllowTimerSuspensionWhenProcessBackgrounded());
1257
reedccf98c52014-10-03 16:40:381258 SkGraphics::SetResourceCacheSingleAllocationByteLimit(
[email protected]dd2c1022014-07-22 23:13:571259 kImageCacheSingleAllocationByteLimit);
1260
reed6e5a72222015-08-06 20:37:161261 // Hook up blink's codecs so skia can call them
1262 SkGraphics::SetImageGeneratorFromEncodedFactory(
1263 blink::WebImageGenerator::create);
1264
[email protected]fdeac262014-07-10 12:52:511265 if (command_line.HasSwitch(switches::kMemoryMetrics)) {
1266 memory_observer_.reset(new MemoryObserver());
1267 message_loop()->AddTaskObserver(memory_observer_.get());
1268 }
paritosh.in7e30c902015-04-15 17:04:071269
1270 if (command_line.HasSwitch(switches::kExplicitlyAllowedPorts)) {
1271 std::string allowed_ports =
1272 command_line.GetSwitchValueASCII(switches::kExplicitlyAllowedPorts);
1273 net::SetExplicitlyAllowedPorts(allowed_ports);
1274 }
[email protected]d1b8fccc2011-08-03 01:20:131275}
1276
[email protected]58436a12012-03-21 17:10:261277void RenderThreadImpl::RegisterSchemes() {
mkwst8e94fb32015-05-20 05:05:141278 // chrome:
1279 WebString chrome_scheme(base::ASCIIToUTF16(kChromeUIScheme));
1280 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(chrome_scheme);
1281 WebSecurityPolicy::registerURLSchemeAsNotAllowingJavascriptURLs(
1282 chrome_scheme);
1283 WebSecurityPolicy::registerURLSchemeAsSecure(chrome_scheme);
1284 WebSecurityPolicy::registerURLSchemeAsCORSEnabled(chrome_scheme);
1285
1286 // chrome-devtools:
1287 WebString devtools_scheme(base::ASCIIToUTF16(kChromeDevToolsScheme));
1288 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(devtools_scheme);
meacerce6b66032016-06-02 20:56:051289
1290 // view-source:
1291 WebString view_source_scheme(base::ASCIIToUTF16(kViewSourceScheme));
1292 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(view_source_scheme);
[email protected]58436a12012-03-21 17:10:261293}
1294
[email protected]df9accd2014-03-13 18:18:301295void RenderThreadImpl::NotifyTimezoneChange() {
1296 NotifyTimezoneChangeOnThisThread();
1297 RenderThread::Get()->PostTaskToAllWebWorkers(
1298 base::Bind(&NotifyTimezoneChangeOnThisThread));
1299}
1300
[email protected]e6e30ac2014-01-13 21:24:391301void RenderThreadImpl::RecordAction(const base::UserMetricsAction& action) {
[email protected]97880c82013-12-04 07:09:211302 Send(new ViewHostMsg_UserMetricsRecordAction(action.str_));
1303}
1304
1305void RenderThreadImpl::RecordComputedAction(const std::string& action) {
[email protected]526476902011-10-06 20:34:061306 Send(new ViewHostMsg_UserMetricsRecordAction(action));
1307}
1308
dchengcedca5612016-04-09 01:40:151309std::unique_ptr<base::SharedMemory>
1310RenderThreadImpl::HostAllocateSharedMemoryBuffer(size_t size) {
erikchen4e01cbe2016-05-25 22:00:051311 return ChildThreadImpl::AllocateSharedMemory(size, thread_safe_sender(),
1312 nullptr);
[email protected]00614a82011-10-07 22:39:311313}
1314
jbauman2f5c1942014-12-06 03:28:241315cc::SharedBitmapManager* RenderThreadImpl::GetSharedBitmapManager() {
1316 return shared_bitmap_manager();
1317}
1318
[email protected]f1a29a02011-10-06 23:08:441319void RenderThreadImpl::RegisterExtension(v8::Extension* extension) {
[email protected]526476902011-10-06 20:34:061320 WebScriptController::registerExtension(extension);
[email protected]526476902011-10-06 20:34:061321}
1322
avi1023d012015-12-25 02:39:141323void RenderThreadImpl::ScheduleIdleHandler(int64_t initial_delay_ms) {
[email protected]6593ae12011-11-14 12:09:441324 idle_notification_delay_in_ms_ = initial_delay_ms;
[email protected]526476902011-10-06 20:34:061325 idle_timer_.Stop();
1326 idle_timer_.Start(FROM_HERE,
[email protected]6593ae12011-11-14 12:09:441327 base::TimeDelta::FromMilliseconds(initial_delay_ms),
[email protected]f1a29a02011-10-06 23:08:441328 this, &RenderThreadImpl::IdleHandler);
[email protected]526476902011-10-06 20:34:061329}
1330
[email protected]f1a29a02011-10-06 23:08:441331void RenderThreadImpl::IdleHandler() {
[email protected]1784b2f2011-11-24 10:53:481332 bool run_in_foreground_tab = (widget_count_ > hidden_widget_count_) &&
[email protected]e9ff79c2012-10-19 21:31:261333 GetContentClient()->renderer()->
[email protected]1784b2f2011-11-24 10:53:481334 RunIdleHandlerWhenWidgetsHidden();
1335 if (run_in_foreground_tab) {
jochen5a32aaf2014-09-26 20:37:431336 if (idle_notifications_to_skip_ > 0) {
1337 --idle_notifications_to_skip_;
1338 } else {
ssid0603ca9f2015-06-09 16:48:081339 ReleaseFreeMemory();
jochen5a32aaf2014-09-26 20:37:431340 }
1341 ScheduleIdleHandler(kLongIdleHandlerDelayMs);
[email protected]1784b2f2011-11-24 10:53:481342 return;
1343 }
[email protected]237a14852012-04-28 02:56:381344
ssid0603ca9f2015-06-09 16:48:081345 ReleaseFreeMemory();
[email protected]526476902011-10-06 20:34:061346
[email protected]26e82322014-01-20 14:18:221347 // Continue the idle timer if the webkit shared timer is not suspended or
1348 // something is left to do.
1349 bool continue_timer = !webkit_shared_timer_suspended_;
1350
sullivancd45a3e2014-09-19 14:39:181351 // Schedule next invocation. When the tab is originally hidden, an invocation
1352 // is scheduled for kInitialIdleHandlerDelayMs in
1353 // RenderThreadImpl::WidgetHidden in order to race to a minimal heap.
1354 // After that, idle calls can be much less frequent, so run at a maximum of
1355 // once every kLongIdleHandlerDelayMs.
[email protected]6593ae12011-11-14 12:09:441356 // Dampen the delay using the algorithm (if delay is in seconds):
[email protected]526476902011-10-06 20:34:061357 // delay = delay + 1 / (delay + 2)
1358 // Using floor(delay) has a dampening effect such as:
sullivancd45a3e2014-09-19 14:39:181359 // 30s, 30, 30, 31, 31, 31, 31, 32, 32, ...
[email protected]6593ae12011-11-14 12:09:441360 // If the delay is in milliseconds, the above formula is equivalent to:
1361 // delay_ms / 1000 = delay_ms / 1000 + 1 / (delay_ms / 1000 + 2)
1362 // which is equivalent to
1363 // delay_ms = delay_ms + 1000*1000 / (delay_ms + 2000).
[email protected]26e82322014-01-20 14:18:221364 if (continue_timer) {
sullivancd45a3e2014-09-19 14:39:181365 ScheduleIdleHandler(
1366 std::max(kLongIdleHandlerDelayMs,
1367 idle_notification_delay_in_ms_ +
1368 1000000 / (idle_notification_delay_in_ms_ + 2000)));
[email protected]26e82322014-01-20 14:18:221369
1370 } else {
1371 idle_timer_.Stop();
1372 }
[email protected]526476902011-10-06 20:34:061373
tyoshino832a58a2016-04-18 08:14:081374 FOR_EACH_OBSERVER(RenderThreadObserver, observers_, IdleNotification());
[email protected]526476902011-10-06 20:34:061375}
1376
avi1023d012015-12-25 02:39:141377int64_t RenderThreadImpl::GetIdleNotificationDelayInMs() const {
[email protected]6593ae12011-11-14 12:09:441378 return idle_notification_delay_in_ms_;
[email protected]526476902011-10-06 20:34:061379}
1380
[email protected]6593ae12011-11-14 12:09:441381void RenderThreadImpl::SetIdleNotificationDelayInMs(
avi1023d012015-12-25 02:39:141382 int64_t idle_notification_delay_in_ms) {
[email protected]6593ae12011-11-14 12:09:441383 idle_notification_delay_in_ms_ = idle_notification_delay_in_ms;
[email protected]4a7d6392011-09-19 20:55:081384}
1385
[email protected]a1a7ff32012-07-19 14:03:511386void RenderThreadImpl::UpdateHistograms(int sequence_number) {
1387 child_histogram_message_filter()->SendHistograms(sequence_number);
1388}
1389
[email protected]5b18406362013-06-18 18:46:431390int RenderThreadImpl::PostTaskToAllWebWorkers(const base::Closure& closure) {
kinukoef647412015-12-23 06:10:431391 return WorkerThreadRegistry::Instance()->PostTaskToAllThreads(closure);
[email protected]a9bd323d2013-06-17 20:27:561392}
1393
[email protected]b02f5902012-12-19 07:33:001394bool RenderThreadImpl::ResolveProxy(const GURL& url, std::string* proxy_list) {
1395 bool result = false;
1396 Send(new ViewHostMsg_ResolveProxy(url, &result, proxy_list));
1397 return result;
1398}
1399
[email protected]1784b2f2011-11-24 10:53:481400void RenderThreadImpl::PostponeIdleNotification() {
1401 idle_notifications_to_skip_ = 2;
1402}
1403
dcastagna7f45dada2015-10-19 20:17:351404media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() {
[email protected]3bb8bb32013-07-11 13:13:031405 DCHECK(IsMainThread());
1406
dcastagna09bd6b32016-02-01 21:54:281407 if (!gpu_factories_.empty()) {
1408 scoped_refptr<ContextProviderCommandBuffer> shared_context_provider =
1409 gpu_factories_.back()->ContextProviderMainThread();
1410 if (shared_context_provider) {
1411 cc::ContextProvider::ScopedContextLock lock(
1412 shared_context_provider.get());
1413 if (lock.ContextGL()->GetGraphicsResetStatusKHR() == GL_NO_ERROR) {
1414 return gpu_factories_.back();
1415 } else {
1416 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner =
1417 GetMediaThreadTaskRunner();
1418 media_task_runner->PostTask(
1419 FROM_HERE,
1420 base::Bind(
1421 base::IgnoreResult(
1422 &RendererGpuVideoAcceleratorFactories::CheckContextLost),
1423 base::Unretained(gpu_factories_.back())));
1424 }
1425 }
1426 }
dcastagna7f45dada2015-10-19 20:17:351427
tobiasjsca238b3b2015-06-24 22:53:541428 const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
1429
danakj0b4b94e32016-05-10 22:33:011430 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host =
sadrul6d310fa2016-08-04 02:12:161431 EstablishGpuChannelSync();
danakj0b4b94e32016-05-10 22:33:011432 if (!gpu_channel_host)
1433 return nullptr;
danakj0dd9e1e2016-05-11 22:15:091434 // This context is only used to create textures and mailbox them, so
1435 // use lower limits than the default.
1436 gpu::SharedMemoryLimits limits = gpu::SharedMemoryLimits::ForMailboxContext();
danakj9a04adc2016-05-16 22:45:071437 bool support_locking = true;
danakj0b4b94e32016-05-10 22:33:011438 scoped_refptr<ContextProviderCommandBuffer> media_context_provider =
danakj9a04adc2016-05-16 22:45:071439 CreateOffscreenContext(gpu_channel_host, limits, support_locking,
danakj0dd9e1e2016-05-11 22:15:091440 command_buffer_metrics::RENDER_WORKER_CONTEXT,
1441 gpu::GPU_STREAM_DEFAULT,
1442 gpu::GpuStreamPriority::NORMAL);
danakj0b4b94e32016-05-10 22:33:011443 if (!media_context_provider->BindToCurrentThread())
1444 return nullptr;
danakj0b4b94e32016-05-10 22:33:011445
acolwellb4034942014-08-28 15:42:431446 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner =
1447 GetMediaThreadTaskRunner();
danakj0b4b94e32016-05-10 22:33:011448 const bool enable_video_accelerator =
1449 !cmd_line->HasSwitch(switches::kDisableAcceleratedVideoDecode);
1450 const bool enable_gpu_memory_buffer_video_frames =
dcastagna43c3a86a2016-02-02 21:16:381451#if defined(OS_MACOSX) || defined(OS_LINUX)
dcastagnaa82ed96a2016-05-12 02:52:471452 !cmd_line->HasSwitch(switches::kDisableGpuMemoryBufferVideoFrames) &&
1453 !cmd_line->HasSwitch(switches::kDisableGpuCompositing) &&
1454 !gpu_channel_host->gpu_info().software_rendering;
dcastagnab65e6072015-09-05 07:18:421455#else
danakj0b4b94e32016-05-10 22:33:011456 cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames);
dcastagnab65e6072015-09-05 07:18:421457#endif
dcastagna5077d6d2016-01-27 00:07:051458
danakj0b4b94e32016-05-10 22:33:011459 gpu_factories_.push_back(RendererGpuVideoAcceleratorFactories::Create(
1460 std::move(gpu_channel_host), base::ThreadTaskRunnerHandle::Get(),
1461 media_task_runner, std::move(media_context_provider),
ericrk9151705c2016-07-26 19:53:161462 enable_gpu_memory_buffer_video_frames, buffer_to_texture_target_map_,
danakj0b4b94e32016-05-10 22:33:011463 enable_video_accelerator));
1464 return gpu_factories_.back();
[email protected]3bb8bb32013-07-11 13:13:031465}
1466
danakj615aac22016-04-29 21:28:161467scoped_refptr<ContextProviderCommandBuffer>
[email protected]f10dc472013-09-27 03:31:591468RenderThreadImpl::SharedMainThreadContextProvider() {
[email protected]e06e1122013-03-15 17:12:381469 DCHECK(IsMainThread());
danakje8ec797e2016-04-19 04:08:431470 if (shared_main_thread_contexts_ &&
1471 shared_main_thread_contexts_->ContextGL()->GetGraphicsResetStatusKHR() ==
1472 GL_NO_ERROR)
1473 return shared_main_thread_contexts_;
1474
sadrul6d310fa2016-08-04 02:12:161475 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(
1476 EstablishGpuChannelSync());
danakje8ec797e2016-04-19 04:08:431477 if (!gpu_channel_host) {
1478 shared_main_thread_contexts_ = nullptr;
1479 return nullptr;
[email protected]c29b7ff2013-03-06 03:51:041480 }
danakje8ec797e2016-04-19 04:08:431481
danakj9a04adc2016-05-16 22:45:071482 bool support_locking = false;
danakjc3983552016-05-03 00:04:351483 shared_main_thread_contexts_ = CreateOffscreenContext(
danakj9a04adc2016-05-16 22:45:071484 std::move(gpu_channel_host), gpu::SharedMemoryLimits(), support_locking,
sunnypsd8ce1c22016-05-10 18:02:401485 command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT,
1486 gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL);
danakje8ec797e2016-04-19 04:08:431487 if (!shared_main_thread_contexts_->BindToCurrentThread())
1488 shared_main_thread_contexts_ = nullptr;
[email protected]f10dc472013-09-27 03:31:591489 return shared_main_thread_contexts_;
[email protected]c29b7ff2013-03-06 03:51:041490}
1491
siva.gunturi5d4feb052015-11-15 16:15:311492#if defined(OS_ANDROID)
boliuf8753bf62016-02-11 20:09:421493
siva.gunturi5d4feb052015-11-15 16:15:311494scoped_refptr<StreamTextureFactory> RenderThreadImpl::GetStreamTexureFactory() {
1495 DCHECK(IsMainThread());
boliu30f1b262016-04-19 00:12:331496 if (!stream_texture_factory_.get() ||
1497 stream_texture_factory_->ContextGL()->GetGraphicsResetStatusKHR() !=
1498 GL_NO_ERROR) {
piman9fc22f32016-05-02 22:21:221499 scoped_refptr<ContextProviderCommandBuffer> shared_context_provider =
1500 SharedMainThreadContextProvider();
1501 if (!shared_context_provider) {
penghuange1d86512016-07-08 18:15:001502 stream_texture_factory_ = nullptr;
1503 return nullptr;
siva.gunturi5d4feb052015-11-15 16:15:311504 }
piman9fc22f32016-05-02 22:21:221505 DCHECK(shared_context_provider->GetCommandBufferProxy());
1506 DCHECK(shared_context_provider->GetCommandBufferProxy()->channel());
1507 stream_texture_factory_ =
1508 StreamTextureFactory::Create(std::move(shared_context_provider));
siva.gunturi5d4feb052015-11-15 16:15:311509 }
1510 return stream_texture_factory_;
1511}
boliuf8753bf62016-02-11 20:09:421512
1513bool RenderThreadImpl::EnableStreamTextureCopy() {
boliu30f1b262016-04-19 00:12:331514 return sync_compositor_message_filter_.get();
boliuf8753bf62016-02-11 20:09:421515}
1516
siva.gunturi5d4feb052015-11-15 16:15:311517#endif
1518
[email protected]e9ff79c2012-10-19 21:31:261519AudioRendererMixerManager* RenderThreadImpl::GetAudioRendererMixerManager() {
[email protected]59383c782013-04-17 16:43:271520 if (!audio_renderer_mixer_manager_) {
olka7a4679392016-05-27 15:32:581521 audio_renderer_mixer_manager_ = AudioRendererMixerManager::Create();
[email protected]3958e972012-07-17 00:25:411522 }
1523
1524 return audio_renderer_mixer_manager_.get();
1525}
1526
[email protected]73429ca2014-03-06 06:07:471527base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() {
1528 return ChildProcess::current()->GetShutDownEvent();
1529}
1530
danakj6e3bf8012014-12-16 18:27:531531bool RenderThreadImpl::IsGpuRasterizationForced() {
1532 return is_gpu_rasterization_forced_;
1533}
1534
1535bool RenderThreadImpl::IsGpuRasterizationEnabled() {
1536 return is_gpu_rasterization_enabled_;
1537}
1538
sunnypsd8ce1c22016-05-10 18:02:401539bool RenderThreadImpl::IsAsyncWorkerContextEnabled() {
1540 return is_async_worker_context_enabled_;
1541}
1542
senorblancob60ba952015-01-27 19:12:361543int RenderThreadImpl::GetGpuRasterizationMSAASampleCount() {
1544 return gpu_rasterization_msaa_sample_count_;
1545}
1546
danakj6e3bf8012014-12-16 18:27:531547bool RenderThreadImpl::IsLcdTextEnabled() {
1548 return is_lcd_text_enabled_;
1549}
1550
1551bool RenderThreadImpl::IsDistanceFieldTextEnabled() {
1552 return is_distance_field_text_enabled_;
1553}
1554
1555bool RenderThreadImpl::IsZeroCopyEnabled() {
1556 return is_zero_copy_enabled_;
1557}
1558
ericrk1d17f752015-10-20 03:03:071559bool RenderThreadImpl::IsPartialRasterEnabled() {
1560 return is_partial_raster_enabled_;
jbroman5f7f71932015-08-18 16:24:461561}
1562
ccameronc7fcd132015-11-03 20:14:311563bool RenderThreadImpl::IsGpuMemoryBufferCompositorResourcesEnabled() {
1564 return is_gpu_memory_buffer_compositor_resources_enabled_;
1565}
1566
ccamerona7644752014-12-30 01:16:311567bool RenderThreadImpl::IsElasticOverscrollEnabled() {
1568 return is_elastic_overscroll_enabled_;
1569}
1570
ericrk9151705c2016-07-26 19:53:161571const cc::BufferToTextureTargetMap&
1572RenderThreadImpl::GetBufferToTextureTargetMap() {
1573 return buffer_to_texture_target_map_;
danakj6e3bf8012014-12-16 18:27:531574}
vmiura9084b342015-02-03 22:19:571575
danakj6e3bf8012014-12-16 18:27:531576scoped_refptr<base::SingleThreadTaskRunner>
1577RenderThreadImpl::GetCompositorMainThreadTaskRunner() {
1578 return main_thread_compositor_task_runner_;
1579}
1580
1581scoped_refptr<base::SingleThreadTaskRunner>
1582RenderThreadImpl::GetCompositorImplThreadTaskRunner() {
skyostil2d3b5bd2015-05-27 15:40:591583 return compositor_task_runner_;
danakj6e3bf8012014-12-16 18:27:531584}
1585
1586gpu::GpuMemoryBufferManager* RenderThreadImpl::GetGpuMemoryBufferManager() {
sadrula78e33d2016-08-16 20:11:211587#if defined(USE_AURA)
1588 if (gpu_service_)
1589 return gpu_service_->gpu_memory_buffer_manager();
1590#endif
1591 return gpu_memory_buffer_manager();
danakj6e3bf8012014-12-16 18:27:531592}
1593
skyostil529caa292016-08-10 17:44:511594blink::scheduler::RendererScheduler* RenderThreadImpl::GetRendererScheduler() {
danakj6e3bf8012014-12-16 18:27:531595 return renderer_scheduler_.get();
1596}
1597
dchengcedca5612016-04-09 01:40:151598std::unique_ptr<cc::BeginFrameSource>
danakj6e3bf8012014-12-16 18:27:531599RenderThreadImpl::CreateExternalBeginFrameSource(int routing_id) {
ennee292bdc2016-09-15 19:57:151600 const base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
1601 if (cmd->HasSwitch(switches::kDisableGpuVsync)) {
1602 std::string display_vsync_string =
1603 cmd->GetSwitchValueASCII(switches::kDisableGpuVsync);
1604 if (display_vsync_string != "gpu") {
1605 // In disable gpu vsync mode, also let the renderer tick as fast as it
1606 // can. The top level begin frame source will also be running as a back
1607 // to back begin frame source, but using a synthetic begin frame source
1608 // here reduces latency when in this mode (at least for frames
1609 // starting--it potentially increases it for input on the other hand.)
1610 base::SingleThreadTaskRunner* compositor_impl_side_task_runner =
1611 compositor_task_runner_ ? compositor_task_runner_.get()
1612 : base::ThreadTaskRunnerHandle::Get().get();
1613 return base::MakeUnique<cc::BackToBackBeginFrameSource>(
1614 base::MakeUnique<cc::DelayBasedTimeSource>(
1615 compositor_impl_side_task_runner));
1616 }
1617 }
1618
ricea29649b92016-08-31 09:30:211619 return base::MakeUnique<CompositorExternalBeginFrameSource>(
1620 compositor_message_filter_.get(), sync_message_filter(), routing_id);
danakj6e3bf8012014-12-16 18:27:531621}
1622
nyquist16febb42016-02-12 00:15:041623cc::ImageSerializationProcessor*
1624RenderThreadImpl::GetImageSerializationProcessor() {
1625 return GetContentClient()->renderer()->GetImageSerializationProcessor();
1626}
1627
reveman34b7a1522015-03-23 20:27:471628cc::TaskGraphRunner* RenderThreadImpl::GetTaskGraphRunner() {
prashant.nfad657e2016-06-01 07:52:171629 return categorized_worker_pool_->GetTaskGraphRunner();
reveman34b7a1522015-03-23 20:27:471630}
1631
vmpstrdfd22862015-09-25 17:42:411632bool RenderThreadImpl::AreImageDecodeTasksEnabled() {
1633 return are_image_decode_tasks_enabled_;
reveman34b7a1522015-03-23 20:27:471634}
1635
loyso65c93c602015-08-11 05:15:571636bool RenderThreadImpl::IsThreadedAnimationEnabled() {
1637 return is_threaded_animation_enabled_;
1638}
1639
skyostila37c2a72016-06-29 17:30:071640void RenderThreadImpl::OnRAILModeChanged(v8::RAILMode rail_mode) {
1641 blink::mainThreadIsolate()->SetRAILMode(rail_mode);
1642 blink::setRAILModeOnWorkerThreadIsolates(rail_mode);
1643}
1644
[email protected]b3e83de2012-02-07 03:33:281645bool RenderThreadImpl::IsMainThread() {
1646 return !!current();
1647}
1648
skyostild4452912015-05-14 14:41:531649scoped_refptr<base::SingleThreadTaskRunner>
1650RenderThreadImpl::GetIOThreadTaskRunner() {
1651 return io_thread_task_runner_;
[email protected]b3e83de2012-02-07 03:33:281652}
1653
dchengcedca5612016-04-09 01:40:151654std::unique_ptr<base::SharedMemory> RenderThreadImpl::AllocateSharedMemory(
[email protected]3f892832013-01-11 03:23:591655 size_t size) {
piman08f75532015-10-05 18:58:011656 return HostAllocateSharedMemoryBuffer(size);
[email protected]b3e83de2012-02-07 03:33:281657}
1658
torne88b66452016-05-03 13:22:141659void RenderThreadImpl::OnChannelError() {
1660 // In single-process mode, the renderer can't be restarted after shutdown.
1661 // So, if we get a channel error, crash the whole process right now to get a
1662 // more informative stack, since we will otherwise just crash later when we
1663 // try to restart it.
1664 CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
1665 switches::kSingleProcess));
1666 ChildThreadImpl::OnChannelError();
1667}
1668
[email protected]f1a29a02011-10-06 23:08:441669bool RenderThreadImpl::OnControlMessageReceived(const IPC::Message& msg) {
tyoshino832a58a2016-04-18 08:14:081670 base::ObserverListBase<RenderThreadObserver>::Iterator it(&observers_);
1671 RenderThreadObserver* observer;
penghuange1d86512016-07-08 18:15:001672 while ((observer = it.GetNext()) != nullptr) {
[email protected]1223d6ef2011-03-28 16:47:501673 if (observer->OnControlMessageReceived(msg))
1674 return true;
1675 }
1676
[email protected]70c19a932010-05-14 12:59:111677 // Some messages are handled by delegates.
[email protected]1910fe82012-05-10 00:04:101678 if (appcache_dispatcher_->OnMessageReceived(msg) ||
[email protected]7670d4332013-11-29 04:35:001679 dom_storage_dispatcher_->OnMessageReceived(msg) ||
1680 embedded_worker_dispatcher_->OnMessageReceived(msg)) {
[email protected]a95986a82010-12-24 06:19:281681 return true;
[email protected]1910fe82012-05-10 00:04:101682 }
[email protected]1edc16b82009-04-07 17:45:541683
[email protected]a95986a82010-12-24 06:19:281684 bool handled = true;
[email protected]f1a29a02011-10-06 23:08:441685 IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg)
[email protected]82307f6b2014-08-07 03:30:121686 IPC_MESSAGE_HANDLER(FrameMsg_NewFrame, OnCreateNewFrame)
1687 IPC_MESSAGE_HANDLER(FrameMsg_NewFrameProxy, OnCreateNewFrameProxy)
[email protected]8930d472009-02-21 08:05:281688 // TODO(port): removed from render_messages_internal.h;
1689 // is there a new non-windows message I should add here?
1690 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView)
jkarlin300a1d22015-09-18 19:32:521691 IPC_MESSAGE_HANDLER(ViewMsg_NetworkConnectionChanged,
1692 OnNetworkConnectionChanged)
[email protected]0ec90d522014-03-12 16:28:191693 IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateNewSharedWorker)
[email protected]b0988b22013-11-08 08:25:581694#if defined(OS_ANDROID)
[email protected]44363382013-03-12 07:22:471695 IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended,
1696 OnSetWebKitSharedTimersSuspended)
[email protected]b0988b22013-11-08 08:25:581697#endif
1698#if defined(OS_MACOSX)
1699 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme)
rsesek1efb3c32015-09-29 15:39:501700 IPC_MESSAGE_HANDLER(ViewMsg_SystemColorsChanged, OnSystemColorsChanged)
[email protected]b0988b22013-11-08 08:25:581701#endif
thestigc4cac8f2014-09-04 21:17:501702#if defined(ENABLE_PLUGINS)
1703 IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache)
1704#endif
[email protected]a95986a82010-12-24 06:19:281705 IPC_MESSAGE_UNHANDLED(handled = false)
[email protected]8930d472009-02-21 08:05:281706 IPC_END_MESSAGE_MAP()
[email protected]a95986a82010-12-24 06:19:281707 return handled;
initial.commit09911bf2008-07-26 23:55:291708}
1709
jdduke73220f02015-09-04 17:03:511710void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) {
1711 ChildThreadImpl::OnProcessBackgrounded(backgrounded);
1712
hajimehoshi69093272016-05-13 08:30:581713 if (backgrounded) {
jdduke73220f02015-09-04 17:03:511714 renderer_scheduler_->OnRendererBackgrounded();
hajimehoshi69093272016-05-13 08:30:581715 } else {
jdduke73220f02015-09-04 17:03:511716 renderer_scheduler_->OnRendererForegrounded();
hajimehoshi69093272016-05-13 08:30:581717 is_renderer_suspended_ = false;
1718 }
1719}
1720
1721void RenderThreadImpl::OnProcessPurgeAndSuspend() {
1722 ChildThreadImpl::OnProcessPurgeAndSuspend();
1723 if (is_renderer_suspended_)
1724 return;
1725 // TODO(hajimehoshi): Implement purging e.g. cache (crbug/607077)
1726 is_renderer_suspended_ = true;
1727 renderer_scheduler_->SuspendRenderer();
jdduke73220f02015-09-04 17:03:511728}
1729
alexmos9f8705a2015-05-06 19:58:591730void RenderThreadImpl::OnCreateNewFrame(FrameMsg_NewFrame_Params params) {
alexmos68734212016-08-27 00:06:311731 // Debug cases of https://crbug.com/626802.
1732 base::debug::SetCrashKeyValue("newframe_routing_id",
1733 base::IntToString(params.routing_id));
1734 base::debug::SetCrashKeyValue("newframe_proxy_id",
1735 base::IntToString(params.proxy_routing_id));
1736 base::debug::SetCrashKeyValue("newframe_opener_id",
1737 base::IntToString(params.opener_routing_id));
1738 base::debug::SetCrashKeyValue("newframe_parent_id",
1739 base::IntToString(params.parent_routing_id));
1740 base::debug::SetCrashKeyValue("newframe_widget_id",
1741 base::IntToString(
1742 params.widget_params.routing_id));
1743 base::debug::SetCrashKeyValue("newframe_widget_hidden",
1744 params.widget_params.hidden ? "yes" : "no");
1745 base::debug::SetCrashKeyValue("newframe_replicated_origin",
1746 params.replication_state.origin.Serialize());
1747 base::debug::SetCrashKeyValue("newframe_oopifs_possible",
1748 SiteIsolationPolicy::AreCrossProcessFramesPossible() ? "yes" : "no");
kenrba7199832015-01-22 23:44:591749 CompositorDependencies* compositor_deps = this;
alexmos9f8705a2015-05-06 19:58:591750 RenderFrameImpl::CreateFrame(
alexmosa181efc2015-09-03 00:39:041751 params.routing_id, params.proxy_routing_id, params.opener_routing_id,
1752 params.parent_routing_id, params.previous_sibling_routing_id,
lazyboy70605c32015-11-03 01:27:311753 params.replication_state, compositor_deps, params.widget_params,
raymes31457802016-07-20 06:08:091754 params.frame_owner_properties);
[email protected]82307f6b2014-08-07 03:30:121755}
1756
alexmosbc7eafa2014-12-06 01:38:091757void RenderThreadImpl::OnCreateNewFrameProxy(
1758 int routing_id,
alexmosbc7eafa2014-12-06 01:38:091759 int render_view_routing_id,
alexmosa181efc2015-09-03 00:39:041760 int opener_routing_id,
1761 int parent_routing_id,
alexmosbc7eafa2014-12-06 01:38:091762 const FrameReplicationState& replicated_state) {
creis9f7248b2016-01-27 20:27:391763 // Debug cases of https://crbug.com/575245.
1764 base::debug::SetCrashKeyValue("newproxy_proxy_id",
1765 base::IntToString(routing_id));
1766 base::debug::SetCrashKeyValue("newproxy_view_id",
1767 base::IntToString(render_view_routing_id));
1768 base::debug::SetCrashKeyValue("newproxy_opener_id",
1769 base::IntToString(opener_routing_id));
1770 base::debug::SetCrashKeyValue("newproxy_parent_id",
1771 base::IntToString(parent_routing_id));
alexmosa181efc2015-09-03 00:39:041772 RenderFrameProxy::CreateFrameProxy(routing_id, render_view_routing_id,
1773 opener_routing_id, parent_routing_id,
1774 replicated_state);
[email protected]82307f6b2014-08-07 03:30:121775}
1776
[email protected]f1a29a02011-10-06 23:08:441777void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) {
danakj6e3bf8012014-12-16 18:27:531778 CompositorDependencies* compositor_deps = this;
[email protected]be645db2009-02-06 20:36:331779 // When bringing in render_view, also bring in webkit's glue and jsbindings.
dcheng35d31c112015-07-22 00:17:361780 RenderViewImpl::Create(compositor_deps, params, false);
[email protected]7f874dec2009-02-06 01:48:271781}
[email protected]4274e582009-01-27 22:09:561782
sadrul6d310fa2016-08-04 02:12:161783scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() {
[email protected]d13f35d2012-05-18 02:28:151784 TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync");
1785
piman9fc22f32016-05-02 22:21:221786 if (gpu_channel_) {
[email protected]1082b1d2010-03-30 00:31:221787 // Do nothing if we already have a GPU channel or are already
1788 // establishing one.
[email protected]7951bfe2013-06-13 01:43:341789 if (!gpu_channel_->IsLost())
piman9fc22f32016-05-02 22:21:221790 return gpu_channel_;
[email protected]6217d392010-03-25 22:08:351791
1792 // Recreate the channel if it has been lost.
piman765e5282015-05-08 03:43:011793 gpu_channel_->DestroyChannel();
penghuange1d86512016-07-08 18:15:001794 gpu_channel_ = nullptr;
[email protected]6217d392010-03-25 22:08:351795 }
1796
penghuange1d86512016-07-08 18:15:001797 if (!IsRunningInMash()) {
1798 int client_id = 0;
1799 IPC::ChannelHandle channel_handle;
1800 gpu::GPUInfo gpu_info;
1801 // Ask the browser for the channel name.
1802 if (!Send(new ChildProcessHostMsg_EstablishGpuChannel(
sadrul6d310fa2016-08-04 02:12:161803 &client_id, &channel_handle, &gpu_info)) ||
amistrycef5cfa2016-07-21 00:09:321804 !channel_handle.mojo_handle.is_valid()) {
penghuange1d86512016-07-08 18:15:001805 // Otherwise cancel the connection.
1806 return nullptr;
1807 }
1808 GetContentClient()->SetGpuInfo(gpu_info);
1809
1810 // Cache some variables that are needed on the compositor thread for our
1811 // implementation of GpuChannelHostFactory.
1812 io_thread_task_runner_ = ChildProcess::current()->io_task_runner();
1813
1814 gpu_channel_ =
1815 gpu::GpuChannelHost::Create(this, client_id, gpu_info, channel_handle,
1816 ChildProcess::current()->GetShutDownEvent(),
1817 gpu_memory_buffer_manager());
1818 } else {
sadrul943e3b32016-08-04 18:22:591819#if defined(USE_AURA)
sadrul9e0bb1d2016-08-04 20:18:391820 gpu_channel_ = gpu_service_->EstablishGpuChannelSync();
penghuange1d86512016-07-08 18:15:001821#else
1822 NOTREACHED();
1823#endif
[email protected]b42a9f62011-06-08 20:36:041824 }
piman9fc22f32016-05-02 22:21:221825 return gpu_channel_;
[email protected]3bf4d532010-03-27 00:23:341826}
1827
danakj1120f4c2016-09-15 02:05:321828std::unique_ptr<cc::CompositorFrameSink>
1829RenderThreadImpl::CreateCompositorFrameSink(
danakj83066a32016-06-21 02:34:491830 bool use_software,
1831 int routing_id,
1832 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue,
1833 const GURL& url) {
1834 const base::CommandLine& command_line =
1835 *base::CommandLine::ForCurrentProcess();
1836 if (command_line.HasSwitch(switches::kDisableGpuCompositing))
1837 use_software = true;
1838
sadrul943e3b32016-08-04 18:22:591839#if defined(USE_AURA)
rockotcef38272016-07-15 22:47:471840 if (GetMojoShellConnection() && !use_software &&
danakj83066a32016-06-21 02:34:491841 command_line.HasSwitch(switches::kUseMusInRenderer)) {
1842 RenderWidgetMusConnection* connection =
1843 RenderWidgetMusConnection::GetOrCreate(routing_id);
sadrul12e259d2016-08-19 01:36:581844 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host =
1845 EstablishGpuChannelSync();
danakj1120f4c2016-09-15 02:05:321846 return connection->CreateCompositorFrameSink(std::move(gpu_channel_host));
danakj83066a32016-06-21 02:34:491847 }
1848#endif
1849
danakj1120f4c2016-09-15 02:05:321850 uint32_t compositor_frame_sink_id = g_next_compositor_frame_sink_id++;
danakj83066a32016-06-21 02:34:491851
1852 if (command_line.HasSwitch(switches::kEnableVulkan)) {
1853 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider =
1854 cc::VulkanInProcessContextProvider::Create();
1855 if (vulkan_context_provider) {
1856 DCHECK(!layout_test_mode());
danakj1120f4c2016-09-15 02:05:321857 return base::MakeUnique<RendererCompositorFrameSink>(
1858 routing_id, compositor_frame_sink_id,
enne077ba4862016-09-12 20:59:531859 CreateExternalBeginFrameSource(routing_id),
1860 std::move(vulkan_context_provider),
ricea29649b92016-08-31 09:30:211861 std::move(frame_swap_message_queue));
danakj83066a32016-06-21 02:34:491862 }
1863 }
1864
1865 // Create a gpu process channel and verify we want to use GPU compositing
1866 // before creating any context providers.
1867 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host;
1868 if (!use_software) {
sadrul6d310fa2016-08-04 02:12:161869 gpu_channel_host = EstablishGpuChannelSync();
danakj83066a32016-06-21 02:34:491870 if (!gpu_channel_host) {
1871 // Cause the compositor to wait and try again.
1872 return nullptr;
1873 }
1874 // We may get a valid channel, but with a software renderer. In that case,
1875 // disable GPU compositing.
1876 if (gpu_channel_host->gpu_info().software_rendering)
1877 use_software = true;
1878 }
1879
1880 if (use_software) {
1881 DCHECK(!layout_test_mode());
danakj1120f4c2016-09-15 02:05:321882 return base::MakeUnique<RendererCompositorFrameSink>(
1883 routing_id, compositor_frame_sink_id,
enne077ba4862016-09-12 20:59:531884 CreateExternalBeginFrameSource(routing_id), nullptr, nullptr,
ricea29649b92016-08-31 09:30:211885 std::move(frame_swap_message_queue));
danakj83066a32016-06-21 02:34:491886 }
1887
1888 scoped_refptr<ContextProviderCommandBuffer> worker_context_provider =
1889 SharedCompositorWorkerContextProvider();
1890 if (!worker_context_provider) {
1891 // Cause the compositor to wait and try again.
1892 return nullptr;
1893 }
1894
1895 // The renderer compositor context doesn't do a lot of stuff, so we don't
1896 // expect it to need a lot of space for commands or transfer. Raster and
1897 // uploads happen on the worker context instead.
1898 gpu::SharedMemoryLimits limits = gpu::SharedMemoryLimits::ForMailboxContext();
1899
1900 // This is for an offscreen context for the compositor. So the default
1901 // framebuffer doesn't need alpha, depth, stencil, antialiasing.
1902 gpu::gles2::ContextCreationAttribHelper attributes;
1903 attributes.alpha_size = -1;
1904 attributes.depth_size = 0;
1905 attributes.stencil_size = 0;
1906 attributes.samples = 0;
1907 attributes.sample_buffers = 0;
1908 attributes.bind_generates_resource = false;
1909 attributes.lose_context_when_out_of_memory = true;
1910
1911 constexpr bool automatic_flushes = false;
1912 constexpr bool support_locking = false;
1913
1914 // The compositor context shares resources with the worker context unless
1915 // the worker is async.
1916 ContextProviderCommandBuffer* share_context = worker_context_provider.get();
1917 if (IsAsyncWorkerContextEnabled())
1918 share_context = nullptr;
1919
1920 scoped_refptr<ContextProviderCommandBuffer> context_provider(
1921 new ContextProviderCommandBuffer(
danakja40dd4482016-06-28 01:14:101922 gpu_channel_host, gpu::GPU_STREAM_DEFAULT,
danakj83066a32016-06-21 02:34:491923 gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle, url,
pimand488e8b42016-06-30 19:06:591924 automatic_flushes, support_locking, limits, attributes, share_context,
danakj83066a32016-06-21 02:34:491925 command_buffer_metrics::RENDER_COMPOSITOR_CONTEXT));
1926
danakj83066a32016-06-21 02:34:491927 if (layout_test_deps_) {
danakj1120f4c2016-09-15 02:05:321928 return layout_test_deps_->CreateCompositorFrameSink(
jbroman6ccbc7d472016-07-27 04:45:411929 routing_id, std::move(gpu_channel_host), std::move(context_provider),
danakja40dd4482016-06-28 01:14:101930 std::move(worker_context_provider), this);
danakj83066a32016-06-21 02:34:491931 }
1932
1933#if defined(OS_ANDROID)
1934 if (sync_compositor_message_filter_) {
danakj1120f4c2016-09-15 02:05:321935 return base::MakeUnique<SynchronousCompositorFrameSink>(
danakja40dd4482016-06-28 01:14:101936 std::move(context_provider), std::move(worker_context_provider),
danakj1120f4c2016-09-15 02:05:321937 routing_id, compositor_frame_sink_id,
enne077ba4862016-09-12 20:59:531938 CreateExternalBeginFrameSource(routing_id),
1939 sync_compositor_message_filter_.get(),
ricea29649b92016-08-31 09:30:211940 std::move(frame_swap_message_queue));
danakj83066a32016-06-21 02:34:491941 }
1942#endif
danakj1120f4c2016-09-15 02:05:321943 return base::WrapUnique(new RendererCompositorFrameSink(
1944 routing_id, compositor_frame_sink_id,
1945 CreateExternalBeginFrameSource(routing_id), std::move(context_provider),
1946 std::move(worker_context_provider), std::move(frame_swap_message_queue)));
danakj83066a32016-06-21 02:34:491947}
1948
jbroman6ccbc7d472016-07-27 04:45:411949std::unique_ptr<cc::SwapPromise>
1950RenderThreadImpl::RequestCopyOfOutputForLayoutTest(
1951 int32_t routing_id,
1952 std::unique_ptr<cc::CopyOutputRequest> request) {
1953 DCHECK(layout_test_deps_);
1954 return layout_test_deps_->RequestCopyOfOutput(routing_id, std::move(request));
1955}
1956
[email protected]180ef242013-11-07 06:50:461957blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter(
1958 blink::WebMediaStreamCenterClient* client) {
[email protected]d8cd8372012-03-09 10:49:511959#if defined(ENABLE_WEBRTC)
[email protected]68e5fee2013-02-18 10:04:221960 if (!media_stream_center_) {
1961 media_stream_center_ = GetContentClient()->renderer()
1962 ->OverrideCreateWebMediaStreamCenter(client);
1963 if (!media_stream_center_) {
dchengcedca5612016-04-09 01:40:151964 std::unique_ptr<MediaStreamCenter> media_stream_center(
[email protected]0107d8a2014-05-16 10:20:341965 new MediaStreamCenter(client, GetPeerConnectionDependencyFactory()));
[email protected]c1298742013-07-17 04:06:321966 media_stream_center_ = media_stream_center.release();
[email protected]68e5fee2013-02-18 10:04:221967 }
1968 }
[email protected]d8cd8372012-03-09 10:49:511969#endif
1970 return media_stream_center_;
1971}
1972
[email protected]22fe91d2014-08-12 17:07:121973#if defined(ENABLE_WEBRTC)
[email protected]0107d8a2014-05-16 10:20:341974PeerConnectionDependencyFactory*
1975RenderThreadImpl::GetPeerConnectionDependencyFactory() {
[email protected]83e0a482014-05-22 18:07:181976 return peer_connection_factory_.get();
[email protected]6ee10bd2012-09-13 09:01:531977}
[email protected]22fe91d2014-08-12 17:07:121978#endif
[email protected]6ee10bd2012-09-13 09:01:531979
rockot1587e332016-07-27 17:44:141980mojom::RenderFrameMessageFilter*
1981RenderThreadImpl::render_frame_message_filter() {
1982 if (!render_frame_message_filter_)
1983 GetChannel()->GetRemoteAssociatedInterface(&render_frame_message_filter_);
1984 return render_frame_message_filter_.get();
1985}
1986
penghuang346a46f92016-03-31 21:37:521987gpu::GpuChannelHost* RenderThreadImpl::GetGpuChannel() {
piman9fc22f32016-05-02 22:21:221988 if (!gpu_channel_)
danakj3873e852016-05-05 00:46:071989 return nullptr;
[email protected]7951bfe2013-06-13 01:43:341990 if (gpu_channel_->IsLost())
danakj3873e852016-05-05 00:46:071991 return nullptr;
[email protected]6217d392010-03-25 22:08:351992 return gpu_channel_.get();
1993}
1994
thestigc4cac8f2014-09-04 21:17:501995#if defined(ENABLE_PLUGINS)
[email protected]f1a29a02011-10-06 23:08:441996void RenderThreadImpl::OnPurgePluginListCache(bool reload_pages) {
[email protected]b547fd42009-04-23 23:16:271997 // The call below will cause a GetPlugins call with refresh=true, but at this
1998 // point we already know that the browser has refreshed its list, so disable
1999 // refresh temporarily to prevent each renderer process causing the list to be
2000 // regenerated.
tfarina556a7232014-10-05 01:02:092001 blink_platform_impl_->set_plugin_refresh_allowed(false);
[email protected]180ef242013-11-07 06:50:462002 blink::resetPluginCache(reload_pages);
tfarina556a7232014-10-05 01:02:092003 blink_platform_impl_->set_plugin_refresh_allowed(true);
[email protected]3b48dbc2012-01-06 16:34:172004
tyoshino832a58a2016-04-18 08:14:082005 FOR_EACH_OBSERVER(RenderThreadObserver, observers_, PluginListChanged());
[email protected]b547fd42009-04-23 23:16:272006}
thestigc4cac8f2014-09-04 21:17:502007#endif
[email protected]85c55dc2009-11-06 03:05:462008
jkarlin300a1d22015-09-18 19:32:522009void RenderThreadImpl::OnNetworkConnectionChanged(
2010 net::NetworkChangeNotifier::ConnectionType type,
2011 double max_bandwidth_mbps) {
[email protected]8c2a34b2014-06-10 16:27:272012 bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE;
[email protected]6eac57a2011-07-12 21:15:092013 WebNetworkStateNotifier::setOnLine(online);
[email protected]d7ff5fb2014-05-29 19:50:252014 FOR_EACH_OBSERVER(
tyoshino832a58a2016-04-18 08:14:082015 RenderThreadObserver, observers_, NetworkStateChanged(online));
jkarlin300a1d22015-09-18 19:32:522016 WebNetworkStateNotifier::setWebConnection(
2017 NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps);
[email protected]6eac57a2011-07-12 21:15:092018}
2019
blundellc00adf442016-09-16 10:43:412020void RenderThreadImpl::OnTimeZoneChange(const std::string& zone_id) {
jochen22b6f9a2014-11-26 11:30:562021 if (!blink_platform_impl_)
2022 return;
jshin0a9aa632015-04-29 18:35:292023 if (!zone_id.empty()) {
2024 icu::TimeZone *new_zone = icu::TimeZone::createTimeZone(
2025 icu::UnicodeString::fromUTF8(zone_id));
2026 icu::TimeZone::adoptDefault(new_zone);
2027 VLOG(1) << "ICU default timezone is set to " << zone_id;
2028 }
[email protected]df9accd2014-03-13 18:18:302029 NotifyTimezoneChange();
2030}
2031
[email protected]b0988b22013-11-08 08:25:582032#if defined(OS_ANDROID)
[email protected]44363382013-03-12 07:22:472033void RenderThreadImpl::OnSetWebKitSharedTimersSuspended(bool suspend) {
jdduked73ae5412015-05-11 20:07:162034 if (suspend) {
jdduked73ae5412015-05-11 20:07:162035 renderer_scheduler_->SuspendTimerQueue();
2036 } else {
jdduked73ae5412015-05-11 20:07:162037 renderer_scheduler_->ResumeTimerQueue();
[email protected]3b96b7b52014-01-13 18:36:072038 }
jdduked73ae5412015-05-11 20:07:162039 webkit_shared_timer_suspended_ = suspend;
[email protected]44363382013-03-12 07:22:472040}
[email protected]b0988b22013-11-08 08:25:582041#endif
2042
2043#if defined(OS_MACOSX)
[email protected]291857a2014-01-23 17:49:112044void RenderThreadImpl::OnUpdateScrollbarTheme(
kerrnelc39eeb72015-06-25 21:11:482045 const ViewMsg_UpdateScrollbarTheme_Params& params) {
[email protected]33b02992014-03-01 01:06:292046 static_cast<WebScrollbarBehaviorImpl*>(
tfarina556a7232014-10-05 01:02:092047 blink_platform_impl_->scrollbarBehavior())
kerrnelc39eeb72015-06-25 21:11:482048 ->set_jump_on_track_click(params.jump_on_track_click);
2049
kerrnela84d95e2015-07-31 17:34:212050 blink::WebScrollbarTheme::updateScrollbarsWithNSDefaults(
kerrnelc39eeb72015-06-25 21:11:482051 params.initial_button_delay, params.autoscroll_button_delay,
kerrnela84d95e2015-07-31 17:34:212052 params.preferred_scroller_style, params.redraw,
bokanb9c004262016-02-17 23:22:102053 params.button_placement);
[email protected]b0988b22013-11-08 08:25:582054}
rsesek1efb3c32015-09-29 15:39:502055
2056void RenderThreadImpl::OnSystemColorsChanged(
2057 int aqua_color_variant,
2058 const std::string& highlight_text_color,
2059 const std::string& highlight_color) {
2060 SystemColorsDidChange(aqua_color_variant, highlight_text_color,
2061 highlight_color);
2062}
[email protected]b0988b22013-11-08 08:25:582063#endif
[email protected]44363382013-03-12 07:22:472064
[email protected]0ec90d522014-03-12 16:28:192065void RenderThreadImpl::OnCreateNewSharedWorker(
2066 const WorkerProcessMsg_CreateWorker_Params& params) {
2067 // EmbeddedSharedWorkerStub will self-destruct.
mkwstcfa98932016-03-09 13:06:192068 new EmbeddedSharedWorkerStub(
2069 params.url, params.name, params.content_security_policy,
2070 params.security_policy_type, params.creation_address_space,
2071 params.pause_on_start, params.route_id);
[email protected]0ec90d522014-03-12 16:28:192072}
2073
[email protected]5071cb22013-07-10 02:19:062074void RenderThreadImpl::OnMemoryPressure(
2075 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
hong.zhengb28b5332016-05-11 02:33:392076 TRACE_EVENT0("memory","RenderThreadImpl::OnMemoryPressure");
ssiddda2ba022015-06-18 21:12:392077 ReleaseFreeMemory();
[email protected]5071cb22013-07-10 02:19:062078
rmcilroyab967c972015-02-17 23:15:002079 // Do not call into blink if it is not initialized.
rmcilroy7fbb3bd52015-02-17 19:02:142080 if (blink_platform_impl_) {
bashi5e843ac2016-06-17 07:44:352081 blink::WebMemoryCoordinator::onMemoryPressure(
bashic577bfc2016-01-08 03:42:352082 static_cast<blink::WebMemoryPressureLevel>(memory_pressure_level));
rmcilroyab967c972015-02-17 23:15:002083
rmcilroyab967c972015-02-17 23:15:002084 if (memory_pressure_level ==
2085 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
rmcilroyab967c972015-02-17 23:15:002086 // Purge Skia font cache, by setting it to 0 and then again to the
2087 // previous limit.
2088 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0);
2089 SkGraphics::SetFontCacheLimit(font_cache_limit);
2090 }
rmcilroy7fbb3bd52015-02-17 19:02:142091 }
[email protected]5071cb22013-07-10 02:19:062092}
2093
skyostil2d3b5bd2015-05-27 15:40:592094scoped_refptr<base::SingleThreadTaskRunner>
thestig529ad8a2016-07-08 20:30:122095RenderThreadImpl::GetFileThreadTaskRunner() {
fdoraye94d8642016-07-07 19:19:012096 DCHECK(message_loop()->task_runner()->BelongsToCurrentThread());
[email protected]59383c782013-04-17 16:43:272097 if (!file_thread_) {
[email protected]c6a7b862010-08-20 22:19:382098 file_thread_.reset(new base::Thread("Renderer::FILE"));
2099 file_thread_->Start();
2100 }
skyostil2d3b5bd2015-05-27 15:40:592101 return file_thread_->task_runner();
[email protected]c6a7b862010-08-20 22:19:382102}
[email protected]e9ff79c2012-10-19 21:31:262103
acolwellb4034942014-08-28 15:42:432104scoped_refptr<base::SingleThreadTaskRunner>
2105RenderThreadImpl::GetMediaThreadTaskRunner() {
fdoraye94d8642016-07-07 19:19:012106 DCHECK(message_loop()->task_runner()->BelongsToCurrentThread());
[email protected]c1330c82013-06-06 02:23:252107 if (!media_thread_) {
2108 media_thread_.reset(new base::Thread("Media"));
2109 media_thread_->Start();
[email protected]6ca6a082013-09-22 20:10:052110
2111#if defined(OS_ANDROID)
2112 renderer_demuxer_ = new RendererDemuxerAndroid();
2113 AddFilter(renderer_demuxer_.get());
2114#endif
[email protected]c1330c82013-06-06 02:23:252115 }
skyostil2d3b5bd2015-05-27 15:40:592116 return media_thread_->task_runner();
[email protected]c1330c82013-06-06 02:23:252117}
2118
dcastagna4517a182015-08-05 19:51:032119base::TaskRunner* RenderThreadImpl::GetWorkerTaskRunner() {
prashant.nfad657e2016-06-01 07:52:172120 return categorized_worker_pool_.get();
dcastagnab880e8f2015-06-30 20:16:062121}
2122
revemand180dfc32015-09-24 00:19:432123scoped_refptr<ContextProviderCommandBuffer>
danakj0b4b94e32016-05-10 22:33:012124RenderThreadImpl::SharedCompositorWorkerContextProvider() {
revemand180dfc32015-09-24 00:19:432125 DCHECK(IsMainThread());
2126 // Try to reuse existing shared worker context provider.
revemand180dfc32015-09-24 00:19:432127 if (shared_worker_context_provider_) {
2128 // Note: If context is lost, delete reference after releasing the lock.
boliu11afa7e2016-04-18 18:04:142129 cc::ContextProvider::ScopedContextLock lock(
2130 shared_worker_context_provider_.get());
revemand180dfc32015-09-24 00:19:432131 if (shared_worker_context_provider_->ContextGL()
danakje8ec797e2016-04-19 04:08:432132 ->GetGraphicsResetStatusKHR() == GL_NO_ERROR)
2133 return shared_worker_context_provider_;
revemand180dfc32015-09-24 00:19:432134 }
danakje8ec797e2016-04-19 04:08:432135
sadrul6d310fa2016-08-04 02:12:162136 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(
2137 EstablishGpuChannelSync());
danakje8ec797e2016-04-19 04:08:432138 if (!gpu_channel_host) {
2139 shared_worker_context_provider_ = nullptr;
2140 return shared_worker_context_provider_;
revemand180dfc32015-09-24 00:19:432141 }
danakje8ec797e2016-04-19 04:08:432142
sunnypsd8ce1c22016-05-10 18:02:402143 int32_t stream_id = gpu::GPU_STREAM_DEFAULT;
2144 gpu::GpuStreamPriority stream_priority = gpu::GpuStreamPriority::NORMAL;
2145 if (is_async_worker_context_enabled_) {
2146 stream_id = gpu_channel_host->GenerateStreamID();
2147 stream_priority = gpu::GpuStreamPriority::LOW;
2148 }
2149
danakj9a04adc2016-05-16 22:45:072150 bool support_locking = true;
danakj0dd9e1e2016-05-11 22:15:092151 shared_worker_context_provider_ = CreateOffscreenContext(
danakj9a04adc2016-05-16 22:45:072152 std::move(gpu_channel_host), gpu::SharedMemoryLimits(), support_locking,
danakj0dd9e1e2016-05-11 22:15:092153 command_buffer_metrics::RENDER_WORKER_CONTEXT, stream_id,
2154 stream_priority);
danakje8ec797e2016-04-19 04:08:432155 if (!shared_worker_context_provider_->BindToCurrentThread())
2156 shared_worker_context_provider_ = nullptr;
revemand180dfc32015-09-24 00:19:432157 return shared_worker_context_provider_;
2158}
2159
[email protected]180ef242013-11-07 06:50:462160void RenderThreadImpl::SampleGamepads(blink::WebGamepads* data) {
tfarina556a7232014-10-05 01:02:092161 blink_platform_impl_->sampleGamepads(*data);
[email protected]0ff736562014-05-09 09:09:472162}
2163
rmcilroyaa296052015-04-14 15:35:272164bool RenderThreadImpl::RendererIsHidden() const {
2165 return widget_count_ > 0 && hidden_widget_count_ == widget_count_;
2166}
2167
[email protected]b2db9272014-01-10 17:42:002168void RenderThreadImpl::WidgetCreated() {
rmcilroyaa296052015-04-14 15:35:272169 bool renderer_was_hidden = RendererIsHidden();
[email protected]b2db9272014-01-10 17:42:002170 widget_count_++;
rmcilroyaa296052015-04-14 15:35:272171 if (renderer_was_hidden)
2172 OnRendererVisible();
[email protected]b2db9272014-01-10 17:42:002173}
2174
2175void RenderThreadImpl::WidgetDestroyed() {
rmcilroyaa296052015-04-14 15:35:272176 // TODO(rmcilroy): Remove the restriction that destroyed widgets must be
2177 // unhidden before WidgetDestroyed is called.
2178 DCHECK_GT(widget_count_, 0);
2179 DCHECK_GT(widget_count_, hidden_widget_count_);
[email protected]b2db9272014-01-10 17:42:002180 widget_count_--;
rmcilroyaa296052015-04-14 15:35:272181 if (RendererIsHidden())
2182 OnRendererHidden();
[email protected]b2db9272014-01-10 17:42:002183}
2184
2185void RenderThreadImpl::WidgetHidden() {
2186 DCHECK_LT(hidden_widget_count_, widget_count_);
2187 hidden_widget_count_++;
rmcilroyaa296052015-04-14 15:35:272188 if (RendererIsHidden())
2189 OnRendererHidden();
[email protected]b2db9272014-01-10 17:42:002190}
2191
2192void RenderThreadImpl::WidgetRestored() {
rmcilroyaa296052015-04-14 15:35:272193 bool renderer_was_hidden = RendererIsHidden();
[email protected]b2db9272014-01-10 17:42:002194 DCHECK_GT(hidden_widget_count_, 0);
2195 hidden_widget_count_--;
rmcilroyaa296052015-04-14 15:35:272196 if (renderer_was_hidden)
2197 OnRendererVisible();
2198}
[email protected]b2db9272014-01-10 17:42:002199
rmcilroyaa296052015-04-14 15:35:272200void RenderThreadImpl::OnRendererHidden() {
ulan432cd6e42016-03-01 15:59:142201 blink::mainThreadIsolate()->IsolateInBackgroundNotification();
rmcilroyaa296052015-04-14 15:35:272202 // TODO(rmcilroy): Remove IdleHandler and replace it with an IdleTask
2203 // scheduled by the RendererScheduler - http://crbug.com/469210.
ulan4a385192015-11-11 10:59:182204 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden())
2205 return;
2206 ScheduleIdleHandler(kInitialIdleHandlerDelayMs);
rmcilroyaa296052015-04-14 15:35:272207}
2208
2209void RenderThreadImpl::OnRendererVisible() {
ulan432cd6e42016-03-01 15:59:142210 blink::mainThreadIsolate()->IsolateInForegroundNotification();
rmcilroyaa296052015-04-14 15:35:272211 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden())
[email protected]b2db9272014-01-10 17:42:002212 return;
[email protected]b2db9272014-01-10 17:42:002213 ScheduleIdleHandler(kLongIdleHandlerDelayMs);
2214}
2215
ssid0603ca9f2015-06-09 16:48:082216void RenderThreadImpl::ReleaseFreeMemory() {
2217 base::allocator::ReleaseFreeMemory();
2218 discardable_shared_memory_manager()->ReleaseFreeMemory();
2219
2220 if (blink_platform_impl_)
2221 blink::decommitFreeableMemory();
2222}
2223
ben76f52b242016-06-18 05:42:482224RenderThreadImpl::PendingFrameCreate::PendingFrameCreate(
rockotf8fdd9b2015-12-16 22:22:352225 int routing_id,
ben76f52b242016-06-18 05:42:482226 mojom::FrameRequest frame_request,
2227 mojom::FrameHostPtr frame_host)
rockotf8fdd9b2015-12-16 22:22:352228 : routing_id_(routing_id),
ben76f52b242016-06-18 05:42:482229 frame_request_(std::move(frame_request)),
2230 frame_host_(std::move(frame_host)) {
2231 // The RenderFrame may be deleted before the CreateFrame message is received.
2232 // In that case, the RenderFrameHost should cancel the create, which is
2233 // detected by setting an error handler on |frame_host_|.
2234 frame_host_.set_connection_error_handler(base::Bind(
2235 &RenderThreadImpl::PendingFrameCreate::OnConnectionError,
rockotf8fdd9b2015-12-16 22:22:352236 base::Unretained(this)));
2237}
2238
ben76f52b242016-06-18 05:42:482239RenderThreadImpl::PendingFrameCreate::~PendingFrameCreate() {
rockotf8fdd9b2015-12-16 22:22:352240}
2241
ben76f52b242016-06-18 05:42:482242void RenderThreadImpl::PendingFrameCreate::OnConnectionError() {
rockotf8fdd9b2015-12-16 22:22:352243 size_t erased =
ben76f52b242016-06-18 05:42:482244 RenderThreadImpl::current()->pending_frame_creates_.erase(routing_id_);
rockotf8fdd9b2015-12-16 22:22:352245 DCHECK_EQ(1u, erased);
2246}
2247
hong.zhengb28b5332016-05-11 02:33:392248void RenderThreadImpl::OnSyncMemoryPressure(
2249 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
2250 if (!blink::mainThreadIsolate())
2251 return;
2252
2253 v8::MemoryPressureLevel v8_memory_pressure_level =
2254 static_cast<v8::MemoryPressureLevel>(memory_pressure_level);
2255
2256 // In order to reduce performance impact, translate critical level to
2257 // moderate level for foregroud renderer.
2258 if (!RendererIsHidden() &&
2259 v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical)
2260 v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate;
2261
2262 blink::mainThreadIsolate()->MemoryPressureNotification(
2263 v8_memory_pressure_level);
2264 blink::MemoryPressureNotificationToWorkerThreadIsolates(
2265 v8_memory_pressure_level);
2266}
2267
bashic4b4afcb2016-08-23 06:37:522268// Note that this would be called only when memory_coordinator is enabled.
2269// OnSyncMemoryPressure() is never called in that case.
2270void RenderThreadImpl::OnTrimMemoryImmediately() {
2271 if (blink::mainThreadIsolate()) {
2272 blink::mainThreadIsolate()->MemoryPressureNotification(
2273 v8::MemoryPressureLevel::kCritical);
2274 blink::MemoryPressureNotificationToWorkerThreadIsolates(
2275 v8::MemoryPressureLevel::kCritical);
2276 }
2277}
2278
2279
[email protected]e9ff79c2012-10-19 21:31:262280} // namespace content