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