OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_thread_impl.h" | 5 #include "content/renderer/render_thread_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <map> | 9 #include <map> |
10 #include <utility> | 10 #include <utility> |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 void CreateFrame(int32_t frame_routing_id, | 341 void CreateFrame(int32_t frame_routing_id, |
342 mojom::FrameRequest frame_request, | 342 mojom::FrameRequest frame_request, |
343 mojom::FrameHostPtr frame_host) override { | 343 mojom::FrameHostPtr frame_host) override { |
344 // TODO(morrita): This is for investigating http://crbug.com/415059 and | 344 // TODO(morrita): This is for investigating http://crbug.com/415059 and |
345 // should be removed once it is fixed. | 345 // should be removed once it is fixed. |
346 CHECK_LT(routing_id_highmark_, frame_routing_id); | 346 CHECK_LT(routing_id_highmark_, frame_routing_id); |
347 routing_id_highmark_ = frame_routing_id; | 347 routing_id_highmark_ = frame_routing_id; |
348 | 348 |
349 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id); | 349 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id); |
350 // We can receive a GetServiceProviderForFrame message for a frame not yet | 350 // We can receive a GetServiceProviderForFrame message for a frame not yet |
351 // created due to a race between the message and a ViewMsg_New IPC that | 351 // created due to a race between the message and a |
352 // triggers creation of the RenderFrame we want. | 352 // mojom::Renderer::CreateView IPC that triggers creation of the RenderFrame |
| 353 // we want. |
353 if (!frame) { | 354 if (!frame) { |
354 RenderThreadImpl::current()->RegisterPendingFrameCreate( | 355 RenderThreadImpl::current()->RegisterPendingFrameCreate( |
355 frame_routing_id, std::move(frame_request), std::move(frame_host)); | 356 frame_routing_id, std::move(frame_request), std::move(frame_host)); |
356 return; | 357 return; |
357 } | 358 } |
358 | 359 |
359 frame->Bind(std::move(frame_request), std::move(frame_host)); | 360 frame->Bind(std::move(frame_request), std::move(frame_host)); |
360 } | 361 } |
361 | 362 |
362 private: | 363 private: |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 std::unique_ptr<blink::scheduler::RendererScheduler> scheduler, | 600 std::unique_ptr<blink::scheduler::RendererScheduler> scheduler, |
600 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) | 601 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) |
601 : ChildThreadImpl(Options::Builder() | 602 : ChildThreadImpl(Options::Builder() |
602 .InBrowserProcess(params) | 603 .InBrowserProcess(params) |
603 .UseMojoChannel(true) | 604 .UseMojoChannel(true) |
604 .AutoStartMojoShellConnection(false) | 605 .AutoStartMojoShellConnection(false) |
605 .ConnectToBrowser(true) | 606 .ConnectToBrowser(true) |
606 .Build()), | 607 .Build()), |
607 renderer_scheduler_(std::move(scheduler)), | 608 renderer_scheduler_(std::move(scheduler)), |
608 time_zone_monitor_binding_(this), | 609 time_zone_monitor_binding_(this), |
609 categorized_worker_pool_(new CategorizedWorkerPool()) { | 610 categorized_worker_pool_(new CategorizedWorkerPool()), |
| 611 renderer_binding_(this) { |
610 Init(resource_task_queue); | 612 Init(resource_task_queue); |
611 } | 613 } |
612 | 614 |
613 // When we run plugins in process, we actually run them on the render thread, | 615 // When we run plugins in process, we actually run them on the render thread, |
614 // which means that we need to make the render thread pump UI events. | 616 // which means that we need to make the render thread pump UI events. |
615 RenderThreadImpl::RenderThreadImpl( | 617 RenderThreadImpl::RenderThreadImpl( |
616 std::unique_ptr<base::MessageLoop> main_message_loop, | 618 std::unique_ptr<base::MessageLoop> main_message_loop, |
617 std::unique_ptr<blink::scheduler::RendererScheduler> scheduler) | 619 std::unique_ptr<blink::scheduler::RendererScheduler> scheduler) |
618 : ChildThreadImpl(Options::Builder() | 620 : ChildThreadImpl(Options::Builder() |
619 .UseMojoChannel(true) | 621 .UseMojoChannel(true) |
620 .AutoStartMojoShellConnection(false) | 622 .AutoStartMojoShellConnection(false) |
621 .ConnectToBrowser(true) | 623 .ConnectToBrowser(true) |
622 .Build()), | 624 .Build()), |
623 renderer_scheduler_(std::move(scheduler)), | 625 renderer_scheduler_(std::move(scheduler)), |
624 time_zone_monitor_binding_(this), | 626 time_zone_monitor_binding_(this), |
625 main_message_loop_(std::move(main_message_loop)), | 627 main_message_loop_(std::move(main_message_loop)), |
626 categorized_worker_pool_(new CategorizedWorkerPool()) { | 628 categorized_worker_pool_(new CategorizedWorkerPool()), |
| 629 renderer_binding_(this) { |
627 scoped_refptr<base::SingleThreadTaskRunner> test_task_counter; | 630 scoped_refptr<base::SingleThreadTaskRunner> test_task_counter; |
628 Init(test_task_counter); | 631 Init(test_task_counter); |
629 } | 632 } |
630 | 633 |
631 void RenderThreadImpl::Init( | 634 void RenderThreadImpl::Init( |
632 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) { | 635 scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) { |
633 TRACE_EVENT0("startup", "RenderThreadImpl::Init"); | 636 TRACE_EVENT0("startup", "RenderThreadImpl::Init"); |
634 | 637 |
635 base::trace_event::TraceLog::GetInstance()->SetThreadSortIndex( | 638 base::trace_event::TraceLog::GetInstance()->SetThreadSortIndex( |
636 base::PlatformThread::CurrentId(), | 639 base::PlatformThread::CurrentId(), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 switches::kUseMusInRenderer)) { | 733 switches::kUseMusInRenderer)) { |
731 CreateRenderWidgetWindowTreeClientFactory(GetMojoShellConnection()); | 734 CreateRenderWidgetWindowTreeClientFactory(GetMojoShellConnection()); |
732 } | 735 } |
733 #endif | 736 #endif |
734 | 737 |
735 // Must be called before RenderThreadStarted() below. | 738 // Must be called before RenderThreadStarted() below. |
736 StartMojoShellConnection(); | 739 StartMojoShellConnection(); |
737 | 740 |
738 GetContentClient()->renderer()->RenderThreadStarted(); | 741 GetContentClient()->renderer()->RenderThreadStarted(); |
739 | 742 |
| 743 GetAssociatedInterfaceRegistry()->AddInterface( |
| 744 base::Bind(&RenderThreadImpl::OnRendererInterfaceRequest, |
| 745 base::Unretained(this))); |
| 746 |
740 InitSkiaEventTracer(); | 747 InitSkiaEventTracer(); |
741 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | 748 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
742 skia::SkiaMemoryDumpProvider::GetInstance(), "Skia", nullptr); | 749 skia::SkiaMemoryDumpProvider::GetInstance(), "Skia", nullptr); |
743 | 750 |
744 const base::CommandLine& command_line = | 751 const base::CommandLine& command_line = |
745 *base::CommandLine::ForCurrentProcess(); | 752 *base::CommandLine::ForCurrentProcess(); |
746 | 753 |
747 #if defined(ENABLE_IPC_FUZZER) | 754 #if defined(ENABLE_IPC_FUZZER) |
748 if (command_line.HasSwitch(switches::kIpcDumpDirectory)) { | 755 if (command_line.HasSwitch(switches::kIpcDumpDirectory)) { |
749 base::FilePath dump_directory = | 756 base::FilePath dump_directory = |
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1559 audio_renderer_mixer_manager_ = AudioRendererMixerManager::Create(); | 1566 audio_renderer_mixer_manager_ = AudioRendererMixerManager::Create(); |
1560 } | 1567 } |
1561 | 1568 |
1562 return audio_renderer_mixer_manager_.get(); | 1569 return audio_renderer_mixer_manager_.get(); |
1563 } | 1570 } |
1564 | 1571 |
1565 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() { | 1572 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() { |
1566 return ChildProcess::current()->GetShutDownEvent(); | 1573 return ChildProcess::current()->GetShutDownEvent(); |
1567 } | 1574 } |
1568 | 1575 |
| 1576 void RenderThreadImpl::OnAssociatedInterfaceRequest( |
| 1577 const std::string& name, |
| 1578 mojo::ScopedInterfaceEndpointHandle handle) { |
| 1579 associated_interfaces_.BindRequest(name, std::move(handle)); |
| 1580 } |
| 1581 |
1569 bool RenderThreadImpl::IsGpuRasterizationForced() { | 1582 bool RenderThreadImpl::IsGpuRasterizationForced() { |
1570 return is_gpu_rasterization_forced_; | 1583 return is_gpu_rasterization_forced_; |
1571 } | 1584 } |
1572 | 1585 |
1573 bool RenderThreadImpl::IsGpuRasterizationEnabled() { | 1586 bool RenderThreadImpl::IsGpuRasterizationEnabled() { |
1574 return is_gpu_rasterization_enabled_; | 1587 return is_gpu_rasterization_enabled_; |
1575 } | 1588 } |
1576 | 1589 |
1577 bool RenderThreadImpl::IsAsyncWorkerContextEnabled() { | 1590 bool RenderThreadImpl::IsAsyncWorkerContextEnabled() { |
1578 return is_async_worker_context_enabled_; | 1591 return is_async_worker_context_enabled_; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 embedded_worker_dispatcher_->OnMessageReceived(msg)) { | 1731 embedded_worker_dispatcher_->OnMessageReceived(msg)) { |
1719 return true; | 1732 return true; |
1720 } | 1733 } |
1721 | 1734 |
1722 bool handled = true; | 1735 bool handled = true; |
1723 IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg) | 1736 IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg) |
1724 IPC_MESSAGE_HANDLER(FrameMsg_NewFrame, OnCreateNewFrame) | 1737 IPC_MESSAGE_HANDLER(FrameMsg_NewFrame, OnCreateNewFrame) |
1725 IPC_MESSAGE_HANDLER(FrameMsg_NewFrameProxy, OnCreateNewFrameProxy) | 1738 IPC_MESSAGE_HANDLER(FrameMsg_NewFrameProxy, OnCreateNewFrameProxy) |
1726 // TODO(port): removed from render_messages_internal.h; | 1739 // TODO(port): removed from render_messages_internal.h; |
1727 // is there a new non-windows message I should add here? | 1740 // is there a new non-windows message I should add here? |
1728 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView) | |
1729 IPC_MESSAGE_HANDLER(ViewMsg_NetworkConnectionChanged, | 1741 IPC_MESSAGE_HANDLER(ViewMsg_NetworkConnectionChanged, |
1730 OnNetworkConnectionChanged) | 1742 OnNetworkConnectionChanged) |
1731 IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateNewSharedWorker) | 1743 IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateNewSharedWorker) |
1732 #if defined(OS_ANDROID) | 1744 #if defined(OS_ANDROID) |
1733 IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended, | 1745 IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended, |
1734 OnSetWebKitSharedTimersSuspended) | 1746 OnSetWebKitSharedTimersSuspended) |
1735 #endif | 1747 #endif |
1736 #if defined(OS_MACOSX) | 1748 #if defined(OS_MACOSX) |
1737 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme) | 1749 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme) |
1738 IPC_MESSAGE_HANDLER(ViewMsg_SystemColorsChanged, OnSystemColorsChanged) | 1750 IPC_MESSAGE_HANDLER(ViewMsg_SystemColorsChanged, OnSystemColorsChanged) |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1805 base::IntToString(render_view_routing_id)); | 1817 base::IntToString(render_view_routing_id)); |
1806 base::debug::SetCrashKeyValue("newproxy_opener_id", | 1818 base::debug::SetCrashKeyValue("newproxy_opener_id", |
1807 base::IntToString(opener_routing_id)); | 1819 base::IntToString(opener_routing_id)); |
1808 base::debug::SetCrashKeyValue("newproxy_parent_id", | 1820 base::debug::SetCrashKeyValue("newproxy_parent_id", |
1809 base::IntToString(parent_routing_id)); | 1821 base::IntToString(parent_routing_id)); |
1810 RenderFrameProxy::CreateFrameProxy(routing_id, render_view_routing_id, | 1822 RenderFrameProxy::CreateFrameProxy(routing_id, render_view_routing_id, |
1811 opener_routing_id, parent_routing_id, | 1823 opener_routing_id, parent_routing_id, |
1812 replicated_state); | 1824 replicated_state); |
1813 } | 1825 } |
1814 | 1826 |
1815 void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) { | |
1816 CompositorDependencies* compositor_deps = this; | |
1817 // When bringing in render_view, also bring in webkit's glue and jsbindings. | |
1818 RenderViewImpl::Create(compositor_deps, params, false); | |
1819 } | |
1820 | |
1821 scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() { | 1827 scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() { |
1822 TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync"); | 1828 TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync"); |
1823 | 1829 |
1824 if (gpu_channel_) { | 1830 if (gpu_channel_) { |
1825 // Do nothing if we already have a GPU channel or are already | 1831 // Do nothing if we already have a GPU channel or are already |
1826 // establishing one. | 1832 // establishing one. |
1827 if (!gpu_channel_->IsLost()) | 1833 if (!gpu_channel_->IsLost()) |
1828 return gpu_channel_; | 1834 return gpu_channel_; |
1829 | 1835 |
1830 // Recreate the channel if it has been lost. | 1836 // Recreate the channel if it has been lost. |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1977 sync_compositor_message_filter_.get(), | 1983 sync_compositor_message_filter_.get(), |
1978 std::move(frame_swap_message_queue)); | 1984 std::move(frame_swap_message_queue)); |
1979 } | 1985 } |
1980 #endif | 1986 #endif |
1981 return base::WrapUnique(new RendererCompositorFrameSink( | 1987 return base::WrapUnique(new RendererCompositorFrameSink( |
1982 routing_id, compositor_frame_sink_id, | 1988 routing_id, compositor_frame_sink_id, |
1983 CreateExternalBeginFrameSource(routing_id), std::move(context_provider), | 1989 CreateExternalBeginFrameSource(routing_id), std::move(context_provider), |
1984 std::move(worker_context_provider), std::move(frame_swap_message_queue))); | 1990 std::move(worker_context_provider), std::move(frame_swap_message_queue))); |
1985 } | 1991 } |
1986 | 1992 |
| 1993 AssociatedInterfaceRegistry* |
| 1994 RenderThreadImpl::GetAssociatedInterfaceRegistry() { |
| 1995 return &associated_interfaces_; |
| 1996 } |
| 1997 |
1987 std::unique_ptr<cc::SwapPromise> | 1998 std::unique_ptr<cc::SwapPromise> |
1988 RenderThreadImpl::RequestCopyOfOutputForLayoutTest( | 1999 RenderThreadImpl::RequestCopyOfOutputForLayoutTest( |
1989 int32_t routing_id, | 2000 int32_t routing_id, |
1990 std::unique_ptr<cc::CopyOutputRequest> request) { | 2001 std::unique_ptr<cc::CopyOutputRequest> request) { |
1991 DCHECK(layout_test_deps_); | 2002 DCHECK(layout_test_deps_); |
1992 return layout_test_deps_->RequestCopyOfOutput(routing_id, std::move(request)); | 2003 return layout_test_deps_->RequestCopyOfOutput(routing_id, std::move(request)); |
1993 } | 2004 } |
1994 | 2005 |
1995 blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter( | 2006 blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter( |
1996 blink::WebMediaStreamCenterClient* client) { | 2007 blink::WebMediaStreamCenterClient* client) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2054 net::NetworkChangeNotifier::ConnectionType type, | 2065 net::NetworkChangeNotifier::ConnectionType type, |
2055 double max_bandwidth_mbps) { | 2066 double max_bandwidth_mbps) { |
2056 bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE; | 2067 bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE; |
2057 WebNetworkStateNotifier::setOnLine(online); | 2068 WebNetworkStateNotifier::setOnLine(online); |
2058 FOR_EACH_OBSERVER( | 2069 FOR_EACH_OBSERVER( |
2059 RenderThreadObserver, observers_, NetworkStateChanged(online)); | 2070 RenderThreadObserver, observers_, NetworkStateChanged(online)); |
2060 WebNetworkStateNotifier::setWebConnection( | 2071 WebNetworkStateNotifier::setWebConnection( |
2061 NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); | 2072 NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); |
2062 } | 2073 } |
2063 | 2074 |
| 2075 void RenderThreadImpl::CreateView(mojom::CreateViewParamsPtr params) { |
| 2076 CompositorDependencies* compositor_deps = this; |
| 2077 // When bringing in render_view, also bring in webkit's glue and jsbindings. |
| 2078 RenderViewImpl::Create(compositor_deps, *params, false); |
| 2079 } |
| 2080 |
2064 void RenderThreadImpl::OnTimeZoneChange(const std::string& zone_id) { | 2081 void RenderThreadImpl::OnTimeZoneChange(const std::string& zone_id) { |
2065 if (!blink_platform_impl_) | 2082 if (!blink_platform_impl_) |
2066 return; | 2083 return; |
2067 if (!zone_id.empty()) { | 2084 if (!zone_id.empty()) { |
2068 icu::TimeZone *new_zone = icu::TimeZone::createTimeZone( | 2085 icu::TimeZone *new_zone = icu::TimeZone::createTimeZone( |
2069 icu::UnicodeString::fromUTF8(zone_id)); | 2086 icu::UnicodeString::fromUTF8(zone_id)); |
2070 icu::TimeZone::adoptDefault(new_zone); | 2087 icu::TimeZone::adoptDefault(new_zone); |
2071 VLOG(1) << "ICU default timezone is set to " << zone_id; | 2088 VLOG(1) << "ICU default timezone is set to " << zone_id; |
2072 } | 2089 } |
2073 NotifyTimezoneChange(); | 2090 NotifyTimezoneChange(); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2313 // OnSyncMemoryPressure() is never called in that case. | 2330 // OnSyncMemoryPressure() is never called in that case. |
2314 void RenderThreadImpl::OnTrimMemoryImmediately() { | 2331 void RenderThreadImpl::OnTrimMemoryImmediately() { |
2315 if (blink::mainThreadIsolate()) { | 2332 if (blink::mainThreadIsolate()) { |
2316 blink::mainThreadIsolate()->MemoryPressureNotification( | 2333 blink::mainThreadIsolate()->MemoryPressureNotification( |
2317 v8::MemoryPressureLevel::kCritical); | 2334 v8::MemoryPressureLevel::kCritical); |
2318 blink::MemoryPressureNotificationToWorkerThreadIsolates( | 2335 blink::MemoryPressureNotificationToWorkerThreadIsolates( |
2319 v8::MemoryPressureLevel::kCritical); | 2336 v8::MemoryPressureLevel::kCritical); |
2320 } | 2337 } |
2321 } | 2338 } |
2322 | 2339 |
| 2340 void RenderThreadImpl::OnRendererInterfaceRequest( |
| 2341 mojom::RendererAssociatedRequest request) { |
| 2342 DCHECK(!renderer_binding_.is_bound()); |
| 2343 renderer_binding_.Bind(std::move(request)); |
| 2344 } |
2323 | 2345 |
2324 } // namespace content | 2346 } // namespace content |
OLD | NEW |