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. | |
ncarter (slow)
2016/09/29 16:49:32
Is this race still actually possible?
Ken Rockot(use gerrit already)
2016/09/30 00:08:57
Yeah, since this pipe is not associated with the c
| |
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 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1555 audio_renderer_mixer_manager_ = AudioRendererMixerManager::Create(); | 1562 audio_renderer_mixer_manager_ = AudioRendererMixerManager::Create(); |
1556 } | 1563 } |
1557 | 1564 |
1558 return audio_renderer_mixer_manager_.get(); | 1565 return audio_renderer_mixer_manager_.get(); |
1559 } | 1566 } |
1560 | 1567 |
1561 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() { | 1568 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() { |
1562 return ChildProcess::current()->GetShutDownEvent(); | 1569 return ChildProcess::current()->GetShutDownEvent(); |
1563 } | 1570 } |
1564 | 1571 |
1572 void RenderThreadImpl::OnAssociatedInterfaceRequest( | |
1573 const std::string& name, | |
1574 mojo::ScopedInterfaceEndpointHandle handle) { | |
1575 associated_interfaces_.BindRequest(name, std::move(handle)); | |
1576 } | |
1577 | |
1565 bool RenderThreadImpl::IsGpuRasterizationForced() { | 1578 bool RenderThreadImpl::IsGpuRasterizationForced() { |
1566 return is_gpu_rasterization_forced_; | 1579 return is_gpu_rasterization_forced_; |
1567 } | 1580 } |
1568 | 1581 |
1569 bool RenderThreadImpl::IsGpuRasterizationEnabled() { | 1582 bool RenderThreadImpl::IsGpuRasterizationEnabled() { |
1570 return is_gpu_rasterization_enabled_; | 1583 return is_gpu_rasterization_enabled_; |
1571 } | 1584 } |
1572 | 1585 |
1573 bool RenderThreadImpl::IsAsyncWorkerContextEnabled() { | 1586 bool RenderThreadImpl::IsAsyncWorkerContextEnabled() { |
1574 return is_async_worker_context_enabled_; | 1587 return is_async_worker_context_enabled_; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1714 embedded_worker_dispatcher_->OnMessageReceived(msg)) { | 1727 embedded_worker_dispatcher_->OnMessageReceived(msg)) { |
1715 return true; | 1728 return true; |
1716 } | 1729 } |
1717 | 1730 |
1718 bool handled = true; | 1731 bool handled = true; |
1719 IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg) | 1732 IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg) |
1720 IPC_MESSAGE_HANDLER(FrameMsg_NewFrame, OnCreateNewFrame) | 1733 IPC_MESSAGE_HANDLER(FrameMsg_NewFrame, OnCreateNewFrame) |
1721 IPC_MESSAGE_HANDLER(FrameMsg_NewFrameProxy, OnCreateNewFrameProxy) | 1734 IPC_MESSAGE_HANDLER(FrameMsg_NewFrameProxy, OnCreateNewFrameProxy) |
1722 // TODO(port): removed from render_messages_internal.h; | 1735 // TODO(port): removed from render_messages_internal.h; |
1723 // is there a new non-windows message I should add here? | 1736 // is there a new non-windows message I should add here? |
1724 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView) | |
1725 IPC_MESSAGE_HANDLER(ViewMsg_NetworkConnectionChanged, | 1737 IPC_MESSAGE_HANDLER(ViewMsg_NetworkConnectionChanged, |
1726 OnNetworkConnectionChanged) | 1738 OnNetworkConnectionChanged) |
1727 IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateNewSharedWorker) | 1739 IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateNewSharedWorker) |
1728 #if defined(OS_ANDROID) | 1740 #if defined(OS_ANDROID) |
1729 IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended, | 1741 IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended, |
1730 OnSetWebKitSharedTimersSuspended) | 1742 OnSetWebKitSharedTimersSuspended) |
1731 #endif | 1743 #endif |
1732 #if defined(OS_MACOSX) | 1744 #if defined(OS_MACOSX) |
1733 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme) | 1745 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme) |
1734 IPC_MESSAGE_HANDLER(ViewMsg_SystemColorsChanged, OnSystemColorsChanged) | 1746 IPC_MESSAGE_HANDLER(ViewMsg_SystemColorsChanged, OnSystemColorsChanged) |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1801 base::IntToString(render_view_routing_id)); | 1813 base::IntToString(render_view_routing_id)); |
1802 base::debug::SetCrashKeyValue("newproxy_opener_id", | 1814 base::debug::SetCrashKeyValue("newproxy_opener_id", |
1803 base::IntToString(opener_routing_id)); | 1815 base::IntToString(opener_routing_id)); |
1804 base::debug::SetCrashKeyValue("newproxy_parent_id", | 1816 base::debug::SetCrashKeyValue("newproxy_parent_id", |
1805 base::IntToString(parent_routing_id)); | 1817 base::IntToString(parent_routing_id)); |
1806 RenderFrameProxy::CreateFrameProxy(routing_id, render_view_routing_id, | 1818 RenderFrameProxy::CreateFrameProxy(routing_id, render_view_routing_id, |
1807 opener_routing_id, parent_routing_id, | 1819 opener_routing_id, parent_routing_id, |
1808 replicated_state); | 1820 replicated_state); |
1809 } | 1821 } |
1810 | 1822 |
1811 void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) { | |
1812 CompositorDependencies* compositor_deps = this; | |
1813 // When bringing in render_view, also bring in webkit's glue and jsbindings. | |
1814 RenderViewImpl::Create(compositor_deps, params, false); | |
1815 } | |
1816 | |
1817 scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() { | 1823 scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() { |
1818 TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync"); | 1824 TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync"); |
1819 | 1825 |
1820 if (gpu_channel_) { | 1826 if (gpu_channel_) { |
1821 // Do nothing if we already have a GPU channel or are already | 1827 // Do nothing if we already have a GPU channel or are already |
1822 // establishing one. | 1828 // establishing one. |
1823 if (!gpu_channel_->IsLost()) | 1829 if (!gpu_channel_->IsLost()) |
1824 return gpu_channel_; | 1830 return gpu_channel_; |
1825 | 1831 |
1826 // Recreate the channel if it has been lost. | 1832 // Recreate the channel if it has been lost. |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1973 sync_compositor_message_filter_.get(), | 1979 sync_compositor_message_filter_.get(), |
1974 std::move(frame_swap_message_queue)); | 1980 std::move(frame_swap_message_queue)); |
1975 } | 1981 } |
1976 #endif | 1982 #endif |
1977 return base::WrapUnique(new RendererCompositorFrameSink( | 1983 return base::WrapUnique(new RendererCompositorFrameSink( |
1978 routing_id, compositor_frame_sink_id, | 1984 routing_id, compositor_frame_sink_id, |
1979 CreateExternalBeginFrameSource(routing_id), std::move(context_provider), | 1985 CreateExternalBeginFrameSource(routing_id), std::move(context_provider), |
1980 std::move(worker_context_provider), std::move(frame_swap_message_queue))); | 1986 std::move(worker_context_provider), std::move(frame_swap_message_queue))); |
1981 } | 1987 } |
1982 | 1988 |
1989 AssociatedInterfaceRegistry* | |
1990 RenderThreadImpl::GetAssociatedInterfaceRegistry() { | |
1991 return &associated_interfaces_; | |
1992 } | |
1993 | |
1983 std::unique_ptr<cc::SwapPromise> | 1994 std::unique_ptr<cc::SwapPromise> |
1984 RenderThreadImpl::RequestCopyOfOutputForLayoutTest( | 1995 RenderThreadImpl::RequestCopyOfOutputForLayoutTest( |
1985 int32_t routing_id, | 1996 int32_t routing_id, |
1986 std::unique_ptr<cc::CopyOutputRequest> request) { | 1997 std::unique_ptr<cc::CopyOutputRequest> request) { |
1987 DCHECK(layout_test_deps_); | 1998 DCHECK(layout_test_deps_); |
1988 return layout_test_deps_->RequestCopyOfOutput(routing_id, std::move(request)); | 1999 return layout_test_deps_->RequestCopyOfOutput(routing_id, std::move(request)); |
1989 } | 2000 } |
1990 | 2001 |
1991 blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter( | 2002 blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter( |
1992 blink::WebMediaStreamCenterClient* client) { | 2003 blink::WebMediaStreamCenterClient* client) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2050 net::NetworkChangeNotifier::ConnectionType type, | 2061 net::NetworkChangeNotifier::ConnectionType type, |
2051 double max_bandwidth_mbps) { | 2062 double max_bandwidth_mbps) { |
2052 bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE; | 2063 bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE; |
2053 WebNetworkStateNotifier::setOnLine(online); | 2064 WebNetworkStateNotifier::setOnLine(online); |
2054 FOR_EACH_OBSERVER( | 2065 FOR_EACH_OBSERVER( |
2055 RenderThreadObserver, observers_, NetworkStateChanged(online)); | 2066 RenderThreadObserver, observers_, NetworkStateChanged(online)); |
2056 WebNetworkStateNotifier::setWebConnection( | 2067 WebNetworkStateNotifier::setWebConnection( |
2057 NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); | 2068 NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); |
2058 } | 2069 } |
2059 | 2070 |
2071 void RenderThreadImpl::CreateView(mojom::CreateViewParamsPtr params) { | |
2072 CompositorDependencies* compositor_deps = this; | |
2073 // When bringing in render_view, also bring in webkit's glue and jsbindings. | |
2074 RenderViewImpl::Create(compositor_deps, *params, false); | |
2075 } | |
2076 | |
2060 void RenderThreadImpl::OnTimeZoneChange(const std::string& zone_id) { | 2077 void RenderThreadImpl::OnTimeZoneChange(const std::string& zone_id) { |
2061 if (!blink_platform_impl_) | 2078 if (!blink_platform_impl_) |
2062 return; | 2079 return; |
2063 if (!zone_id.empty()) { | 2080 if (!zone_id.empty()) { |
2064 icu::TimeZone *new_zone = icu::TimeZone::createTimeZone( | 2081 icu::TimeZone *new_zone = icu::TimeZone::createTimeZone( |
2065 icu::UnicodeString::fromUTF8(zone_id)); | 2082 icu::UnicodeString::fromUTF8(zone_id)); |
2066 icu::TimeZone::adoptDefault(new_zone); | 2083 icu::TimeZone::adoptDefault(new_zone); |
2067 VLOG(1) << "ICU default timezone is set to " << zone_id; | 2084 VLOG(1) << "ICU default timezone is set to " << zone_id; |
2068 } | 2085 } |
2069 NotifyTimezoneChange(); | 2086 NotifyTimezoneChange(); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2309 // OnSyncMemoryPressure() is never called in that case. | 2326 // OnSyncMemoryPressure() is never called in that case. |
2310 void RenderThreadImpl::OnTrimMemoryImmediately() { | 2327 void RenderThreadImpl::OnTrimMemoryImmediately() { |
2311 if (blink::mainThreadIsolate()) { | 2328 if (blink::mainThreadIsolate()) { |
2312 blink::mainThreadIsolate()->MemoryPressureNotification( | 2329 blink::mainThreadIsolate()->MemoryPressureNotification( |
2313 v8::MemoryPressureLevel::kCritical); | 2330 v8::MemoryPressureLevel::kCritical); |
2314 blink::MemoryPressureNotificationToWorkerThreadIsolates( | 2331 blink::MemoryPressureNotificationToWorkerThreadIsolates( |
2315 v8::MemoryPressureLevel::kCritical); | 2332 v8::MemoryPressureLevel::kCritical); |
2316 } | 2333 } |
2317 } | 2334 } |
2318 | 2335 |
2336 void RenderThreadImpl::OnRendererInterfaceRequest( | |
2337 mojom::RendererAssociatedRequest request) { | |
2338 DCHECK(!renderer_binding_.is_bound()); | |
2339 renderer_binding_.Bind(std::move(request)); | |
2340 } | |
2319 | 2341 |
2320 } // namespace content | 2342 } // namespace content |
OLD | NEW |