Chromium Code Reviews| 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 |