blob: 4a4ad9e1156f9afd78c0b3a5e3a8b7f24c954931 [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>
[email protected]da00a2882009-03-09 17:51:1910#include <vector>
11
[email protected]237a14852012-04-28 02:56:3812#include "base/allocator/allocator_extension.h"
[email protected]06533c0b2009-03-05 21:39:1113#include "base/command_line.h"
[email protected]58580352010-10-26 04:07:5014#include "base/debug/trace_event.h"
[email protected]94f9a0f682009-06-15 18:30:3015#include "base/lazy_instance.h"
[email protected]bee16aab2009-08-26 15:55:0316#include "base/logging.h"
[email protected]835d7c82010-10-14 04:38:3817#include "base/metrics/field_trial.h"
[email protected]6cf19311f2011-04-14 23:06:0218#include "base/metrics/histogram.h"
[email protected]835d7c82010-10-14 04:38:3819#include "base/metrics/stats_table.h"
[email protected]433df472012-03-07 20:33:3920#include "base/path_service.h"
initial.commit09911bf2008-07-26 23:55:2921#include "base/shared_memory.h"
[email protected]feb32372012-11-21 01:14:5622#include "base/string16.h"
[email protected]8c380582011-12-02 03:16:1023#include "base/string_number_conversions.h" // Temporary
[email protected]1357c322010-12-30 22:18:5624#include "base/threading/thread_local.h"
[email protected]d293572a2013-05-23 18:50:4525#include "base/threading/thread_restrictions.h"
[email protected]58436a12012-03-21 17:10:2626#include "base/utf_string_conversions.h"
[email protected]7a4de7a62010-08-17 18:38:2427#include "base/values.h"
[email protected]e93e04e2011-03-14 00:27:1028#include "content/common/appcache/appcache_dispatcher.h"
[email protected]83ab4a282012-07-12 18:19:4529#include "content/common/child_histogram_message_filter.h"
[email protected]bdae9812011-10-15 00:33:0330#include "content/common/child_process_messages.h"
[email protected]37666cf2011-03-13 21:51:4231#include "content/common/database_messages.h"
32#include "content/common/db_message_filter.h"
[email protected]127dd582011-03-16 21:32:1033#include "content/common/dom_storage_messages.h"
[email protected]c29b7ff2013-03-06 03:51:0434#include "content/common/gpu/client/context_provider_command_buffer.h"
[email protected]c26ad882012-02-07 06:41:2035#include "content/common/gpu/client/gpu_channel_host.h"
[email protected]202b54ff2011-04-22 21:36:3836#include "content/common/gpu/gpu_messages.h"
[email protected]359dfa32011-10-12 01:10:1537#include "content/common/resource_dispatcher.h"
[email protected]94dc971d2011-03-05 19:08:3238#include "content/common/resource_messages.h"
[email protected]778574e2011-03-21 22:03:5039#include "content/common/view_messages.h"
[email protected]1570ac52013-05-22 15:05:3640#include "content/common_child/indexed_db/indexed_db_dispatcher.h"
41#include "content/common_child/indexed_db/indexed_db_message_filter.h"
[email protected]872f3a92013-05-21 08:16:0842#include "content/common_child/npobject_util.h"
43#include "content/common_child/plugin_messages.h"
[email protected]08b1f75f2013-05-22 22:02:3844#include "content/common_child/web_database_observer_impl.h"
[email protected]a458504b2012-07-23 19:57:0645#include "content/public/common/content_constants.h"
[email protected]433df472012-03-07 20:33:3946#include "content/public/common/content_paths.h"
[email protected]c08950d22011-10-13 22:20:2947#include "content/public/common/content_switches.h"
[email protected]daf82f82011-10-31 22:35:3148#include "content/public/common/renderer_preferences.h"
[email protected]58436a12012-03-21 17:10:2649#include "content/public/common/url_constants.h"
[email protected]d344114c2011-10-01 01:24:3450#include "content/public/renderer/content_renderer_client.h"
[email protected]64ffa0442011-10-03 22:08:3651#include "content/public/renderer/render_process_observer.h"
52#include "content/public/renderer/render_view_visitor.h"
[email protected]70019152012-12-19 11:44:1953#include "content/renderer/devtools/devtools_agent_filter.h"
[email protected]1910fe82012-05-10 00:04:1054#include "content/renderer/dom_storage/dom_storage_dispatcher.h"
55#include "content/renderer/dom_storage/webstoragearea_impl.h"
56#include "content/renderer/dom_storage/webstoragenamespace_impl.h"
[email protected]1842fe22012-08-13 23:24:3557#include "content/renderer/gpu/compositor_output_surface.h"
[email protected]e54ab492012-06-12 19:40:0158#include "content/renderer/gpu/gpu_benchmarking_extension.h"
[email protected]ea5f70a2013-03-07 12:30:3659#include "content/renderer/gpu/input_handler_manager.h"
[email protected]f7eb0a392011-07-12 10:19:5160#include "content/renderer/media/audio_input_message_filter.h"
61#include "content/renderer/media/audio_message_filter.h"
[email protected]3958e972012-07-17 00:25:4162#include "content/renderer/media/audio_renderer_mixer_manager.h"
[email protected]d8cd8372012-03-09 10:49:5163#include "content/renderer/media/media_stream_center.h"
[email protected]6ee10bd2012-09-13 09:01:5364#include "content/renderer/media/media_stream_dependency_factory.h"
[email protected]af089972013-01-10 04:04:4065#include "content/renderer/media/peer_connection_tracker.h"
[email protected]80b161a2011-06-27 17:42:1166#include "content/renderer/media/video_capture_impl_manager.h"
[email protected]ba164c912011-06-14 22:07:3467#include "content/renderer/media/video_capture_message_filter.h"
[email protected]373d6ca2013-05-14 21:15:0668#include "content/renderer/media/webrtc_logging_message_filter.h"
[email protected]6941ac5c2013-02-07 03:59:5669#include "content/renderer/memory_benchmarking_extension.h"
[email protected]4761cf12012-09-12 10:37:5570#include "content/renderer/p2p/socket_dispatcher.h"
[email protected]6f516082011-03-17 19:15:3571#include "content/renderer/plugin_channel_host.h"
[email protected]8704f89b2011-04-15 00:30:0572#include "content/renderer/render_process_impl.h"
[email protected]310ebd6302011-10-10 19:06:2873#include "content/renderer/render_view_impl.h"
[email protected]8d6cba42011-09-02 10:05:1974#include "content/renderer/renderer_webkitplatformsupport_impl.h"
[email protected]a8228252013-05-14 11:10:0575#include "content/renderer/skia_benchmarking_extension.h"
[email protected]766a7082012-02-03 23:39:1576#include "grit/content_resources.h"
[email protected]46f36a492010-07-28 19:36:4177#include "ipc/ipc_channel_handle.h"
[email protected]1842fe22012-08-13 23:24:3578#include "ipc/ipc_forwarding_message_filter.h"
[email protected]cb6037d2009-11-16 22:55:1779#include "ipc/ipc_platform_file.h"
[email protected]563d665f2013-02-01 04:42:3980#include "media/base/audio_hardware_config.h"
[email protected]433df472012-03-07 20:33:3981#include "media/base/media.h"
[email protected]620161e2011-03-07 18:05:2682#include "net/base/net_errors.h"
[email protected]9d797f32010-04-23 07:17:5483#include "net/base/net_util.h"
[email protected]5c30b5e02013-05-30 03:46:0884#include "third_party/WebKit/public/platform/WebString.h"
[email protected]f8c648b2012-02-28 03:46:4585#include "third_party/WebKit/Source/WebKit/chromium/public/WebColorName.h"
[email protected]8bd0fe62011-01-17 06:44:3786#include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h"
87#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
[email protected]8bd0fe62011-01-17 06:44:3788#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
89#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h"
[email protected]6eac57a2011-07-12 21:15:0990#include "third_party/WebKit/Source/WebKit/chromium/public/WebNetworkStateNotifier.h"
[email protected]4bd55a32011-07-28 13:28:3891#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h"
[email protected]8bd0fe62011-01-17 06:44:3792#include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h"
93#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h"
[email protected]58436a12012-03-21 17:10:2694#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h"
[email protected]00fccb42012-12-11 00:09:5995#include "third_party/WebKit/Source/WebKit/chromium/public/WebSharedWorkerRepository.h"
[email protected]61a796c42012-05-17 21:28:2096#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
[email protected]c49201a2012-05-24 11:04:5797#include "ui/base/layout.h"
[email protected]18ad6772011-09-20 21:51:3298#include "ui/base/ui_base_switches.h"
[email protected]7f3a2cf2011-04-06 00:10:5099#include "v8/include/v8.h"
[email protected]d471190a2011-02-16 14:52:30100#include "webkit/glue/webkit_glue.h"
[email protected]2c62b562009-01-27 19:04:50101
[email protected]da00a2882009-03-09 17:51:19102#if defined(OS_WIN)
103#include <windows.h>
104#include <objbase.h>
[email protected]5f7e4512012-10-01 20:51:37105#include "base/win/scoped_com_initializer.h"
106#else
107// TODO(port)
108#include "base/memory/scoped_handle.h"
[email protected]872f3a92013-05-21 08:16:08109#include "content/common_child/np_channel_base.h"
[email protected]da00a2882009-03-09 17:51:19110#endif
111
[email protected]6217d392010-03-25 22:08:35112#if defined(OS_POSIX)
113#include "ipc/ipc_channel_posix.h"
114#endif
115
[email protected]950f9ce22012-12-27 00:25:07116#if defined(ENABLE_WEBRTC)
117#include "third_party/webrtc/system_wrappers/interface/event_tracer.h"
118#endif
119
[email protected]913d99a2013-05-31 07:16:07120#if defined(OS_ANDROID)
121#include "content/renderer/android/synchronous_compositor_factory.h"
122#endif
123
[email protected]d293572a2013-05-23 18:50:45124using base::ThreadRestrictions;
[email protected]b6cb3a842011-06-24 18:28:41125using WebKit::WebDocument;
[email protected]f85f0702010-01-30 09:31:01126using WebKit::WebFrame;
[email protected]6eac57a2011-07-12 21:15:09127using WebKit::WebNetworkStateNotifier;
[email protected]adf00bc2009-11-02 18:35:00128using WebKit::WebRuntimeFeatures;
[email protected]98d7127b2009-10-23 18:26:51129using WebKit::WebScriptController;
[email protected]58436a12012-03-21 17:10:26130using WebKit::WebSecurityPolicy;
[email protected]2c434b32009-03-19 06:27:47131using WebKit::WebString;
[email protected]50ae00ef2009-10-19 05:11:03132using WebKit::WebView;
[email protected]e9ff79c2012-10-19 21:31:26133
134namespace content {
initial.commit09911bf2008-07-26 23:55:29135
[email protected]42f1d7822009-07-23 18:17:55136namespace {
[email protected]da9ccfb2012-01-28 00:34:40137
138const int64 kInitialIdleHandlerDelayMs = 1000;
139const int64 kShortIdleHandlerDelayMs = 1000;
140const int64 kLongIdleHandlerDelayMs = 30*1000;
141const int kIdleCPUUsageThresholdInPercents = 3;
[email protected]bee16aab2009-08-26 15:55:03142
[email protected]f1a29a02011-10-06 23:08:44143// Keep the global RenderThreadImpl in a TLS slot so it is impossible to access
[email protected]f3ede412010-06-21 22:52:16144// incorrectly from the wrong thread.
[email protected]da9ccfb2012-01-28 00:34:40145base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> >
[email protected]6de0fd1d2011-11-15 13:31:49146 lazy_tls = LAZY_INSTANCE_INITIALIZER;
[email protected]1edc16b82009-04-07 17:45:54147
[email protected]e9ff79c2012-10-19 21:31:26148class RenderViewZoomer : public RenderViewVisitor {
[email protected]40bd6582009-12-04 23:49:51149 public:
[email protected]367c5c1d2013-03-11 18:59:02150 RenderViewZoomer(const std::string& scheme,
151 const std::string& host,
152 double zoom_level) : scheme_(scheme),
153 host_(host),
154 zoom_level_(zoom_level) {
[email protected]40bd6582009-12-04 23:49:51155 }
156
[email protected]c3e35892013-02-12 02:08:01157 virtual bool Visit(RenderView* render_view) OVERRIDE {
[email protected]a2ef54c2011-10-10 16:20:31158 WebView* webview = render_view->GetWebView();
[email protected]b6cb3a842011-06-24 18:28:41159 WebDocument document = webview->mainFrame()->document();
[email protected]b75b8292010-10-01 07:28:25160
161 // Don't set zoom level for full-page plugin since they don't use the same
162 // zoom settings.
[email protected]b6cb3a842011-06-24 18:28:41163 if (document.isPluginDocument())
[email protected]b75b8292010-10-01 07:28:25164 return true;
[email protected]367c5c1d2013-03-11 18:59:02165 GURL url(document.url());
166 // Empty scheme works as wildcard that matches any scheme,
167 if ((net::GetHostOrSpecFromURL(url) == host_) &&
168 (scheme_.empty() || scheme_ == url.scheme())) {
[email protected]40bd6582009-12-04 23:49:51169 webview->setZoomLevel(false, zoom_level_);
[email protected]367c5c1d2013-03-11 18:59:02170 }
[email protected]40bd6582009-12-04 23:49:51171 return true;
172 }
173
174 private:
[email protected]367c5c1d2013-03-11 18:59:02175 const std::string scheme_;
176 const std::string host_;
177 const double zoom_level_;
[email protected]40bd6582009-12-04 23:49:51178
179 DISALLOW_COPY_AND_ASSIGN(RenderViewZoomer);
180};
[email protected]0478d0162010-08-28 08:29:40181
[email protected]b2d98762012-09-03 17:04:06182std::string HostToCustomHistogramSuffix(const std::string& host) {
183 if (host == "mail.google.com")
184 return ".gmail";
185 if (host == "docs.google.com" || host == "drive.google.com")
186 return ".docs";
187 if (host == "plus.google.com")
188 return ".plus";
[email protected]007b3f82013-04-09 08:46:45189 return std::string();
[email protected]b2d98762012-09-03 17:04:06190}
[email protected]42f1d7822009-07-23 18:17:55191
[email protected]b2d98762012-09-03 17:04:06192void* CreateHistogram(
[email protected]d1b8fccc2011-08-03 01:20:13193 const char *name, int min, int max, size_t buckets) {
194 if (min <= 0)
195 min = 1;
[email protected]b2d98762012-09-03 17:04:06196 std::string histogram_name;
197 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
198 if (render_thread_impl) { // Can be null in tests.
199 histogram_name = render_thread_impl->
200 histogram_customizer()->ConvertToCustomHistogramName(name);
201 } else {
202 histogram_name = std::string(name);
203 }
[email protected]de415552013-01-23 04:12:17204 base::HistogramBase* histogram = base::Histogram::FactoryGet(
[email protected]b2d98762012-09-03 17:04:06205 histogram_name, min, max, buckets,
206 base::Histogram::kUmaTargetedHistogramFlag);
[email protected]d1b8fccc2011-08-03 01:20:13207 return histogram;
208}
209
[email protected]b2d98762012-09-03 17:04:06210void AddHistogramSample(void* hist, int sample) {
[email protected]d1b8fccc2011-08-03 01:20:13211 base::Histogram* histogram = static_cast<base::Histogram*>(hist);
212 histogram->Add(sample);
213}
214
[email protected]950f9ce22012-12-27 00:25:07215#if defined(ENABLE_WEBRTC)
[email protected]d936677a2013-04-19 08:49:03216const unsigned char* GetCategoryGroupEnabled(const char* category_group) {
217 return TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(category_group);
[email protected]da0f6952012-12-26 22:22:39218}
219
220void AddTraceEvent(char phase,
[email protected]d936677a2013-04-19 08:49:03221 const unsigned char* category_group_enabled,
[email protected]da0f6952012-12-26 22:22:39222 const char* name,
223 unsigned long long id,
224 int num_args,
225 const char** arg_names,
226 const unsigned char* arg_types,
227 const unsigned long long* arg_values,
228 unsigned char flags) {
[email protected]d936677a2013-04-19 08:49:03229 TRACE_EVENT_API_ADD_TRACE_EVENT(phase, category_group_enabled, name, id,
230 num_args, arg_names, arg_types, arg_values,
[email protected]7fceeab22013-05-03 15:40:47231 NULL, flags);
[email protected]da0f6952012-12-26 22:22:39232}
[email protected]950f9ce22012-12-27 00:25:07233#endif
[email protected]da0f6952012-12-26 22:22:39234
[email protected]b2d98762012-09-03 17:04:06235} // namespace
236
[email protected]fe476b02012-08-13 21:21:38237class RenderThreadImpl::GpuVDAContextLostCallback
238 : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
239 public:
240 GpuVDAContextLostCallback() {}
241 virtual ~GpuVDAContextLostCallback() {}
242 virtual void onContextLost() {
243 ChildThread::current()->message_loop()->PostTask(FROM_HERE, base::Bind(
244 &RenderThreadImpl::OnGpuVDAContextLoss));
245 }
246};
247
[email protected]00874dd2013-03-08 23:51:18248class RenderThreadImpl::RendererContextProviderCommandBuffer
249 : public ContextProviderCommandBuffer {
[email protected]e06e1122013-03-15 17:12:38250 public:
251 static scoped_refptr<RendererContextProviderCommandBuffer> Create() {
252 scoped_refptr<RendererContextProviderCommandBuffer> provider =
253 new RendererContextProviderCommandBuffer();
254 if (!provider->InitializeOnMainThread())
255 return NULL;
256 return provider;
257 }
258
[email protected]00874dd2013-03-08 23:51:18259 protected:
260 virtual ~RendererContextProviderCommandBuffer() {}
261
262 virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
[email protected]aa3174b2013-03-15 09:12:48263 CreateOffscreenContext3d() OVERRIDE {
[email protected]00874dd2013-03-08 23:51:18264 RenderThreadImpl* self = RenderThreadImpl::current();
265 DCHECK(self);
266 return self->CreateOffscreenContext3d().Pass();
267 }
268};
269
[email protected]b2d98762012-09-03 17:04:06270RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() {
271 custom_histograms_.insert("V8.MemoryExternalFragmentationTotal");
272 custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted");
273 custom_histograms_.insert("V8.MemoryHeapSampleTotalUsed");
274}
275
276RenderThreadImpl::HistogramCustomizer::~HistogramCustomizer() {}
277
278void RenderThreadImpl::HistogramCustomizer::RenderViewNavigatedToHost(
279 const std::string& host, size_t view_count) {
[email protected]9baee832012-12-10 11:07:15280 if (CommandLine::ForCurrentProcess()->HasSwitch(
281 switches::kDisableHistogramCustomizer)) {
282 return;
283 }
[email protected]b2d98762012-09-03 17:04:06284 // Check if all RenderViews are displaying a page from the same host. If there
285 // is only one RenderView, the common host is this view's host. If there are
286 // many, check if this one shares the common host of the other
287 // RenderViews. It's ok to not detect some cases where the RenderViews share a
288 // common host. This information is only used for producing custom histograms.
289 if (view_count == 1)
290 SetCommonHost(host);
291 else if (host != common_host_)
292 SetCommonHost(std::string());
293}
294
295std::string RenderThreadImpl::HistogramCustomizer::ConvertToCustomHistogramName(
296 const char* histogram_name) const {
297 std::string name(histogram_name);
298 if (!common_host_histogram_suffix_.empty() &&
299 custom_histograms_.find(name) != custom_histograms_.end())
300 name += common_host_histogram_suffix_;
301 return name;
302}
303
304void RenderThreadImpl::HistogramCustomizer::SetCommonHost(
305 const std::string& host) {
306 if (host != common_host_) {
307 common_host_ = host;
308 common_host_histogram_suffix_ = HostToCustomHistogramSuffix(host);
309 v8::V8::SetCreateHistogramFunction(CreateHistogram);
310 }
311}
312
[email protected]f1a29a02011-10-06 23:08:44313RenderThreadImpl* RenderThreadImpl::current() {
[email protected]526476902011-10-06 20:34:06314 return lazy_tls.Pointer()->Get();
315}
316
[email protected]42f1d7822009-07-23 18:17:55317// When we run plugins in process, we actually run them on the render thread,
318// which means that we need to make the render thread pump UI events.
[email protected]f1a29a02011-10-06 23:08:44319RenderThreadImpl::RenderThreadImpl() {
[email protected]42f1d7822009-07-23 18:17:55320 Init();
321}
322
[email protected]f1a29a02011-10-06 23:08:44323RenderThreadImpl::RenderThreadImpl(const std::string& channel_name)
[email protected]42f1d7822009-07-23 18:17:55324 : ChildThread(channel_name) {
325 Init();
326}
[email protected]5fa1c542009-05-05 20:36:07327
[email protected]f1a29a02011-10-06 23:08:44328void RenderThreadImpl::Init() {
329 TRACE_EVENT_BEGIN_ETW("RenderThreadImpl::Init", 0, "");
[email protected]a872ea1f2010-08-11 04:45:33330
[email protected]c7e948b42012-07-12 09:20:20331 v8::V8::SetCounterFunction(base::StatsTable::FindLocation);
332 v8::V8::SetCreateHistogramFunction(CreateHistogram);
333 v8::V8::SetAddHistogramSampleFunction(AddHistogramSample);
334
[email protected]d3f09092012-02-16 01:52:17335#if defined(OS_MACOSX) || defined(OS_ANDROID)
336 // On Mac and Android, the select popups are rendered by the browser.
[email protected]53c607c2011-03-21 23:19:04337 WebKit::WebView::setUseExternalPopupMenus(true);
338#endif
339
[email protected]94f9a0f682009-06-15 18:30:30340 lazy_tls.Pointer()->Set(this);
[email protected]b3e83de2012-02-07 03:33:28341
[email protected]2c62b562009-01-27 19:04:50342#if defined(OS_WIN)
[email protected]bdef78b52009-04-16 19:31:34343 // If you are running plugins in this thread you need COM active but in
344 // the normal case you don't.
[email protected]00c39612010-03-06 02:53:28345 if (RenderProcessImpl::InProcessPlugins())
[email protected]1a771262011-10-31 09:11:12346 initialize_com_.reset(new base::win::ScopedCOMInitializer());
[email protected]2c62b562009-01-27 19:04:50347#endif
initial.commit09911bf2008-07-26 23:55:29348
[email protected]06c694d2012-02-01 22:26:16349 // Register this object as the main thread.
350 ChildProcess::current()->set_main_thread(this);
351
[email protected]31f87132010-04-21 23:36:21352 // In single process the single process is all there is.
[email protected]80fc08c52010-03-09 07:43:50353 suspend_webkit_shared_timer_ = true;
354 notify_webkit_of_modal_loop_ = true;
[email protected]bee16aab2009-08-26 15:55:03355 widget_count_ = 0;
356 hidden_widget_count_ = 0;
[email protected]6593ae12011-11-14 12:09:44357 idle_notification_delay_in_ms_ = kInitialIdleHandlerDelayMs;
[email protected]1784b2f2011-11-24 10:53:48358 idle_notifications_to_skip_ = 0;
[email protected]70dee7e2013-05-29 18:28:30359 layout_test_mode_ = false;
[email protected]8d86fce2009-02-26 23:37:55360
[email protected]dcc72db2013-01-02 00:44:18361 appcache_dispatcher_.reset(new AppCacheDispatcher(Get()));
[email protected]1910fe82012-05-10 00:04:10362 dom_storage_dispatcher_.reset(new DomStorageDispatcher());
[email protected]dcc72db2013-01-02 00:44:18363 main_thread_indexed_db_dispatcher_.reset(new IndexedDBDispatcher());
[email protected]dd9241932010-02-24 19:23:13364
[email protected]d8cd8372012-03-09 10:49:51365 media_stream_center_ = NULL;
366
[email protected]017022b2009-07-27 23:06:34367 db_message_filter_ = new DBMessageFilter();
368 AddFilter(db_message_filter_.get());
[email protected]dd9241932010-02-24 19:23:13369
[email protected]4761cf12012-09-12 10:37:55370#if defined(ENABLE_WEBRTC)
[email protected]d936677a2013-04-19 08:49:03371 webrtc::SetupEventTracer(&GetCategoryGroupEnabled, &AddTraceEvent);
[email protected]af089972013-01-10 04:04:40372
373 peer_connection_tracker_.reset(new PeerConnectionTracker());
374 AddObserver(peer_connection_tracker_.get());
375
[email protected]e9ff79c2012-10-19 21:31:26376 p2p_socket_dispatcher_ = new P2PSocketDispatcher(GetIOMessageLoopProxy());
[email protected]4761cf12012-09-12 10:37:55377 AddFilter(p2p_socket_dispatcher_);
378#endif // defined(ENABLE_WEBRTC)
[email protected]80b161a2011-06-27 17:42:11379 vc_manager_ = new VideoCaptureImplManager();
380 AddFilter(vc_manager_->video_capture_message_filter());
[email protected]e25f4d72011-06-08 20:58:46381
[email protected]e0a938702013-02-25 21:15:56382 audio_input_message_filter_ =
383 new AudioInputMessageFilter(GetIOMessageLoopProxy());
[email protected]f7eb0a392011-07-12 10:19:51384 AddFilter(audio_input_message_filter_.get());
385
[email protected]e0a938702013-02-25 21:15:56386 audio_message_filter_ = new AudioMessageFilter(GetIOMessageLoopProxy());
[email protected]f7eb0a392011-07-12 10:19:51387 AddFilter(audio_message_filter_.get());
388
[email protected]31bfae72011-12-16 02:04:38389 AddFilter(new IndexedDBMessageFilter);
390
[email protected]373d6ca2013-05-14 21:15:06391#if defined(ENABLE_WEBRTC)
392 webrtc_logging_message_filter_ =
393 new WebRtcLoggingMessageFilter(GetIOMessageLoopProxy());
394 AddFilter(webrtc_logging_message_filter_.get());
395#endif
396
[email protected]e9ff79c2012-10-19 21:31:26397 GetContentClient()->renderer()->RenderThreadStarted();
[email protected]6779aa12011-03-29 17:32:24398
[email protected]302fe422012-06-11 14:49:11399 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
[email protected]e54ab492012-06-12 19:40:01400 if (command_line.HasSwitch(switches::kEnableGpuBenchmarking))
[email protected]e9ff79c2012-10-19 21:31:26401 RegisterExtension(GpuBenchmarkingExtension::Get());
[email protected]e54ab492012-06-12 19:40:01402
[email protected]a70ed8b32013-05-24 15:16:34403#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID))
[email protected]6941ac5c2013-02-07 03:59:56404 if (command_line.HasSwitch(switches::kEnableMemoryBenchmarking))
405 RegisterExtension(MemoryBenchmarkingExtension::Get());
[email protected]a70ed8b32013-05-24 15:16:34406#endif // USE_TCMALLOC
[email protected]6941ac5c2013-02-07 03:59:56407
[email protected]a8228252013-05-14 11:10:05408 if (command_line.HasSwitch(switches::kEnableSkiaBenchmarking)) {
409 LOG(WARNING) << "Enabling unsafe Skia benchmarking extension.";
410 RegisterExtension(SkiaBenchmarkingExtension::Get());
411 }
412
[email protected]fe476b02012-08-13 21:21:38413 context_lost_cb_.reset(new GpuVDAContextLostCallback());
414
[email protected]433df472012-03-07 20:33:39415 // Note that under Linux, the media library will normally already have
416 // been initialized by the Zygote before this instance became a Renderer.
[email protected]c42de732013-02-16 06:26:31417 base::FilePath media_path;
[email protected]e9ff79c2012-10-19 21:31:26418 PathService::Get(DIR_MEDIA_LIBS, &media_path);
[email protected]433df472012-03-07 20:33:39419 if (!media_path.empty())
420 media::InitializeMediaLibrary(media_path);
421
[email protected]f1a29a02011-10-06 23:08:44422 TRACE_EVENT_END_ETW("RenderThreadImpl::Init", 0, "");
initial.commit09911bf2008-07-26 23:55:29423}
424
[email protected]f1a29a02011-10-06 23:08:44425RenderThreadImpl::~RenderThreadImpl() {
[email protected]ce79d8512013-04-22 22:44:41426}
427
428void RenderThreadImpl::Shutdown() {
[email protected]1223d6ef2011-03-28 16:47:50429 FOR_EACH_OBSERVER(
430 RenderProcessObserver, observers_, OnRenderProcessShutdown());
431
[email protected]12cbfda32010-01-30 01:04:25432 // Wait for all databases to be closed.
[email protected]59383c782013-04-17 16:43:27433 if (web_database_observer_impl_)
[email protected]2b437e232010-04-02 01:30:08434 web_database_observer_impl_->WaitForAllDatabasesToClose();
[email protected]12cbfda32010-01-30 01:04:25435
[email protected]8d86fce2009-02-26 23:37:55436 // Shutdown in reverse of the initialization order.
[email protected]59383c782013-04-17 16:43:27437 if (devtools_agent_message_filter_) {
[email protected]b146d6d2012-09-11 10:20:05438 RemoveFilter(devtools_agent_message_filter_.get());
439 devtools_agent_message_filter_ = NULL;
440 }
[email protected]82622452011-07-22 09:57:20441
[email protected]f7eb0a392011-07-12 10:19:51442 RemoveFilter(audio_input_message_filter_.get());
443 audio_input_message_filter_ = NULL;
444
445 RemoveFilter(audio_message_filter_.get());
446 audio_message_filter_ = NULL;
447
[email protected]80b161a2011-06-27 17:42:11448 RemoveFilter(vc_manager_->video_capture_message_filter());
449
[email protected]017022b2009-07-27 23:06:34450 RemoveFilter(db_message_filter_.get());
451 db_message_filter_ = NULL;
[email protected]12cbfda32010-01-30 01:04:25452
[email protected]c6a7b862010-08-20 22:19:38453 // Shutdown the file thread if it's running.
[email protected]59383c782013-04-17 16:43:27454 if (file_thread_)
[email protected]c6a7b862010-08-20 22:19:38455 file_thread_->Stop();
456
[email protected]59383c782013-04-17 16:43:27457 if (compositor_output_surface_filter_) {
[email protected]23d2b7e2012-08-14 00:34:09458 RemoveFilter(compositor_output_surface_filter_.get());
459 compositor_output_surface_filter_ = NULL;
460 }
[email protected]1842fe22012-08-13 23:24:35461
[email protected]79a92b52013-04-08 19:09:02462 compositor_thread_.reset();
[email protected]59383c782013-04-17 16:43:27463 if (input_handler_manager_) {
[email protected]ea5f70a2013-03-07 12:30:36464 RemoveFilter(input_handler_manager_->GetMessageFilter());
465 input_handler_manager_.reset();
[email protected]a9fb30aa2011-10-06 06:58:46466 }
467
[email protected]59383c782013-04-17 16:43:27468 if (webkit_platform_support_)
[email protected]9291ed12009-07-23 17:33:22469 WebKit::shutdown();
[email protected]9291ed12009-07-23 17:33:22470
[email protected]94f9a0f682009-06-15 18:30:30471 lazy_tls.Pointer()->Set(NULL);
[email protected]8fd8de92008-08-12 23:50:30472
[email protected]8d86fce2009-02-26 23:37:55473 // TODO(port)
[email protected]2c62b562009-01-27 19:04:50474#if defined(OS_WIN)
initial.commit09911bf2008-07-26 23:55:29475 // Clean up plugin channels before this thread goes away.
[email protected]099587b72011-09-20 00:40:50476 NPChannelBase::CleanupChannels();
[email protected]2c62b562009-01-27 19:04:50477#endif
[email protected]00874dd2013-03-08 23:51:18478
479 // Leak shared contexts on other threads, as we can not get to the correct
480 // thread to destroy them.
481 if (shared_contexts_compositor_thread_)
482 shared_contexts_compositor_thread_->set_leak_on_destroy();
initial.commit09911bf2008-07-26 23:55:29483}
484
[email protected]f1a29a02011-10-06 23:08:44485bool RenderThreadImpl::Send(IPC::Message* msg) {
[email protected]f23d4da92010-11-24 21:36:14486 // Certain synchronous messages cannot always be processed synchronously by
487 // the browser, e.g., Chrome frame communicating with the embedding browser.
[email protected]80fc08c52010-03-09 07:43:50488 // This could cause a complete hang of Chrome if a windowed plug-in is trying
489 // to communicate with the renderer thread since the browser's UI thread
490 // could be stuck (within a Windows API call) trying to synchronously
491 // communicate with the plug-in. The remedy is to pump messages on this
[email protected]f23d4da92010-11-24 21:36:14492 // thread while the browser is processing this request. This creates an
493 // opportunity for re-entrancy into WebKit, so we need to take care to disable
494 // callbacks, timers, and pending network loads that could trigger such
495 // callbacks.
[email protected]38b592902011-04-16 02:08:42496 bool pumping_events = false;
[email protected]80fc08c52010-03-09 07:43:50497 if (msg->is_sync()) {
498 if (msg->is_caller_pumping_messages()) {
499 pumping_events = true;
500 } else {
[email protected]38b592902011-04-16 02:08:42501 if ((msg->type() == ViewHostMsg_GetCookies::ID ||
502 msg->type() == ViewHostMsg_GetRawCookies::ID ||
503 msg->type() == ViewHostMsg_CookiesEnabled::ID) &&
[email protected]e9ff79c2012-10-19 21:31:26504 GetContentClient()->renderer()->
[email protected]38b592902011-04-16 02:08:42505 ShouldPumpEventsDuringCookieMessage()) {
506 pumping_events = true;
[email protected]80fc08c52010-03-09 07:43:50507 }
508 }
[email protected]c1f50aa2010-02-18 03:46:57509 }
510
[email protected]80fc08c52010-03-09 07:43:50511 bool suspend_webkit_shared_timer = true; // default value
512 std::swap(suspend_webkit_shared_timer, suspend_webkit_shared_timer_);
[email protected]c1f50aa2010-02-18 03:46:57513
[email protected]80fc08c52010-03-09 07:43:50514 bool notify_webkit_of_modal_loop = true; // default value
515 std::swap(notify_webkit_of_modal_loop, notify_webkit_of_modal_loop_);
516
[email protected]c48de1a2012-11-02 19:06:56517 int render_view_id = MSG_ROUTING_NONE;
[email protected]c1f50aa2010-02-18 03:46:57518
519 if (pumping_events) {
[email protected]80fc08c52010-03-09 07:43:50520 if (suspend_webkit_shared_timer)
[email protected]8d6cba42011-09-02 10:05:19521 webkit_platform_support_->SuspendSharedTimer();
[email protected]c1f50aa2010-02-18 03:46:57522
[email protected]39065d012010-07-09 11:22:46523 if (notify_webkit_of_modal_loop)
[email protected]c1f50aa2010-02-18 03:46:57524 WebView::willEnterModalLoop();
[email protected]c1f50aa2010-02-18 03:46:57525
[email protected]bae061f72013-04-26 16:22:29526 RenderViewImpl* render_view =
527 RenderViewImpl::FromRoutingID(msg->routing_id());
528 if (render_view) {
529 render_view_id = msg->routing_id();
[email protected]c1f50aa2010-02-18 03:46:57530 PluginChannelHost::Broadcast(
[email protected]c48de1a2012-11-02 19:06:56531 new PluginMsg_SignalModalDialogEvent(render_view_id));
[email protected]c1f50aa2010-02-18 03:46:57532 }
533 }
534
535 bool rv = ChildThread::Send(msg);
536
537 if (pumping_events) {
[email protected]c48de1a2012-11-02 19:06:56538 if (render_view_id != MSG_ROUTING_NONE) {
[email protected]c1f50aa2010-02-18 03:46:57539 PluginChannelHost::Broadcast(
[email protected]c48de1a2012-11-02 19:06:56540 new PluginMsg_ResetModalDialogEvent(render_view_id));
[email protected]c1f50aa2010-02-18 03:46:57541 }
542
[email protected]39065d012010-07-09 11:22:46543 if (notify_webkit_of_modal_loop)
[email protected]c1f50aa2010-02-18 03:46:57544 WebView::didExitModalLoop();
[email protected]c1f50aa2010-02-18 03:46:57545
[email protected]80fc08c52010-03-09 07:43:50546 if (suspend_webkit_shared_timer)
[email protected]8d6cba42011-09-02 10:05:19547 webkit_platform_support_->ResumeSharedTimer();
[email protected]c1f50aa2010-02-18 03:46:57548 }
549
550 return rv;
551}
552
[email protected]9e7154122013-05-30 23:11:04553base::MessageLoop* RenderThreadImpl::GetMessageLoop() {
[email protected]526476902011-10-06 20:34:06554 return message_loop();
555}
556
[email protected]f1a29a02011-10-06 23:08:44557IPC::SyncChannel* RenderThreadImpl::GetChannel() {
[email protected]526476902011-10-06 20:34:06558 return channel();
559}
560
[email protected]f1a29a02011-10-06 23:08:44561std::string RenderThreadImpl::GetLocale() {
[email protected]526476902011-10-06 20:34:06562 // The browser process should have passed the locale to the renderer via the
[email protected]dfd53652012-10-25 00:20:02563 // --lang command line flag.
[email protected]526476902011-10-06 20:34:06564 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
565 const std::string& lang =
566 parsed_command_line.GetSwitchValueASCII(switches::kLang);
[email protected]dfd53652012-10-25 00:20:02567 DCHECK(!lang.empty());
[email protected]526476902011-10-06 20:34:06568 return lang;
569}
570
[email protected]07bb6332012-01-21 01:07:57571IPC::SyncMessageFilter* RenderThreadImpl::GetSyncMessageFilter() {
572 return sync_message_filter();
573}
574
[email protected]96191d52012-05-17 01:37:11575scoped_refptr<base::MessageLoopProxy>
576 RenderThreadImpl::GetIOMessageLoopProxy() {
577 return ChildProcess::current()->io_message_loop_proxy();
578}
579
[email protected]c47317e2012-06-20 22:35:31580void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) {
[email protected]c1f50aa2010-02-18 03:46:57581 widget_count_++;
582 return ChildThread::AddRoute(routing_id, listener);
583}
584
[email protected]f1a29a02011-10-06 23:08:44585void RenderThreadImpl::RemoveRoute(int32 routing_id) {
[email protected]c1f50aa2010-02-18 03:46:57586 widget_count_--;
587 return ChildThread::RemoveRoute(routing_id);
588}
589
[email protected]77fc9b92011-10-15 16:20:37590int RenderThreadImpl::GenerateRoutingID() {
591 int routing_id = MSG_ROUTING_NONE;
592 Send(new ViewHostMsg_GenerateRoutingID(&routing_id));
593 return routing_id;
594}
595
[email protected]f1a29a02011-10-06 23:08:44596void RenderThreadImpl::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
[email protected]42f1d7822009-07-23 18:17:55597 channel()->AddFilter(filter);
598}
599
[email protected]f1a29a02011-10-06 23:08:44600void RenderThreadImpl::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
[email protected]42f1d7822009-07-23 18:17:55601 channel()->RemoveFilter(filter);
602}
603
[email protected]f1a29a02011-10-06 23:08:44604void RenderThreadImpl::SetOutgoingMessageFilter(
[email protected]526476902011-10-06 20:34:06605 IPC::ChannelProxy::OutgoingMessageFilter* filter) {
606}
607
[email protected]e9ff79c2012-10-19 21:31:26608void RenderThreadImpl::AddObserver(RenderProcessObserver* observer) {
[email protected]526476902011-10-06 20:34:06609 observers_.AddObserver(observer);
610}
611
[email protected]e9ff79c2012-10-19 21:31:26612void RenderThreadImpl::RemoveObserver(RenderProcessObserver* observer) {
[email protected]526476902011-10-06 20:34:06613 observers_.RemoveObserver(observer);
614}
615
[email protected]359dfa32011-10-12 01:10:15616void RenderThreadImpl::SetResourceDispatcherDelegate(
[email protected]e9ff79c2012-10-19 21:31:26617 ResourceDispatcherDelegate* delegate) {
[email protected]359dfa32011-10-12 01:10:15618 resource_dispatcher()->set_delegate(delegate);
619}
620
[email protected]f1a29a02011-10-06 23:08:44621void RenderThreadImpl::WidgetHidden() {
[email protected]bee16aab2009-08-26 15:55:03622 DCHECK(hidden_widget_count_ < widget_count_);
[email protected]4a3dab22009-11-11 17:36:50623 hidden_widget_count_++;
[email protected]6779aa12011-03-29 17:32:24624
[email protected]e9ff79c2012-10-19 21:31:26625 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) {
[email protected]6779aa12011-03-29 17:32:24626 return;
627 }
628
629 if (widget_count_ && hidden_widget_count_ == widget_count_)
[email protected]6593ae12011-11-14 12:09:44630 ScheduleIdleHandler(kInitialIdleHandlerDelayMs);
[email protected]bee16aab2009-08-26 15:55:03631}
632
[email protected]f1a29a02011-10-06 23:08:44633void RenderThreadImpl::WidgetRestored() {
[email protected]61a9b2d82010-02-26 00:31:08634 DCHECK_GT(hidden_widget_count_, 0);
[email protected]bee16aab2009-08-26 15:55:03635 hidden_widget_count_--;
[email protected]e9ff79c2012-10-19 21:31:26636 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) {
[email protected]6779aa12011-03-29 17:32:24637 return;
638 }
[email protected]bee16aab2009-08-26 15:55:03639
[email protected]1784b2f2011-11-24 10:53:48640 ScheduleIdleHandler(kLongIdleHandlerDelayMs);
[email protected]e4be2dd2010-12-14 00:44:39641}
642
[email protected]78b86f9a2013-05-03 23:33:40643static void AdjustRuntimeFeatureDefaultsForPlatform() {
644#if defined(OS_ANDROID) && !defined(GOOGLE_TV)
[email protected]5bf1223a52013-05-14 21:42:31645 WebRuntimeFeatures::enableWebKitMediaSource(false);
[email protected]16c242d2013-05-31 23:56:47646 WebRuntimeFeatures::enableLegacyEncryptedMedia(false);
647 WebRuntimeFeatures::enableEncryptedMedia(false);
[email protected]78b86f9a2013-05-03 23:33:40648#endif
649
650#if defined(OS_ANDROID)
651 WebRuntimeFeatures::enableWebAudio(false);
[email protected]78b86f9a2013-05-03 23:33:40652 // Android does not support the Gamepad API.
653 WebRuntimeFeatures::enableGamepad(false);
654 // input[type=week] in Android is incomplete. crbug.com/135938
655 WebRuntimeFeatures::enableInputTypeWeek(false);
[email protected]09128282013-05-17 16:42:52656 // Android does not have support for PagePopup
657 WebRuntimeFeatures::enablePagePopup(false);
[email protected]0338ce792013-05-24 11:15:59658 // datalist on Android is not enabled
659 WebRuntimeFeatures::enableDataListElement(false);
[email protected]78b86f9a2013-05-03 23:33:40660#endif
661}
662
663static void AdjustRuntimeFeaturesFromArgs(const CommandLine& command_line) {
664 if (command_line.HasSwitch(switches::kDisableDatabases))
665 WebRuntimeFeatures::enableDatabase(false);
666
667 if (command_line.HasSwitch(switches::kDisableApplicationCache))
668 WebRuntimeFeatures::enableApplicationCache(false);
669
670 if (command_line.HasSwitch(switches::kDisableDesktopNotifications))
671 WebRuntimeFeatures::enableNotifications(false);
672
673 if (command_line.HasSwitch(switches::kDisableLocalStorage))
674 WebRuntimeFeatures::enableLocalStorage(false);
675
676 if (command_line.HasSwitch(switches::kDisableSessionStorage))
677 WebRuntimeFeatures::enableSessionStorage(false);
678
679 if (command_line.HasSwitch(switches::kDisableGeolocation))
680 WebRuntimeFeatures::enableGeolocation(false);
681
[email protected]85dd7ca2013-05-30 23:53:00682#if defined(OS_ANDROID) && !defined(GOOGLE_TV)
683 if (command_line.HasSwitch(switches::kEnableWebKitMediaSource))
684 WebRuntimeFeatures::enableWebKitMediaSource(true);
685#else
[email protected]5bf1223a52013-05-14 21:42:31686 if (command_line.HasSwitch(switches::kDisableWebKitMediaSource))
687 WebRuntimeFeatures::enableWebKitMediaSource(false);
[email protected]78b86f9a2013-05-03 23:33:40688#endif
689
690#if defined(OS_ANDROID)
[email protected]3bd0aab2013-05-30 20:07:49691 if (command_line.HasSwitch(switches::kDisableWebRTC)) {
[email protected]78b86f9a2013-05-03 23:33:40692 WebRuntimeFeatures::enableMediaStream(false);
[email protected]78b86f9a2013-05-03 23:33:40693 WebRuntimeFeatures::enablePeerConnection(false);
[email protected]3bd0aab2013-05-30 20:07:49694 }
695
696 if (!command_line.HasSwitch(switches::kEnableSpeechRecognition))
697 WebRuntimeFeatures::enableScriptedSpeech(false);
698
699 if (command_line.HasSwitch(switches::kEnableWebAudio))
700 WebRuntimeFeatures::enableWebAudio(true);
701#else
702 if (command_line.HasSwitch(switches::kDisableWebAudio))
703 WebRuntimeFeatures::enableWebAudio(false);
[email protected]78b86f9a2013-05-03 23:33:40704#endif
705
706 if (command_line.HasSwitch(switches::kDisableFullScreen))
[email protected]d2414bb2013-05-10 21:29:27707 WebRuntimeFeatures::enableFullscreen(false);
[email protected]78b86f9a2013-05-03 23:33:40708
[email protected]16c242d2013-05-31 23:56:47709 if (command_line.HasSwitch(switches::kEnableEncryptedMedia))
710 WebRuntimeFeatures::enableEncryptedMedia(true);
711
712 if (command_line.HasSwitch(switches::kDisableLegacyEncryptedMedia))
713 WebRuntimeFeatures::enableLegacyEncryptedMedia(false);
[email protected]78b86f9a2013-05-03 23:33:40714
[email protected]78b86f9a2013-05-03 23:33:40715 if (command_line.HasSwitch(switches::kEnableWebMIDI))
716 WebRuntimeFeatures::enableWebMIDI(true);
717
718 if (command_line.HasSwitch(switches::kEnableDeviceMotion))
719 WebRuntimeFeatures::enableDeviceMotion(true);
720
721 if (command_line.HasSwitch(switches::kDisableDeviceOrientation))
722 WebRuntimeFeatures::enableDeviceOrientation(false);
723
724 if (command_line.HasSwitch(switches::kDisableSpeechInput))
725 WebRuntimeFeatures::enableSpeechInput(false);
726
727 if (command_line.HasSwitch(switches::kDisableFileSystem))
728 WebRuntimeFeatures::enableFileSystem(false);
729
730 if (command_line.HasSwitch(switches::kDisableJavaScriptI18NAPI))
731 WebRuntimeFeatures::enableJavaScriptI18NAPI(false);
732
[email protected]78b86f9a2013-05-03 23:33:40733 if (command_line.HasSwitch(switches::kEnableExperimentalCanvasFeatures))
734 WebRuntimeFeatures::enableExperimentalCanvasFeatures(true);
735
736 if (command_line.HasSwitch(switches::kEnableSpeechSynthesis))
737 WebRuntimeFeatures::enableSpeechSynthesis(true);
738}
739
[email protected]f1a29a02011-10-06 23:08:44740void RenderThreadImpl::EnsureWebKitInitialized() {
[email protected]59383c782013-04-17 16:43:27741 if (webkit_platform_support_)
[email protected]d1b8fccc2011-08-03 01:20:13742 return;
743
[email protected]8d6cba42011-09-02 10:05:19744 webkit_platform_support_.reset(new RendererWebKitPlatformSupportImpl);
745 WebKit::initialize(webkit_platform_support_.get());
[email protected]00fccb42012-12-11 00:09:59746 WebKit::setSharedWorkerRepository(
747 webkit_platform_support_.get()->sharedWorkerRepository());
[email protected]2a23d3f52013-01-08 01:20:24748 WebKit::setIDBFactory(
749 webkit_platform_support_.get()->idbFactory());
[email protected]d1b8fccc2011-08-03 01:20:13750
[email protected]cd7ce3be2012-09-10 05:19:41751 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
[email protected]cd7ce3be2012-09-10 05:19:41752
[email protected]0f21e8582013-01-11 11:06:56753 bool enable = command_line.HasSwitch(switches::kEnableThreadedCompositing);
[email protected]72787e392012-03-23 05:55:43754 if (enable) {
[email protected]913d99a2013-05-31 07:16:07755#if defined(OS_ANDROID)
756 if (SynchronousCompositorFactory* factory =
757 SynchronousCompositorFactory::GetInstance())
758 compositor_message_loop_proxy_ =
759 factory->GetCompositorMessageLoop();
760#endif
761 if (!compositor_message_loop_proxy_) {
[email protected]ea5f70a2013-03-07 12:30:36762 compositor_thread_.reset(new base::Thread("Compositor"));
763 compositor_thread_->Start();
[email protected]b38864d2013-05-24 14:42:36764#if defined(OS_ANDROID)
765 compositor_thread_->SetPriority(base::kThreadPriority_Display);
766#endif
[email protected]ea5f70a2013-03-07 12:30:36767 compositor_message_loop_proxy_ =
768 compositor_thread_->message_loop_proxy();
[email protected]d293572a2013-05-23 18:50:45769 compositor_message_loop_proxy_->PostTask(
770 FROM_HERE,
771 base::Bind(base::IgnoreResult(&ThreadRestrictions::SetIOAllowed),
772 false));
[email protected]ea5f70a2013-03-07 12:30:36773 }
774
[email protected]913d99a2013-05-31 07:16:07775 input_handler_manager_.reset(
776 new InputHandlerManager(this, compositor_message_loop_proxy_));
777 AddFilter(input_handler_manager_->GetMessageFilter());
[email protected]a458504b2012-07-23 19:57:06778 }
[email protected]a9fb30aa2011-10-06 06:58:46779
[email protected]ea5f70a2013-03-07 12:30:36780 scoped_refptr<base::MessageLoopProxy> output_surface_loop;
[email protected]7f1f63f2013-03-07 06:07:29781 if (enable)
[email protected]ea5f70a2013-03-07 12:30:36782 output_surface_loop = compositor_message_loop_proxy_;
[email protected]7f1f63f2013-03-07 06:07:29783 else
784 output_surface_loop = base::MessageLoopProxy::current();
[email protected]1842fe22012-08-13 23:24:35785
[email protected]7f1f63f2013-03-07 06:07:29786 compositor_output_surface_filter_ =
787 CompositorOutputSurface::CreateFilter(output_surface_loop);
[email protected]1842fe22012-08-13 23:24:35788 AddFilter(compositor_output_surface_filter_.get());
789
[email protected]d1b8fccc2011-08-03 01:20:13790 WebScriptController::enableV8SingleThreadMode();
791
[email protected]58436a12012-03-21 17:10:26792 RenderThreadImpl::RegisterSchemes();
793
[email protected]d1b8fccc2011-08-03 01:20:13794 webkit_glue::EnableWebCoreLogChannels(
795 command_line.GetSwitchValueASCII(switches::kWebCoreLogChannels));
796
[email protected]fa1c17e42012-03-06 22:29:54797 web_database_observer_impl_.reset(
798 new WebDatabaseObserverImpl(sync_message_filter()));
[email protected]d1b8fccc2011-08-03 01:20:13799 WebKit::WebDatabase::setObserver(web_database_observer_impl_.get());
800
[email protected]d1bf64b2013-05-06 12:13:53801 WebRuntimeFeatures::enableStableFeatures(true);
[email protected]d1b8fccc2011-08-03 01:20:13802
[email protected]d1bf64b2013-05-06 12:13:53803 if (command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures))
804 WebRuntimeFeatures::enableExperimentalFeatures(true);
[email protected]4ae41b42012-12-06 21:59:03805
[email protected]78b86f9a2013-05-03 23:33:40806 AdjustRuntimeFeatureDefaultsForPlatform();
807 AdjustRuntimeFeaturesFromArgs(command_line);
[email protected]d3e7aea22013-01-09 08:47:53808
[email protected]205855d2013-04-24 01:42:18809 // Enabled by default for testing.
810 // TODO(urvang): Go back to using the command-line option after a few days.
[email protected]78b86f9a2013-05-03 23:33:40811 // https://code.google.com/p/chromium/issues/detail?id=234437
[email protected]205855d2013-04-24 01:42:18812 WebRuntimeFeatures::enableWebPInAcceptHeader(true);
[email protected]8027acd2013-04-18 08:35:15813
[email protected]78b86f9a2013-05-03 23:33:40814 if (!media::IsMediaLibraryInitialized()) {
815 WebRuntimeFeatures::enableMediaPlayer(false);
816 WebRuntimeFeatures::enableWebAudio(false);
817 }
[email protected]7a06d282013-05-03 04:39:33818
[email protected]d1b8fccc2011-08-03 01:20:13819 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, WebKitInitialized());
[email protected]1784b2f2011-11-24 10:53:48820
[email protected]b146d6d2012-09-11 10:20:05821 devtools_agent_message_filter_ = new DevToolsAgentFilter();
822 AddFilter(devtools_agent_message_filter_.get());
823
[email protected]e9ff79c2012-10-19 21:31:26824 if (GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden())
[email protected]1784b2f2011-11-24 10:53:48825 ScheduleIdleHandler(kLongIdleHandlerDelayMs);
[email protected]d1b8fccc2011-08-03 01:20:13826}
827
[email protected]58436a12012-03-21 17:10:26828void RenderThreadImpl::RegisterSchemes() {
829 // swappedout: pages should not be accessible, and should also
830 // be treated as empty documents that can commit synchronously.
831 WebString swappedout_scheme(ASCIIToUTF16(chrome::kSwappedOutScheme));
832 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(swappedout_scheme);
833 WebSecurityPolicy::registerURLSchemeAsEmptyDocument(swappedout_scheme);
834}
835
[email protected]f1a29a02011-10-06 23:08:44836void RenderThreadImpl::RecordUserMetrics(const std::string& action) {
[email protected]526476902011-10-06 20:34:06837 Send(new ViewHostMsg_UserMetricsRecordAction(action));
838}
839
[email protected]fb79aa22012-12-13 01:12:13840scoped_ptr<base::SharedMemory>
[email protected]3f892832013-01-11 03:23:59841 RenderThreadImpl::HostAllocateSharedMemoryBuffer(size_t size) {
842 if (size > static_cast<size_t>(std::numeric_limits<int>::max()))
843 return scoped_ptr<base::SharedMemory>();
844
[email protected]fb79aa22012-12-13 01:12:13845 base::SharedMemoryHandle handle;
846 bool success;
847 IPC::Message* message =
848 new ChildProcessHostMsg_SyncAllocateSharedMemory(size, &handle);
849
850 // Allow calling this from the compositor thread.
[email protected]dd32b1272013-05-04 14:17:11851 if (base::MessageLoop::current() == message_loop())
[email protected]fb79aa22012-12-13 01:12:13852 success = ChildThread::Send(message);
853 else
854 success = sync_message_filter()->Send(message);
855
856 if (!success)
857 return scoped_ptr<base::SharedMemory>();
858
859 if (!base::SharedMemory::IsHandleValid(handle))
860 return scoped_ptr<base::SharedMemory>();
861
862 return scoped_ptr<base::SharedMemory>(new base::SharedMemory(handle, false));
[email protected]00614a82011-10-07 22:39:31863}
864
[email protected]f1a29a02011-10-06 23:08:44865void RenderThreadImpl::RegisterExtension(v8::Extension* extension) {
[email protected]526476902011-10-06 20:34:06866 WebScriptController::registerExtension(extension);
[email protected]526476902011-10-06 20:34:06867}
868
[email protected]6593ae12011-11-14 12:09:44869void RenderThreadImpl::ScheduleIdleHandler(int64 initial_delay_ms) {
870 idle_notification_delay_in_ms_ = initial_delay_ms;
[email protected]526476902011-10-06 20:34:06871 idle_timer_.Stop();
872 idle_timer_.Start(FROM_HERE,
[email protected]6593ae12011-11-14 12:09:44873 base::TimeDelta::FromMilliseconds(initial_delay_ms),
[email protected]f1a29a02011-10-06 23:08:44874 this, &RenderThreadImpl::IdleHandler);
[email protected]526476902011-10-06 20:34:06875}
876
[email protected]f1a29a02011-10-06 23:08:44877void RenderThreadImpl::IdleHandler() {
[email protected]1784b2f2011-11-24 10:53:48878 bool run_in_foreground_tab = (widget_count_ > hidden_widget_count_) &&
[email protected]e9ff79c2012-10-19 21:31:26879 GetContentClient()->renderer()->
[email protected]1784b2f2011-11-24 10:53:48880 RunIdleHandlerWhenWidgetsHidden();
881 if (run_in_foreground_tab) {
882 IdleHandlerInForegroundTab();
883 return;
884 }
[email protected]237a14852012-04-28 02:56:38885
886 base::allocator::ReleaseFreeMemory();
[email protected]526476902011-10-06 20:34:06887
888 v8::V8::IdleNotification();
889
890 // Schedule next invocation.
[email protected]6593ae12011-11-14 12:09:44891 // Dampen the delay using the algorithm (if delay is in seconds):
[email protected]526476902011-10-06 20:34:06892 // delay = delay + 1 / (delay + 2)
893 // Using floor(delay) has a dampening effect such as:
894 // 1s, 1, 1, 2, 2, 2, 2, 3, 3, ...
[email protected]6593ae12011-11-14 12:09:44895 // If the delay is in milliseconds, the above formula is equivalent to:
896 // delay_ms / 1000 = delay_ms / 1000 + 1 / (delay_ms / 1000 + 2)
897 // which is equivalent to
898 // delay_ms = delay_ms + 1000*1000 / (delay_ms + 2000).
899 // Note that idle_notification_delay_in_ms_ would be reset to
900 // kInitialIdleHandlerDelayMs in RenderThreadImpl::WidgetHidden.
901 ScheduleIdleHandler(idle_notification_delay_in_ms_ +
902 1000000 / (idle_notification_delay_in_ms_ + 2000));
[email protected]526476902011-10-06 20:34:06903
904 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, IdleNotification());
905}
906
[email protected]1784b2f2011-11-24 10:53:48907void RenderThreadImpl::IdleHandlerInForegroundTab() {
908 // Increase the delay in the same way as in IdleHandler,
909 // but make it periodic by reseting it once it is too big.
910 int64 new_delay_ms = idle_notification_delay_in_ms_ +
911 1000000 / (idle_notification_delay_in_ms_ + 2000);
912 if (new_delay_ms >= kLongIdleHandlerDelayMs)
913 new_delay_ms = kShortIdleHandlerDelayMs;
914
[email protected]1784b2f2011-11-24 10:53:48915 if (idle_notifications_to_skip_ > 0) {
916 idle_notifications_to_skip_--;
[email protected]7e967f82011-12-01 09:35:14917 } else {
[email protected]a47105c832011-12-07 17:24:30918 int cpu_usage = 0;
[email protected]7e967f82011-12-01 09:35:14919 Send(new ViewHostMsg_GetCPUUsage(&cpu_usage));
[email protected]1393c4a2012-02-07 10:12:58920 // Idle notification hint roughly specifies the expected duration of the
921 // idle pause. We set it proportional to the idle timer delay.
922 int idle_hint = static_cast<int>(new_delay_ms / 10);
[email protected]d7e59252012-03-06 22:26:02923 if (cpu_usage < kIdleCPUUsageThresholdInPercents) {
[email protected]237a14852012-04-28 02:56:38924 base::allocator::ReleaseFreeMemory();
[email protected]d7e59252012-03-06 22:26:02925 if (v8::V8::IdleNotification(idle_hint)) {
926 // V8 finished collecting garbage.
927 new_delay_ms = kLongIdleHandlerDelayMs;
928 }
[email protected]1784b2f2011-11-24 10:53:48929 }
930 }
[email protected]1784b2f2011-11-24 10:53:48931 ScheduleIdleHandler(new_delay_ms);
932}
933
[email protected]6593ae12011-11-14 12:09:44934int64 RenderThreadImpl::GetIdleNotificationDelayInMs() const {
935 return idle_notification_delay_in_ms_;
[email protected]526476902011-10-06 20:34:06936}
937
[email protected]6593ae12011-11-14 12:09:44938void RenderThreadImpl::SetIdleNotificationDelayInMs(
939 int64 idle_notification_delay_in_ms) {
940 idle_notification_delay_in_ms_ = idle_notification_delay_in_ms;
[email protected]4a7d6392011-09-19 20:55:08941}
942
[email protected]a1a7ff32012-07-19 14:03:51943void RenderThreadImpl::ToggleWebKitSharedTimer(bool suspend) {
944 if (suspend_webkit_shared_timer_) {
945 EnsureWebKitInitialized();
946 if (suspend) {
947 webkit_platform_support_->SuspendSharedTimer();
948 } else {
949 webkit_platform_support_->ResumeSharedTimer();
950 }
951 }
952}
953
954void RenderThreadImpl::UpdateHistograms(int sequence_number) {
955 child_histogram_message_filter()->SendHistograms(sequence_number);
956}
957
[email protected]b02f5902012-12-19 07:33:00958bool RenderThreadImpl::ResolveProxy(const GURL& url, std::string* proxy_list) {
959 bool result = false;
960 Send(new ViewHostMsg_ResolveProxy(url, &result, proxy_list));
961 return result;
962}
963
[email protected]1784b2f2011-11-24 10:53:48964void RenderThreadImpl::PostponeIdleNotification() {
965 idle_notifications_to_skip_ = 2;
966}
967
[email protected]fe476b02012-08-13 21:21:38968/* static */
969void RenderThreadImpl::OnGpuVDAContextLoss() {
970 RenderThreadImpl* self = RenderThreadImpl::current();
971 DCHECK(self);
[email protected]59383c782013-04-17 16:43:27972 if (!self->gpu_vda_context3d_)
[email protected]fe476b02012-08-13 21:21:38973 return;
[email protected]ea5f70a2013-03-07 12:30:36974 if (self->compositor_message_loop_proxy()) {
975 self->compositor_message_loop_proxy()->DeleteSoon(
[email protected]fe476b02012-08-13 21:21:38976 FROM_HERE, self->gpu_vda_context3d_.release());
977 } else {
978 self->gpu_vda_context3d_.reset();
[email protected]3b2afc32012-06-18 21:31:16979 }
[email protected]fe476b02012-08-13 21:21:38980}
981
982WebGraphicsContext3DCommandBufferImpl*
983RenderThreadImpl::GetGpuVDAContext3D() {
[email protected]59383c782013-04-17 16:43:27984 if (!gpu_vda_context3d_) {
[email protected]3b2afc32012-06-18 21:31:16985 gpu_vda_context3d_.reset(
986 WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
[email protected]d1a9e062012-07-13 00:45:14987 this, WebKit::WebGraphicsContext3D::Attributes(),
988 GURL("chrome://gpu/RenderThreadImpl::GetGpuVDAContext3D")));
[email protected]59383c782013-04-17 16:43:27989 if (gpu_vda_context3d_)
[email protected]fde3e2f2012-08-14 06:51:37990 gpu_vda_context3d_->setContextLostCallback(context_lost_cb_.get());
[email protected]3b2afc32012-06-18 21:31:16991 }
[email protected]fe476b02012-08-13 21:21:38992 return gpu_vda_context3d_.get();
[email protected]3b2afc32012-06-18 21:31:16993}
994
[email protected]c29b7ff2013-03-06 03:51:04995scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
996RenderThreadImpl::CreateOffscreenContext3d() {
997 WebKit::WebGraphicsContext3D::Attributes attributes;
998 attributes.shareResources = true;
999 attributes.depth = false;
1000 attributes.stencil = false;
1001 attributes.antialias = false;
1002 attributes.noAutomaticFlushes = true;
1003
1004 return make_scoped_ptr(
1005 WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
1006 this,
1007 attributes,
1008 GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext3d")));
1009}
1010
[email protected]a45c46e2013-03-07 01:04:461011scoped_refptr<ContextProviderCommandBuffer>
[email protected]c29b7ff2013-03-06 03:51:041012RenderThreadImpl::OffscreenContextProviderForMainThread() {
[email protected]e06e1122013-03-15 17:12:381013 DCHECK(IsMainThread());
1014
[email protected]c29b7ff2013-03-06 03:51:041015 if (!shared_contexts_main_thread_ ||
[email protected]e06e1122013-03-15 17:12:381016 shared_contexts_main_thread_->DestroyedOnMainThread()) {
1017 shared_contexts_main_thread_ =
1018 RendererContextProviderCommandBuffer::Create();
1019 if (shared_contexts_main_thread_ &&
1020 !shared_contexts_main_thread_->BindToCurrentThread())
1021 shared_contexts_main_thread_ = NULL;
1022 }
[email protected]c29b7ff2013-03-06 03:51:041023 return shared_contexts_main_thread_;
1024}
1025
[email protected]a45c46e2013-03-07 01:04:461026scoped_refptr<ContextProviderCommandBuffer>
[email protected]c29b7ff2013-03-06 03:51:041027RenderThreadImpl::OffscreenContextProviderForCompositorThread() {
[email protected]e06e1122013-03-15 17:12:381028 DCHECK(IsMainThread());
1029
[email protected]c29b7ff2013-03-06 03:51:041030 if (!shared_contexts_compositor_thread_ ||
1031 shared_contexts_compositor_thread_->DestroyedOnMainThread()) {
1032 shared_contexts_compositor_thread_ =
[email protected]e06e1122013-03-15 17:12:381033 RendererContextProviderCommandBuffer::Create();
[email protected]c29b7ff2013-03-06 03:51:041034 }
1035 return shared_contexts_compositor_thread_;
1036}
1037
[email protected]e9ff79c2012-10-19 21:31:261038AudioRendererMixerManager* RenderThreadImpl::GetAudioRendererMixerManager() {
[email protected]59383c782013-04-17 16:43:271039 if (!audio_renderer_mixer_manager_) {
[email protected]3958e972012-07-17 00:25:411040 audio_renderer_mixer_manager_.reset(new AudioRendererMixerManager(
[email protected]563d665f2013-02-01 04:42:391041 GetAudioHardwareConfig()));
[email protected]3958e972012-07-17 00:25:411042 }
1043
1044 return audio_renderer_mixer_manager_.get();
1045}
1046
[email protected]563d665f2013-02-01 04:42:391047media::AudioHardwareConfig* RenderThreadImpl::GetAudioHardwareConfig() {
1048 if (!audio_hardware_config_) {
[email protected]06ea4f7c2013-03-13 20:36:511049 media::AudioParameters input_params;
1050 media::AudioParameters output_params;
[email protected]563d665f2013-02-01 04:42:391051 Send(new ViewHostMsg_GetAudioHardwareConfig(
[email protected]06ea4f7c2013-03-13 20:36:511052 &input_params, &output_params));
[email protected]563d665f2013-02-01 04:42:391053
1054 audio_hardware_config_.reset(new media::AudioHardwareConfig(
[email protected]06ea4f7c2013-03-13 20:36:511055 input_params, output_params));
[email protected]563d665f2013-02-01 04:42:391056 audio_message_filter_->SetAudioHardwareConfig(audio_hardware_config_.get());
1057 }
1058
1059 return audio_hardware_config_.get();
1060}
1061
[email protected]4a7d6392011-09-19 20:55:081062#if defined(OS_WIN)
[email protected]feb32372012-11-21 01:14:561063void RenderThreadImpl::PreCacheFontCharacters(const LOGFONT& log_font,
1064 const string16& str) {
1065 Send(new ViewHostMsg_PreCacheFontCharacters(log_font, str));
1066}
1067
[email protected]f1a29a02011-10-06 23:08:441068void RenderThreadImpl::PreCacheFont(const LOGFONT& log_font) {
[email protected]526476902011-10-06 20:34:061069 Send(new ChildProcessHostMsg_PreCacheFont(log_font));
[email protected]79fff822011-09-20 03:33:211070}
1071
[email protected]f1a29a02011-10-06 23:08:441072void RenderThreadImpl::ReleaseCachedFonts() {
[email protected]526476902011-10-06 20:34:061073 Send(new ChildProcessHostMsg_ReleaseCachedFonts());
[email protected]4a7d6392011-09-19 20:55:081074}
[email protected]526476902011-10-06 20:34:061075
[email protected]4a7d6392011-09-19 20:55:081076#endif // OS_WIN
1077
[email protected]988aacf2012-02-12 18:10:031078bool RenderThreadImpl::IsWebFrameValid(WebKit::WebFrame* web_frame) {
1079 if (!web_frame)
[email protected]4761cf12012-09-12 10:37:551080 return false; // We must be shutting down.
[email protected]988aacf2012-02-12 18:10:031081
1082 RenderViewImpl* render_view = RenderViewImpl::FromWebView(web_frame->view());
1083 if (!render_view)
[email protected]4761cf12012-09-12 10:37:551084 return false; // We must be shutting down.
[email protected]988aacf2012-02-12 18:10:031085
1086 return true;
1087}
1088
[email protected]b3e83de2012-02-07 03:33:281089bool RenderThreadImpl::IsMainThread() {
1090 return !!current();
1091}
1092
1093bool RenderThreadImpl::IsIOThread() {
[email protected]dd32b1272013-05-04 14:17:111094 return base::MessageLoop::current() ==
1095 ChildProcess::current()->io_message_loop();
[email protected]b3e83de2012-02-07 03:33:281096}
1097
[email protected]9e7154122013-05-30 23:11:041098base::MessageLoop* RenderThreadImpl::GetMainLoop() {
[email protected]b3e83de2012-02-07 03:33:281099 return message_loop();
1100}
[email protected]5b040e592012-02-10 02:56:101101
1102scoped_refptr<base::MessageLoopProxy> RenderThreadImpl::GetIOLoopProxy() {
[email protected]b3e83de2012-02-07 03:33:281103 return ChildProcess::current()->io_message_loop_proxy();
1104}
1105
1106base::WaitableEvent* RenderThreadImpl::GetShutDownEvent() {
1107 return ChildProcess::current()->GetShutDownEvent();
1108}
1109
1110scoped_ptr<base::SharedMemory> RenderThreadImpl::AllocateSharedMemory(
[email protected]3f892832013-01-11 03:23:591111 size_t size) {
[email protected]fb79aa22012-12-13 01:12:131112 return scoped_ptr<base::SharedMemory>(
1113 HostAllocateSharedMemoryBuffer(size));
[email protected]b3e83de2012-02-07 03:33:281114}
1115
1116int32 RenderThreadImpl::CreateViewCommandBuffer(
1117 int32 surface_id, const GPUCreateCommandBufferConfig& init_params) {
[email protected]d13f35d2012-05-18 02:28:151118 TRACE_EVENT1("gpu",
1119 "RenderThreadImpl::CreateViewCommandBuffer",
1120 "surface_id",
1121 surface_id);
1122
[email protected]b3e83de2012-02-07 03:33:281123 int32 route_id = MSG_ROUTING_NONE;
[email protected]8b10b332012-02-29 21:02:141124 IPC::Message* message = new GpuHostMsg_CreateViewCommandBuffer(
[email protected]b3e83de2012-02-07 03:33:281125 surface_id,
1126 init_params,
[email protected]8b10b332012-02-29 21:02:141127 &route_id);
1128
1129 // Allow calling this from the compositor thread.
[email protected]dd32b1272013-05-04 14:17:111130 if (base::MessageLoop::current() == message_loop())
[email protected]8b10b332012-02-29 21:02:141131 ChildThread::Send(message);
1132 else
1133 sync_message_filter()->Send(message);
1134
[email protected]b3e83de2012-02-07 03:33:281135 return route_id;
1136}
1137
[email protected]09d50362012-10-18 20:54:371138void RenderThreadImpl::CreateImage(
1139 gfx::PluginWindowHandle window,
1140 int32 image_id,
1141 const CreateImageCallback& callback) {
1142 NOTREACHED();
1143}
1144
1145void RenderThreadImpl::DeleteImage(int32 image_id, int32 sync_point) {
1146 NOTREACHED();
1147}
1148
[email protected]f1a29a02011-10-06 23:08:441149void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() {
[email protected]526476902011-10-06 20:34:061150 suspend_webkit_shared_timer_ = false;
1151}
1152
[email protected]f1a29a02011-10-06 23:08:441153void RenderThreadImpl::DoNotNotifyWebKitOfModalLoop() {
[email protected]526476902011-10-06 20:34:061154 notify_webkit_of_modal_loop_ = false;
1155}
1156
[email protected]367c5c1d2013-03-11 18:59:021157void RenderThreadImpl::OnSetZoomLevelForCurrentURL(const std::string& scheme,
1158 const std::string& host,
[email protected]f1a29a02011-10-06 23:08:441159 double zoom_level) {
[email protected]367c5c1d2013-03-11 18:59:021160 RenderViewZoomer zoomer(scheme, host, zoom_level);
[email protected]e9ff79c2012-10-19 21:31:261161 RenderView::ForEach(&zoomer);
[email protected]526476902011-10-06 20:34:061162}
1163
[email protected]f1a29a02011-10-06 23:08:441164bool RenderThreadImpl::OnControlMessageReceived(const IPC::Message& msg) {
[email protected]1223d6ef2011-03-28 16:47:501165 ObserverListBase<RenderProcessObserver>::Iterator it(observers_);
1166 RenderProcessObserver* observer;
1167 while ((observer = it.GetNext()) != NULL) {
1168 if (observer->OnControlMessageReceived(msg))
1169 return true;
1170 }
1171
[email protected]70c19a932010-05-14 12:59:111172 // Some messages are handled by delegates.
[email protected]1910fe82012-05-10 00:04:101173 if (appcache_dispatcher_->OnMessageReceived(msg) ||
1174 dom_storage_dispatcher_->OnMessageReceived(msg)) {
[email protected]a95986a82010-12-24 06:19:281175 return true;
[email protected]1910fe82012-05-10 00:04:101176 }
[email protected]1edc16b82009-04-07 17:45:541177
[email protected]a95986a82010-12-24 06:19:281178 bool handled = true;
[email protected]f1a29a02011-10-06 23:08:441179 IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg)
[email protected]9d797f32010-04-23 07:17:541180 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForCurrentURL,
1181 OnSetZoomLevelForCurrentURL)
[email protected]8930d472009-02-21 08:05:281182 // TODO(port): removed from render_messages_internal.h;
1183 // is there a new non-windows message I should add here?
1184 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView)
[email protected]3e267192011-03-25 01:55:451185 IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache)
[email protected]6eac57a2011-07-12 21:15:091186 IPC_MESSAGE_HANDLER(ViewMsg_NetworkStateChanged, OnNetworkStateChanged)
[email protected]b69934e2011-10-29 02:51:521187 IPC_MESSAGE_HANDLER(ViewMsg_TempCrashWithData, OnTempCrashWithData)
[email protected]44363382013-03-12 07:22:471188 IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended,
1189 OnSetWebKitSharedTimersSuspended)
[email protected]a95986a82010-12-24 06:19:281190 IPC_MESSAGE_UNHANDLED(handled = false)
[email protected]8930d472009-02-21 08:05:281191 IPC_END_MESSAGE_MAP()
[email protected]a95986a82010-12-24 06:19:281192 return handled;
initial.commit09911bf2008-07-26 23:55:291193}
1194
[email protected]f1a29a02011-10-06 23:08:441195void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) {
[email protected]90a3fbb12009-02-28 01:13:471196 EnsureWebKitInitialized();
[email protected]be645db2009-02-06 20:36:331197 // When bringing in render_view, also bring in webkit's glue and jsbindings.
[email protected]6cd7c6b2012-10-25 03:26:231198 RenderViewImpl::Create(
[email protected]6cd7c6b2012-10-25 03:26:231199 params.opener_route_id,
1200 params.renderer_preferences,
1201 params.web_preferences,
1202 new SharedRenderViewCounter(0),
1203 params.view_id,
[email protected]227692c52013-05-31 22:43:041204 params.main_frame_routing_id,
[email protected]6cd7c6b2012-10-25 03:26:231205 params.surface_id,
1206 params.session_storage_namespace_id,
1207 params.frame_name,
1208 false,
1209 params.swapped_out,
1210 params.next_page_id,
1211 params.screen_info,
[email protected]34bb3ac2013-03-08 02:41:281212 params.accessibility_mode,
1213 params.allow_partial_swap);
[email protected]7f874dec2009-02-06 01:48:271214}
[email protected]4274e582009-01-27 22:09:561215
[email protected]f1a29a02011-10-06 23:08:441216GpuChannelHost* RenderThreadImpl::EstablishGpuChannelSync(
[email protected]e9ff79c2012-10-19 21:31:261217 CauseForGpuLaunch cause_for_gpu_launch) {
[email protected]d13f35d2012-05-18 02:28:151218 TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync");
1219
[email protected]59383c782013-04-17 16:43:271220 if (gpu_channel_) {
[email protected]1082b1d2010-03-30 00:31:221221 // Do nothing if we already have a GPU channel or are already
1222 // establishing one.
[email protected]e09cee42010-11-09 01:50:081223 if (gpu_channel_->state() == GpuChannelHost::kUnconnected ||
1224 gpu_channel_->state() == GpuChannelHost::kConnected)
[email protected]b42a9f62011-06-08 20:36:041225 return GetGpuChannel();
[email protected]6217d392010-03-25 22:08:351226
1227 // Recreate the channel if it has been lost.
[email protected]894e8fc2012-02-24 13:29:501228 gpu_channel_ = NULL;
[email protected]6217d392010-03-25 22:08:351229 }
1230
[email protected]6217d392010-03-25 22:08:351231 // Ask the browser for the channel name.
[email protected]894e8fc2012-02-24 13:29:501232 int client_id = 0;
[email protected]b42a9f62011-06-08 20:36:041233 IPC::ChannelHandle channel_handle;
[email protected]d7b5cc72013-05-23 20:05:001234 gpu::GPUInfo gpu_info;
[email protected]b42a9f62011-06-08 20:36:041235 if (!Send(new GpuHostMsg_EstablishGpuChannel(cause_for_gpu_launch,
[email protected]894e8fc2012-02-24 13:29:501236 &client_id,
[email protected]b42a9f62011-06-08 20:36:041237 &channel_handle,
[email protected]b42a9f62011-06-08 20:36:041238 &gpu_info)) ||
[email protected]8bc550e2012-02-07 11:05:561239#if defined(OS_POSIX)
1240 channel_handle.socket.fd == -1 ||
1241#endif
[email protected]cd0bd792012-04-14 00:52:161242 channel_handle.name.empty()) {
[email protected]b42a9f62011-06-08 20:36:041243 // Otherwise cancel the connection.
1244 gpu_channel_ = NULL;
1245 return NULL;
1246 }
[email protected]6217d392010-03-25 22:08:351247
[email protected]03dc8882012-03-08 23:46:291248 gpu_channel_ = new GpuChannelHost(this, 0, client_id);
[email protected]b42a9f62011-06-08 20:36:041249 gpu_channel_->set_gpu_info(gpu_info);
[email protected]e9ff79c2012-10-19 21:31:261250 GetContentClient()->SetGpuInfo(gpu_info);
[email protected]b42a9f62011-06-08 20:36:041251
1252 // Connect to the GPU process if a channel name was received.
[email protected]cd0bd792012-04-14 00:52:161253 gpu_channel_->Connect(channel_handle);
[email protected]b42a9f62011-06-08 20:36:041254
[email protected]f9a2b2fe2010-07-15 21:13:231255 return GetGpuChannel();
[email protected]3bf4d532010-03-27 00:23:341256}
1257
[email protected]d8cd8372012-03-09 10:49:511258WebKit::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter(
1259 WebKit::WebMediaStreamCenterClient* client) {
[email protected]d9da9582013-01-31 04:59:051260#if defined(OS_ANDROID)
[email protected]ce585bf2013-03-14 16:25:161261 if (CommandLine::ForCurrentProcess()->HasSwitch(
1262 switches::kDisableWebRTC))
[email protected]d9da9582013-01-31 04:59:051263 return NULL;
1264#endif
1265
[email protected]d8cd8372012-03-09 10:49:511266#if defined(ENABLE_WEBRTC)
[email protected]68e5fee2013-02-18 10:04:221267 if (!media_stream_center_) {
1268 media_stream_center_ = GetContentClient()->renderer()
1269 ->OverrideCreateWebMediaStreamCenter(client);
1270 if (!media_stream_center_) {
1271 media_stream_center_ = new MediaStreamCenter(
1272 client, GetMediaStreamDependencyFactory());
1273 }
1274 }
[email protected]d8cd8372012-03-09 10:49:511275#endif
1276 return media_stream_center_;
1277}
1278
[email protected]6ee10bd2012-09-13 09:01:531279MediaStreamDependencyFactory*
1280RenderThreadImpl::GetMediaStreamDependencyFactory() {
1281#if defined(ENABLE_WEBRTC)
[email protected]59383c782013-04-17 16:43:271282 if (!media_stream_factory_) {
[email protected]6ee10bd2012-09-13 09:01:531283 media_stream_factory_.reset(new MediaStreamDependencyFactory(
1284 vc_manager_, p2p_socket_dispatcher_));
1285 }
1286#endif
1287 return media_stream_factory_.get();
1288}
1289
[email protected]f1a29a02011-10-06 23:08:441290GpuChannelHost* RenderThreadImpl::GetGpuChannel() {
[email protected]59383c782013-04-17 16:43:271291 if (!gpu_channel_)
[email protected]6217d392010-03-25 22:08:351292 return NULL;
1293
[email protected]e09cee42010-11-09 01:50:081294 if (gpu_channel_->state() != GpuChannelHost::kConnected)
[email protected]6217d392010-03-25 22:08:351295 return NULL;
1296
1297 return gpu_channel_.get();
1298}
1299
[email protected]f1a29a02011-10-06 23:08:441300void RenderThreadImpl::OnPurgePluginListCache(bool reload_pages) {
[email protected]f5e4b9bf2009-10-08 00:59:591301 EnsureWebKitInitialized();
[email protected]b547fd42009-04-23 23:16:271302 // The call below will cause a GetPlugins call with refresh=true, but at this
1303 // point we already know that the browser has refreshed its list, so disable
1304 // refresh temporarily to prevent each renderer process causing the list to be
1305 // regenerated.
[email protected]a70b4352012-07-31 22:34:531306 webkit_platform_support_->set_plugin_refresh_allowed(false);
[email protected]b78e168b2009-09-21 22:05:451307 WebKit::resetPluginCache(reload_pages);
[email protected]a70b4352012-07-31 22:34:531308 webkit_platform_support_->set_plugin_refresh_allowed(true);
[email protected]3b48dbc2012-01-06 16:34:171309
1310 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, PluginListChanged());
[email protected]b547fd42009-04-23 23:16:271311}
[email protected]85c55dc2009-11-06 03:05:461312
[email protected]f1a29a02011-10-06 23:08:441313void RenderThreadImpl::OnNetworkStateChanged(bool online) {
[email protected]6eac57a2011-07-12 21:15:091314 EnsureWebKitInitialized();
1315 WebNetworkStateNotifier::setOnLine(online);
1316}
1317
[email protected]b69934e2011-10-29 02:51:521318void RenderThreadImpl::OnTempCrashWithData(const GURL& data) {
[email protected]e9ff79c2012-10-19 21:31:261319 GetContentClient()->SetActiveURL(data);
[email protected]b69934e2011-10-29 02:51:521320 CHECK(false);
1321}
1322
[email protected]44363382013-03-12 07:22:471323void RenderThreadImpl::OnSetWebKitSharedTimersSuspended(bool suspend) {
1324 ToggleWebKitSharedTimer(suspend);
1325}
1326
[email protected]c6a7b862010-08-20 22:19:381327scoped_refptr<base::MessageLoopProxy>
[email protected]f1a29a02011-10-06 23:08:441328RenderThreadImpl::GetFileThreadMessageLoopProxy() {
[email protected]dd32b1272013-05-04 14:17:111329 DCHECK(message_loop() == base::MessageLoop::current());
[email protected]59383c782013-04-17 16:43:271330 if (!file_thread_) {
[email protected]c6a7b862010-08-20 22:19:381331 file_thread_.reset(new base::Thread("Renderer::FILE"));
1332 file_thread_->Start();
1333 }
1334 return file_thread_->message_loop_proxy();
1335}
[email protected]e9ff79c2012-10-19 21:31:261336
[email protected]107c0532013-02-06 02:34:091337void RenderThreadImpl::SetFlingCurveParameters(
1338 const std::vector<float>& new_touchpad,
1339 const std::vector<float>& new_touchscreen) {
1340 webkit_platform_support_->SetFlingCurveParameters(new_touchpad,
1341 new_touchscreen);
1342
1343}
1344
[email protected]e9ff79c2012-10-19 21:31:261345} // namespace content