Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 2310563002: Adds routed interface support between RenderFrameHost and RenderFrame (Closed)
Patch Set: nit Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 // Represents the browser side of the browser <--> renderer communication 5 // Represents the browser side of the browser <--> renderer communication
6 // channel. There will be one RenderProcessHost per renderer process. 6 // channel. There will be one RenderProcessHost per renderer process.
7 7
8 #include "content/browser/renderer_host/render_process_host_impl.h" 8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 bool is_for_guests_only) 668 bool is_for_guests_only)
669 : fast_shutdown_started_(false), 669 : fast_shutdown_started_(false),
670 deleting_soon_(false), 670 deleting_soon_(false),
671 #ifndef NDEBUG 671 #ifndef NDEBUG
672 is_self_deleted_(false), 672 is_self_deleted_(false),
673 #endif 673 #endif
674 pending_views_(0), 674 pending_views_(0),
675 child_token_(mojo::edk::GenerateRandomToken()), 675 child_token_(mojo::edk::GenerateRandomToken()),
676 service_worker_ref_count_(0), 676 service_worker_ref_count_(0),
677 shared_worker_ref_count_(0), 677 shared_worker_ref_count_(0),
678 route_provider_binding_(this),
679 associated_interface_provider_bindings_(
680 mojo::BindingSetDispatchMode::WITH_CONTEXT),
678 visible_widgets_(0), 681 visible_widgets_(0),
679 is_process_backgrounded_(false), 682 is_process_backgrounded_(false),
680 is_initialized_(false), 683 is_initialized_(false),
681 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), 684 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()),
682 browser_context_(browser_context), 685 browser_context_(browser_context),
683 storage_partition_impl_(storage_partition_impl), 686 storage_partition_impl_(storage_partition_impl),
684 sudden_termination_allowed_(true), 687 sudden_termination_allowed_(true),
685 ignore_input_events_(false), 688 ignore_input_events_(false),
686 is_for_guests_only_(is_for_guests_only), 689 is_for_guests_only_(is_for_guests_only),
687 gpu_observer_registered_(false), 690 gpu_observer_registered_(false),
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this); 811 ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this);
809 gpu_observer_registered_ = false; 812 gpu_observer_registered_ = false;
810 } 813 }
811 814
812 #if USE_ATTACHMENT_BROKER 815 #if USE_ATTACHMENT_BROKER
813 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel( 816 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel(
814 channel_.get()); 817 channel_.get());
815 #endif 818 #endif
816 // We may have some unsent messages at this point, but that's OK. 819 // We may have some unsent messages at this point, but that's OK.
817 channel_.reset(); 820 channel_.reset();
818 while (!queued_messages_.empty()) { 821 queued_messages_ = MessageQueue{};
819 delete queued_messages_.front();
820 queued_messages_.pop();
821 }
822 822
823 UnregisterHost(GetID()); 823 UnregisterHost(GetID());
824 824
825 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 825 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
826 switches::kDisableGpuShaderDiskCache)) { 826 switches::kDisableGpuShaderDiskCache)) {
827 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 827 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
828 base::Bind(&RemoveShaderInfo, GetID())); 828 base::Bind(&RemoveShaderInfo, GetID()));
829 } 829 }
830 } 830 }
831 831
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 934
935 // Spawn the child process asynchronously to avoid blocking the UI thread. 935 // Spawn the child process asynchronously to avoid blocking the UI thread.
936 // As long as there's no renderer prefix, we can use the zygote process 936 // As long as there's no renderer prefix, we can use the zygote process
937 // at this stage. 937 // at this stage.
938 child_process_launcher_.reset(new ChildProcessLauncher( 938 child_process_launcher_.reset(new ChildProcessLauncher(
939 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line, 939 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line,
940 GetID(), this, child_token_, 940 GetID(), this, child_token_,
941 base::Bind(&RenderProcessHostImpl::OnMojoError, 941 base::Bind(&RenderProcessHostImpl::OnMojoError,
942 weak_factory_.GetWeakPtr(), 942 weak_factory_.GetWeakPtr(),
943 base::ThreadTaskRunnerHandle::Get()))); 943 base::ThreadTaskRunnerHandle::Get())));
944 channel_->Pause();
944 945
945 fast_shutdown_started_ = false; 946 fast_shutdown_started_ = false;
946 } 947 }
947 948
949 // Push any pending messages to the channel now. Note that if the child
950 // process is still launching, the channel will be paused and outgoing
951 // messages will be queued internally by the channel.
952 while (!queued_messages_.empty()) {
953 channel_->Send(queued_messages_.front().release());
954 queued_messages_.pop();
955 }
956
948 if (!gpu_observer_registered_) { 957 if (!gpu_observer_registered_) {
949 gpu_observer_registered_ = true; 958 gpu_observer_registered_ = true;
950 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); 959 ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
951 } 960 }
952 961
953 power_monitor_broadcaster_.Init(); 962 power_monitor_broadcaster_.Init();
954 963
955 is_initialized_ = true; 964 is_initialized_ = true;
956 init_time_ = base::TimeTicks::Now(); 965 init_time_ = base::TimeTicks::Now();
957 return true; 966 return true;
958 } 967 }
959 968
960 std::unique_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy( 969 std::unique_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy(
961 const std::string& channel_id) { 970 const std::string& channel_id) {
962 scoped_refptr<base::SingleThreadTaskRunner> runner = 971 scoped_refptr<base::SingleThreadTaskRunner> runner =
963 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); 972 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
964 IPC::mojom::ChannelBootstrapPtr bootstrap; 973 IPC::mojom::ChannelBootstrapPtr bootstrap;
965 GetRemoteInterfaces()->GetInterface(&bootstrap); 974 GetRemoteInterfaces()->GetInterface(&bootstrap);
966 std::unique_ptr<IPC::ChannelFactory> channel_factory = 975 std::unique_ptr<IPC::ChannelFactory> channel_factory =
967 IPC::ChannelMojo::CreateServerFactory( 976 IPC::ChannelMojo::CreateServerFactory(
968 bootstrap.PassInterface().PassHandle(), runner); 977 bootstrap.PassInterface().PassHandle(), runner);
969 978
979 std::unique_ptr<IPC::ChannelProxy> channel;
970 // Do NOT expand ifdef or run time condition checks here! Synchronous 980 // Do NOT expand ifdef or run time condition checks here! Synchronous
971 // IPCs from browser process are banned. It is only narrowly allowed 981 // IPCs from browser process are banned. It is only narrowly allowed
972 // for Android WebView to maintain backward compatibility. 982 // for Android WebView to maintain backward compatibility.
973 // See crbug.com/526842 for details. 983 // See crbug.com/526842 for details.
974 #if defined(OS_ANDROID) 984 #if defined(OS_ANDROID)
975 if (GetContentClient()->UsingSynchronousCompositing()) { 985 if (GetContentClient()->UsingSynchronousCompositing())
976 return IPC::SyncChannel::Create( 986 channel = IPC::SyncChannel::Create(this, runner.get(), &never_signaled_);
977 std::move(channel_factory), this, runner.get(), true, &never_signaled_);
978 }
979 #endif // OS_ANDROID 987 #endif // OS_ANDROID
980 988 if (!channel)
981 std::unique_ptr<IPC::ChannelProxy> channel( 989 channel.reset(new IPC::ChannelProxy(this, runner.get()));
982 new IPC::ChannelProxy(this, runner.get()));
983 #if USE_ATTACHMENT_BROKER 990 #if USE_ATTACHMENT_BROKER
984 IPC::AttachmentBroker::GetGlobal()->RegisterCommunicationChannel( 991 IPC::AttachmentBroker::GetGlobal()->RegisterCommunicationChannel(
985 channel.get(), runner); 992 channel.get(), runner);
986 #endif 993 #endif
987 channel->Init(std::move(channel_factory), true); 994 channel->Init(std::move(channel_factory), true /* create_pipe_now */);
995
988 return channel; 996 return channel;
989 } 997 }
990 998
991 void RenderProcessHostImpl::CreateMessageFilters() { 999 void RenderProcessHostImpl::CreateMessageFilters() {
992 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1000 DCHECK_CURRENTLY_ON(BrowserThread::UI);
993 AddFilter(new ResourceSchedulerFilter(GetID())); 1001 AddFilter(new ResourceSchedulerFilter(GetID()));
994 MediaInternals* media_internals = MediaInternals::GetInstance(); 1002 MediaInternals* media_internals = MediaInternals::GetInstance();
995 // Add BrowserPluginMessageFilter to ensure it gets the first stab at messages 1003 // Add BrowserPluginMessageFilter to ensure it gets the first stab at messages
996 // from guests. 1004 // from guests.
997 scoped_refptr<BrowserPluginMessageFilter> bp_message_filter( 1005 scoped_refptr<BrowserPluginMessageFilter> bp_message_filter(
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 void RenderProcessHostImpl::RegisterMojoInterfaces() { 1187 void RenderProcessHostImpl::RegisterMojoInterfaces() {
1180 std::unique_ptr<shell::InterfaceRegistry> registry( 1188 std::unique_ptr<shell::InterfaceRegistry> registry(
1181 new shell::InterfaceRegistry); 1189 new shell::InterfaceRegistry);
1182 #if defined(OS_ANDROID) 1190 #if defined(OS_ANDROID)
1183 interface_registry_android_ = 1191 interface_registry_android_ =
1184 InterfaceRegistryAndroid::Create(registry.get()); 1192 InterfaceRegistryAndroid::Create(registry.get());
1185 InterfaceRegistrarAndroid::ExposeInterfacesToRenderer( 1193 InterfaceRegistrarAndroid::ExposeInterfacesToRenderer(
1186 interface_registry_android_.get()); 1194 interface_registry_android_.get());
1187 #endif 1195 #endif
1188 1196
1197 channel_->AddAssociatedInterface(
1198 base::Bind(&RenderProcessHostImpl::OnRouteProviderRequest,
1199 base::Unretained(this)));
1200
1189 #if !defined(OS_ANDROID) 1201 #if !defined(OS_ANDROID)
1190 AddUIThreadInterface( 1202 AddUIThreadInterface(
1191 registry.get(), base::Bind(&device::BatteryMonitorImpl::Create)); 1203 registry.get(), base::Bind(&device::BatteryMonitorImpl::Create));
1192 #endif 1204 #endif
1193 AddUIThreadInterface( 1205 AddUIThreadInterface(
1194 registry.get(), 1206 registry.get(),
1195 base::Bind(&PermissionServiceContext::CreateService, 1207 base::Bind(&PermissionServiceContext::CreateService,
1196 base::Unretained(permission_service_context_.get()))); 1208 base::Unretained(permission_service_context_.get())));
1197 // TODO(mcasas): finalize arguments. 1209 // TODO(mcasas): finalize arguments.
1198 AddUIThreadInterface(registry.get(), base::Bind(&ImageCaptureImpl::Create)); 1210 AddUIThreadInterface(registry.get(), base::Bind(&ImageCaptureImpl::Create));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 MojoShellConnection* mojo_shell_connection = 1266 MojoShellConnection* mojo_shell_connection =
1255 BrowserContext::GetMojoShellConnectionFor(browser_context_); 1267 BrowserContext::GetMojoShellConnectionFor(browser_context_);
1256 std::unique_ptr<ConnectionFilterImpl> connection_filter( 1268 std::unique_ptr<ConnectionFilterImpl> connection_filter(
1257 new ConnectionFilterImpl(mojo_child_connection_->child_identity(), 1269 new ConnectionFilterImpl(mojo_child_connection_->child_identity(),
1258 std::move(registry))); 1270 std::move(registry)));
1259 connection_filter_controller_ = connection_filter->controller(); 1271 connection_filter_controller_ = connection_filter->controller();
1260 connection_filter_id_ = 1272 connection_filter_id_ =
1261 mojo_shell_connection->AddConnectionFilter(std::move(connection_filter)); 1273 mojo_shell_connection->AddConnectionFilter(std::move(connection_filter));
1262 } 1274 }
1263 1275
1276 void RenderProcessHostImpl::GetRoute(
1277 int32_t routing_id,
1278 mojom::AssociatedInterfaceProviderAssociatedRequest request) {
1279 DCHECK(request.is_pending());
1280 associated_interface_provider_bindings_.AddBinding(
1281 this, std::move(request),
1282 reinterpret_cast<void*>(static_cast<uintptr_t>(routing_id)));
1283 }
1284
1285 void RenderProcessHostImpl::GetAssociatedInterface(
1286 const std::string& name,
1287 mojom::AssociatedInterfaceAssociatedRequest request) {
1288 int32_t routing_id = static_cast<int32_t>(reinterpret_cast<uintptr_t>(
1289 associated_interface_provider_bindings_.dispatch_context()));
1290 IPC::Listener* listener = listeners_.Lookup(routing_id);
1291 if (listener)
1292 listener->OnAssociatedInterfaceRequest(name, request.PassHandle());
1293 }
1294
1264 void RenderProcessHostImpl::CreateStoragePartitionService( 1295 void RenderProcessHostImpl::CreateStoragePartitionService(
1265 mojo::InterfaceRequest<mojom::StoragePartitionService> request) { 1296 mojo::InterfaceRequest<mojom::StoragePartitionService> request) {
1266 // DO NOT REMOVE THIS COMMAND LINE CHECK WITHOUT SECURITY REVIEW! 1297 // DO NOT REMOVE THIS COMMAND LINE CHECK WITHOUT SECURITY REVIEW!
1267 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1298 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1268 switches::kMojoLocalStorage)) { 1299 switches::kMojoLocalStorage)) {
1269 storage_partition_impl_->Bind(std::move(request)); 1300 storage_partition_impl_->Bind(std::move(request));
1270 } 1301 }
1271 } 1302 }
1272 1303
1273 int RenderProcessHostImpl::GetNextRoutingID() { 1304 int RenderProcessHostImpl::GetNextRoutingID() {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 DCHECK_GT(worker_ref_count(), 0UL); 1371 DCHECK_GT(worker_ref_count(), 0UL);
1341 --shared_worker_ref_count_; 1372 --shared_worker_ref_count_;
1342 if (worker_ref_count() == 0) 1373 if (worker_ref_count() == 0)
1343 Cleanup(); 1374 Cleanup();
1344 } 1375 }
1345 1376
1346 void RenderProcessHostImpl::PurgeAndSuspend() { 1377 void RenderProcessHostImpl::PurgeAndSuspend() {
1347 Send(new ChildProcessMsg_PurgeAndSuspend()); 1378 Send(new ChildProcessMsg_PurgeAndSuspend());
1348 } 1379 }
1349 1380
1381 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() {
1382 if (!remote_route_provider_) {
1383 DCHECK(channel_);
1384 channel_->GetRemoteAssociatedInterface(&remote_route_provider_);
1385 }
1386 return remote_route_provider_.get();
1387 }
1388
1350 void RenderProcessHostImpl::AddRoute(int32_t routing_id, 1389 void RenderProcessHostImpl::AddRoute(int32_t routing_id,
1351 IPC::Listener* listener) { 1390 IPC::Listener* listener) {
1352 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " 1391 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: "
1353 << routing_id; 1392 << routing_id;
1354 listeners_.AddWithID(listener, routing_id); 1393 listeners_.AddWithID(listener, routing_id);
1355 } 1394 }
1356 1395
1357 void RenderProcessHostImpl::RemoveRoute(int32_t routing_id) { 1396 void RenderProcessHostImpl::RemoveRoute(int32_t routing_id) {
1358 DCHECK(listeners_.Lookup(routing_id) != NULL); 1397 DCHECK(listeners_.Lookup(routing_id) != nullptr);
1359 listeners_.Remove(routing_id); 1398 listeners_.Remove(routing_id);
1360 Cleanup(); 1399 Cleanup();
1361 } 1400 }
1362 1401
1363 void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) { 1402 void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) {
1364 observers_.AddObserver(observer); 1403 observers_.AddObserver(observer);
1365 } 1404 }
1366 1405
1367 void RenderProcessHostImpl::RemoveObserver( 1406 void RenderProcessHostImpl::RemoveObserver(
1368 RenderProcessHostObserver* observer) { 1407 RenderProcessHostObserver* observer) {
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
1854 // Set this before ProcessDied() so observers can tell if the render process 1893 // Set this before ProcessDied() so observers can tell if the render process
1855 // died due to fast shutdown versus another cause. 1894 // died due to fast shutdown versus another cause.
1856 fast_shutdown_started_ = true; 1895 fast_shutdown_started_ = true;
1857 1896
1858 ProcessDied(false /* already_dead */, nullptr); 1897 ProcessDied(false /* already_dead */, nullptr);
1859 return true; 1898 return true;
1860 } 1899 }
1861 1900
1862 bool RenderProcessHostImpl::Send(IPC::Message* msg) { 1901 bool RenderProcessHostImpl::Send(IPC::Message* msg) {
1863 TRACE_EVENT0("renderer_host", "RenderProcessHostImpl::Send"); 1902 TRACE_EVENT0("renderer_host", "RenderProcessHostImpl::Send");
1903
1904 std::unique_ptr<IPC::Message> message(msg);
1905
1864 #if !defined(OS_ANDROID) 1906 #if !defined(OS_ANDROID)
1865 DCHECK(!msg->is_sync()); 1907 DCHECK(!message->is_sync());
1866 #endif 1908 #endif
1867 1909
1868 if (!channel_) { 1910 if (!channel_) {
1869 #if defined(OS_ANDROID) 1911 #if defined(OS_ANDROID)
1870 if (msg->is_sync()) { 1912 if (message->is_sync())
1871 delete msg;
1872 return false; 1913 return false;
1873 }
1874 #endif 1914 #endif
1875 if (!is_initialized_) { 1915 if (!is_initialized_) {
1876 queued_messages_.push(msg); 1916 queued_messages_.emplace(std::move(message));
1877 return true; 1917 return true;
1878 } else {
1879 delete msg;
1880 return false;
1881 } 1918 }
1919 return false;
1882 } 1920 }
1883 1921
1884 if (child_process_launcher_.get() && child_process_launcher_->IsStarting()) {
1885 #if defined(OS_ANDROID) 1922 #if defined(OS_ANDROID)
1886 if (msg->is_sync()) { 1923 if (child_process_launcher_.get() && child_process_launcher_->IsStarting() &&
1887 delete msg; 1924 message->is_sync()) {
1888 return false; 1925 return false;
1889 } 1926 }
1890 #endif 1927 #endif
1891 queued_messages_.push(msg);
1892 return true;
1893 }
1894 1928
1895 return channel_->Send(msg); 1929 return channel_->Send(message.release());
1896 } 1930 }
1897 1931
1898 bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) { 1932 bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) {
1899 // If we're about to be deleted, or have initiated the fast shutdown sequence, 1933 // If we're about to be deleted, or have initiated the fast shutdown sequence,
1900 // we ignore incoming messages. 1934 // we ignore incoming messages.
1901 1935
1902 if (deleting_soon_ || fast_shutdown_started_) 1936 if (deleting_soon_ || fast_shutdown_started_)
1903 return false; 1937 return false;
1904 1938
1905 mark_child_process_activity_time(); 1939 mark_child_process_activity_time();
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
2541 return; 2575 return;
2542 metrics_allocator_.reset(new base::SharedPersistentMemoryAllocator( 2576 metrics_allocator_.reset(new base::SharedPersistentMemoryAllocator(
2543 std::move(shm), GetID(), "RendererMetrics", /*readonly=*/false)); 2577 std::move(shm), GetID(), "RendererMetrics", /*readonly=*/false));
2544 2578
2545 base::SharedMemoryHandle shm_handle; 2579 base::SharedMemoryHandle shm_handle;
2546 metrics_allocator_->shared_memory()->ShareToProcess(destination, &shm_handle); 2580 metrics_allocator_->shared_memory()->ShareToProcess(destination, &shm_handle);
2547 Send(new ChildProcessMsg_SetHistogramMemory( 2581 Send(new ChildProcessMsg_SetHistogramMemory(
2548 shm_handle, metrics_allocator_->shared_memory()->mapped_size())); 2582 shm_handle, metrics_allocator_->shared_memory()->mapped_size()));
2549 } 2583 }
2550 2584
2585 void RenderProcessHostImpl::OnRouteProviderRequest(
2586 mojom::RouteProviderAssociatedRequest request) {
2587 if (route_provider_binding_.is_bound())
2588 return;
2589 route_provider_binding_.Bind(std::move(request));
2590 }
2591
2551 void RenderProcessHostImpl::ProcessDied(bool already_dead, 2592 void RenderProcessHostImpl::ProcessDied(bool already_dead,
2552 RendererClosedDetails* known_details) { 2593 RendererClosedDetails* known_details) {
2553 // Our child process has died. If we didn't expect it, it's a crash. 2594 // Our child process has died. If we didn't expect it, it's a crash.
2554 // In any case, we need to let everyone know it's gone. 2595 // In any case, we need to let everyone know it's gone.
2555 // The OnChannelError notification can fire multiple times due to nested sync 2596 // The OnChannelError notification can fire multiple times due to nested sync
2556 // calls to a renderer. If we don't have a valid channel here it means we 2597 // calls to a renderer. If we don't have a valid channel here it means we
2557 // already handled the error. 2598 // already handled the error.
2558 2599
2559 // It should not be possible for us to be called re-entrantly. 2600 // It should not be possible for us to be called re-entrantly.
2560 DCHECK(!within_process_died_observer_); 2601 DCHECK(!within_process_died_observer_);
(...skipping 24 matching lines...) Expand all
2585 } 2626 }
2586 2627
2587 RendererClosedDetails details(status, exit_code); 2628 RendererClosedDetails details(status, exit_code);
2588 2629
2589 child_process_launcher_.reset(); 2630 child_process_launcher_.reset();
2590 #if USE_ATTACHMENT_BROKER 2631 #if USE_ATTACHMENT_BROKER
2591 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel( 2632 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel(
2592 channel_.get()); 2633 channel_.get());
2593 #endif 2634 #endif
2594 channel_.reset(); 2635 channel_.reset();
2595 while (!queued_messages_.empty()) { 2636 queued_messages_ = MessageQueue{};
2596 delete queued_messages_.front(); 2637
2597 queued_messages_.pop();
2598 }
2599 UpdateProcessPriority(); 2638 UpdateProcessPriority();
2600 DCHECK(!is_process_backgrounded_); 2639 DCHECK(!is_process_backgrounded_);
2601 2640
2602 // RenderProcessExited observers and RenderProcessGone handlers might 2641 // RenderProcessExited observers and RenderProcessGone handlers might
2603 // navigate or perform other actions that require a connection. Ensure that 2642 // navigate or perform other actions that require a connection. Ensure that
2604 // there is one before calling them. 2643 // there is one before calling them.
2605 child_token_ = mojo::edk::GenerateRandomToken(); 2644 child_token_ = mojo::edk::GenerateRandomToken();
2606 shell::Connector* connector = 2645 shell::Connector* connector =
2607 BrowserContext::GetShellConnectorFor(browser_context_); 2646 BrowserContext::GetShellConnectorFor(browser_context_);
2608 if (!connector) 2647 if (!connector)
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2739 // especially don't want to send the RENDERER_PROCESS_CREATED notification, 2778 // especially don't want to send the RENDERER_PROCESS_CREATED notification,
2740 // since some clients might expect a RENDERER_PROCESS_TERMINATED afterwards to 2779 // since some clients might expect a RENDERER_PROCESS_TERMINATED afterwards to
2741 // properly cleanup. 2780 // properly cleanup.
2742 if (deleting_soon_) 2781 if (deleting_soon_)
2743 return; 2782 return;
2744 2783
2745 if (child_process_launcher_) { 2784 if (child_process_launcher_) {
2746 DCHECK(child_process_launcher_->GetProcess().IsValid()); 2785 DCHECK(child_process_launcher_->GetProcess().IsValid());
2747 DCHECK(!is_process_backgrounded_); 2786 DCHECK(!is_process_backgrounded_);
2748 2787
2788 // Unpause the channel now that the process is launched. We don't flush it
2789 // yet to ensure that any initialization messages sent here (e.g., things
2790 // done in response to NOTIFICATION_RENDER_PROCESS_CREATED; see below)
2791 // preempt already queued messages.
2792 channel_->Unpause(false /* flush */);
2793
2749 if (mojo_child_connection_) { 2794 if (mojo_child_connection_) {
2750 mojo_child_connection_->SetProcessHandle( 2795 mojo_child_connection_->SetProcessHandle(
2751 child_process_launcher_->GetProcess().Handle()); 2796 child_process_launcher_->GetProcess().Handle());
2752 } 2797 }
2753 2798
2754 // Not all platforms launch processes in the same backgrounded state. Make 2799 // Not all platforms launch processes in the same backgrounded state. Make
2755 // sure |is_process_backgrounded_| reflects this platform's initial process 2800 // sure |is_process_backgrounded_| reflects this platform's initial process
2756 // state. 2801 // state.
2757 is_process_backgrounded_ = 2802 is_process_backgrounded_ =
2758 child_process_launcher_->GetProcess().IsProcessBackgrounded(); 2803 child_process_launcher_->GetProcess().IsProcessBackgrounded();
2759 2804
2760 // Disable updating process priority on startup for now as it incorrectly 2805 // Disable updating process priority on startup for now as it incorrectly
2761 // results in backgrounding foreground navigations until their first commit 2806 // results in backgrounding foreground navigations until their first commit
2762 // is made. A better long term solution would be to be aware of the tab's 2807 // is made. A better long term solution would be to be aware of the tab's
2763 // visibility at this point. https://crbug.com/560446. 2808 // visibility at this point. https://crbug.com/560446.
2764 // Except on Android for now because of https://crbug.com/601184 :-(. 2809 // Except on Android for now because of https://crbug.com/601184 :-(.
2765 #if defined(OS_ANDROID) 2810 #if defined(OS_ANDROID)
2766 UpdateProcessPriority(); 2811 UpdateProcessPriority();
2767 #endif 2812 #endif
2768 2813
2769 // Share histograms between the renderer and this process. 2814 // Share histograms between the renderer and this process.
2770 CreateSharedRendererHistogramAllocator(); 2815 CreateSharedRendererHistogramAllocator();
2771 } 2816 }
2772 2817
2773 // NOTE: This needs to be before sending queued messages because 2818 // NOTE: This needs to be before flushing queued messages, because
2774 // ExtensionService uses this notification to initialize the renderer process 2819 // ExtensionService uses this notification to initialize the renderer process
2775 // with state that must be there before any JavaScript executes. 2820 // with state that must be there before any JavaScript executes.
2776 // 2821 //
2777 // The queued messages contain such things as "navigate". If this notification 2822 // The queued messages contain such things as "navigate". If this notification
2778 // was after, we can end up executing JavaScript before the initialization 2823 // was after, we can end up executing JavaScript before the initialization
2779 // happens. 2824 // happens.
2780 NotificationService::current()->Notify(NOTIFICATION_RENDERER_PROCESS_CREATED, 2825 NotificationService::current()->Notify(NOTIFICATION_RENDERER_PROCESS_CREATED,
2781 Source<RenderProcessHost>(this), 2826 Source<RenderProcessHost>(this),
2782 NotificationService::NoDetails()); 2827 NotificationService::NoDetails());
2783 2828
2784 while (!queued_messages_.empty()) { 2829 if (child_process_launcher_)
2785 Send(queued_messages_.front()); 2830 channel_->Flush();
2786 queued_messages_.pop();
2787 }
2788 2831
2789 if (IsReady()) { 2832 if (IsReady()) {
2790 DCHECK(!sent_render_process_ready_); 2833 DCHECK(!sent_render_process_ready_);
2791 sent_render_process_ready_ = true; 2834 sent_render_process_ready_ = true;
2792 // Send RenderProcessReady only if the channel is already connected. 2835 // Send RenderProcessReady only if the channel is already connected.
2793 FOR_EACH_OBSERVER(RenderProcessHostObserver, 2836 FOR_EACH_OBSERVER(RenderProcessHostObserver,
2794 observers_, 2837 observers_,
2795 RenderProcessReady(this)); 2838 RenderProcessReady(this));
2796 } 2839 }
2797 2840
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2940 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; 2983 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error;
2941 2984
2942 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias 2985 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias
2943 // enough information here so that we can determine what the bad message was. 2986 // enough information here so that we can determine what the bad message was.
2944 base::debug::Alias(&error); 2987 base::debug::Alias(&error);
2945 bad_message::ReceivedBadMessage(process.get(), 2988 bad_message::ReceivedBadMessage(process.get(),
2946 bad_message::RPH_MOJO_PROCESS_ERROR); 2989 bad_message::RPH_MOJO_PROCESS_ERROR);
2947 } 2990 }
2948 2991
2949 } // namespace content 2992 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_process_host_impl.h ('k') | content/browser/web_contents/web_contents_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698