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

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: . 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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this); 837 ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this);
835 gpu_observer_registered_ = false; 838 gpu_observer_registered_ = false;
836 } 839 }
837 840
838 #if USE_ATTACHMENT_BROKER 841 #if USE_ATTACHMENT_BROKER
839 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel( 842 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel(
840 channel_.get()); 843 channel_.get());
841 #endif 844 #endif
842 // We may have some unsent messages at this point, but that's OK. 845 // We may have some unsent messages at this point, but that's OK.
843 channel_.reset(); 846 channel_.reset();
844 while (!queued_messages_.empty()) { 847 while (!queued_messages_.empty())
Sam McNally 2016/09/09 05:33:14 queued_messages_.clear();
Ken Rockot(use gerrit already) 2016/09/09 16:01:50 std::queue has no clear(). I've change these to de
845 delete queued_messages_.front();
846 queued_messages_.pop(); 848 queued_messages_.pop();
847 }
848 849
849 UnregisterHost(GetID()); 850 UnregisterHost(GetID());
850 851
851 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 852 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
852 switches::kDisableGpuShaderDiskCache)) { 853 switches::kDisableGpuShaderDiskCache)) {
853 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 854 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
854 base::Bind(&RemoveShaderInfo, GetID())); 855 base::Bind(&RemoveShaderInfo, GetID()));
855 } 856 }
856 } 857 }
857 858
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 961
961 // Spawn the child process asynchronously to avoid blocking the UI thread. 962 // Spawn the child process asynchronously to avoid blocking the UI thread.
962 // As long as there's no renderer prefix, we can use the zygote process 963 // As long as there's no renderer prefix, we can use the zygote process
963 // at this stage. 964 // at this stage.
964 child_process_launcher_.reset(new ChildProcessLauncher( 965 child_process_launcher_.reset(new ChildProcessLauncher(
965 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line, 966 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line,
966 GetID(), this, child_token_, 967 GetID(), this, child_token_,
967 base::Bind(&RenderProcessHostImpl::OnMojoError, 968 base::Bind(&RenderProcessHostImpl::OnMojoError,
968 weak_factory_.GetWeakPtr(), 969 weak_factory_.GetWeakPtr(),
969 base::ThreadTaskRunnerHandle::Get()))); 970 base::ThreadTaskRunnerHandle::Get())));
971 channel_->Pause();
970 972
971 fast_shutdown_started_ = false; 973 fast_shutdown_started_ = false;
972 } 974 }
973 975
976 // Push any pending messages to the channel.now. Note that if the child
Sam McNally 2016/09/09 05:33:14 s/channel.now/channel now/
Ken Rockot(use gerrit already) 2016/09/09 16:01:50 Done
977 // process is still launching, the channel will be paused and outgoing
978 // messages will be queued internally by the channel.
979 while (!queued_messages_.empty()) {
980 channel_->Send(queued_messages_.front().release());
981 queued_messages_.pop();
982 }
983
974 if (!gpu_observer_registered_) { 984 if (!gpu_observer_registered_) {
975 gpu_observer_registered_ = true; 985 gpu_observer_registered_ = true;
976 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); 986 ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
977 } 987 }
978 988
979 power_monitor_broadcaster_.Init(); 989 power_monitor_broadcaster_.Init();
980 990
981 is_initialized_ = true; 991 is_initialized_ = true;
982 init_time_ = base::TimeTicks::Now(); 992 init_time_ = base::TimeTicks::Now();
983 return true; 993 return true;
984 } 994 }
985 995
986 std::unique_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy( 996 std::unique_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy(
987 const std::string& channel_id) { 997 const std::string& channel_id) {
988 scoped_refptr<base::SingleThreadTaskRunner> runner = 998 scoped_refptr<base::SingleThreadTaskRunner> runner =
989 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); 999 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
990 IPC::mojom::ChannelBootstrapPtr bootstrap; 1000 IPC::mojom::ChannelBootstrapPtr bootstrap;
991 GetRemoteInterfaces()->GetInterface(&bootstrap); 1001 GetRemoteInterfaces()->GetInterface(&bootstrap);
992 std::unique_ptr<IPC::ChannelFactory> channel_factory = 1002 std::unique_ptr<IPC::ChannelFactory> channel_factory =
993 IPC::ChannelMojo::CreateServerFactory( 1003 IPC::ChannelMojo::CreateServerFactory(
994 bootstrap.PassInterface().PassHandle(), runner); 1004 bootstrap.PassInterface().PassHandle(), runner);
995 1005
1006 std::unique_ptr<IPC::ChannelProxy> channel;
996 // Do NOT expand ifdef or run time condition checks here! Synchronous 1007 // Do NOT expand ifdef or run time condition checks here! Synchronous
997 // IPCs from browser process are banned. It is only narrowly allowed 1008 // IPCs from browser process are banned. It is only narrowly allowed
998 // for Android WebView to maintain backward compatibility. 1009 // for Android WebView to maintain backward compatibility.
999 // See crbug.com/526842 for details. 1010 // See crbug.com/526842 for details.
1000 #if defined(OS_ANDROID) 1011 #if defined(OS_ANDROID)
1001 if (GetContentClient()->UsingSynchronousCompositing()) { 1012 if (GetContentClient()->UsingSynchronousCompositing())
1002 return IPC::SyncChannel::Create( 1013 channel = IPC::SyncChannel::Create(this, runner.get(), &never_signaled_);
1003 std::move(channel_factory), this, runner.get(), true, &never_signaled_);
1004 }
1005 #endif // OS_ANDROID 1014 #endif // OS_ANDROID
1006 1015 if (!channel)
1007 std::unique_ptr<IPC::ChannelProxy> channel( 1016 channel.reset(new IPC::ChannelProxy(this, runner.get()));
1008 new IPC::ChannelProxy(this, runner.get()));
1009 #if USE_ATTACHMENT_BROKER 1017 #if USE_ATTACHMENT_BROKER
1010 IPC::AttachmentBroker::GetGlobal()->RegisterCommunicationChannel( 1018 IPC::AttachmentBroker::GetGlobal()->RegisterCommunicationChannel(
1011 channel.get(), runner); 1019 channel.get(), runner);
1012 #endif 1020 #endif
1013 channel->Init(std::move(channel_factory), true); 1021 channel->Init(std::move(channel_factory), true /* create_pipe_now */);
1022
1014 return channel; 1023 return channel;
1015 } 1024 }
1016 1025
1017 void RenderProcessHostImpl::CreateMessageFilters() { 1026 void RenderProcessHostImpl::CreateMessageFilters() {
1018 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1027 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1019 AddFilter(new ResourceSchedulerFilter(GetID())); 1028 AddFilter(new ResourceSchedulerFilter(GetID()));
1020 MediaInternals* media_internals = MediaInternals::GetInstance(); 1029 MediaInternals* media_internals = MediaInternals::GetInstance();
1021 // Add BrowserPluginMessageFilter to ensure it gets the first stab at messages 1030 // Add BrowserPluginMessageFilter to ensure it gets the first stab at messages
1022 // from guests. 1031 // from guests.
1023 scoped_refptr<BrowserPluginMessageFilter> bp_message_filter( 1032 scoped_refptr<BrowserPluginMessageFilter> bp_message_filter(
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 void RenderProcessHostImpl::RegisterMojoInterfaces() { 1214 void RenderProcessHostImpl::RegisterMojoInterfaces() {
1206 std::unique_ptr<shell::InterfaceRegistry> registry( 1215 std::unique_ptr<shell::InterfaceRegistry> registry(
1207 new shell::InterfaceRegistry); 1216 new shell::InterfaceRegistry);
1208 #if defined(OS_ANDROID) 1217 #if defined(OS_ANDROID)
1209 interface_registry_android_ = 1218 interface_registry_android_ =
1210 InterfaceRegistryAndroid::Create(registry.get()); 1219 InterfaceRegistryAndroid::Create(registry.get());
1211 InterfaceRegistrarAndroid::ExposeInterfacesToRenderer( 1220 InterfaceRegistrarAndroid::ExposeInterfacesToRenderer(
1212 interface_registry_android_.get()); 1221 interface_registry_android_.get());
1213 #endif 1222 #endif
1214 1223
1224 channel_->AddAssociatedInterface(
1225 base::Bind(&RenderProcessHostImpl::OnRouteProviderRequest,
1226 base::Unretained(this)));
1227
1215 #if !defined(OS_ANDROID) 1228 #if !defined(OS_ANDROID)
1216 AddUIThreadInterface( 1229 AddUIThreadInterface(
1217 registry.get(), base::Bind(&device::BatteryMonitorImpl::Create)); 1230 registry.get(), base::Bind(&device::BatteryMonitorImpl::Create));
1218 #endif 1231 #endif
1219 AddUIThreadInterface( 1232 AddUIThreadInterface(
1220 registry.get(), 1233 registry.get(),
1221 base::Bind(&PermissionServiceContext::CreateService, 1234 base::Bind(&PermissionServiceContext::CreateService,
1222 base::Unretained(permission_service_context_.get()))); 1235 base::Unretained(permission_service_context_.get())));
1223 // TODO(mcasas): finalize arguments. 1236 // TODO(mcasas): finalize arguments.
1224 AddUIThreadInterface(registry.get(), base::Bind(&ImageCaptureImpl::Create)); 1237 AddUIThreadInterface(registry.get(), base::Bind(&ImageCaptureImpl::Create));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 MojoShellConnection* mojo_shell_connection = 1293 MojoShellConnection* mojo_shell_connection =
1281 BrowserContext::GetMojoShellConnectionFor(browser_context_); 1294 BrowserContext::GetMojoShellConnectionFor(browser_context_);
1282 std::unique_ptr<ConnectionFilterImpl> connection_filter( 1295 std::unique_ptr<ConnectionFilterImpl> connection_filter(
1283 new ConnectionFilterImpl(mojo_child_connection_->child_identity(), 1296 new ConnectionFilterImpl(mojo_child_connection_->child_identity(),
1284 std::move(registry))); 1297 std::move(registry)));
1285 connection_filter_controller_ = connection_filter->controller(); 1298 connection_filter_controller_ = connection_filter->controller();
1286 connection_filter_id_ = 1299 connection_filter_id_ =
1287 mojo_shell_connection->AddConnectionFilter(std::move(connection_filter)); 1300 mojo_shell_connection->AddConnectionFilter(std::move(connection_filter));
1288 } 1301 }
1289 1302
1303 void RenderProcessHostImpl::GetRoute(
1304 int32_t routing_id,
1305 mojom::AssociatedInterfaceProviderAssociatedRequest request) {
1306 DCHECK(request.is_pending());
1307 associated_interface_provider_bindings_.AddBinding(
1308 this, std::move(request),
1309 reinterpret_cast<void*>(static_cast<uintptr_t>(routing_id)));
1310 }
1311
1312 void RenderProcessHostImpl::GetAssociatedInterface(
1313 const std::string& name,
1314 mojom::AssociatedInterfaceAssociatedRequest request) {
1315 int32_t routing_id = static_cast<int32_t>(reinterpret_cast<uintptr_t>(
1316 associated_interface_provider_bindings_.dispatch_context()));
1317 IPC::Listener* listener = listeners_.Lookup(routing_id);
1318 if (listener)
1319 listener->OnAssociatedInterfaceRequest(name, request.PassHandle());
1320 }
1321
1290 void RenderProcessHostImpl::CreateStoragePartitionService( 1322 void RenderProcessHostImpl::CreateStoragePartitionService(
1291 mojo::InterfaceRequest<mojom::StoragePartitionService> request) { 1323 mojo::InterfaceRequest<mojom::StoragePartitionService> request) {
1292 // DO NOT REMOVE THIS COMMAND LINE CHECK WITHOUT SECURITY REVIEW! 1324 // DO NOT REMOVE THIS COMMAND LINE CHECK WITHOUT SECURITY REVIEW!
1293 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1325 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1294 switches::kMojoLocalStorage)) { 1326 switches::kMojoLocalStorage)) {
1295 storage_partition_impl_->Bind(std::move(request)); 1327 storage_partition_impl_->Bind(std::move(request));
1296 } 1328 }
1297 } 1329 }
1298 1330
1299 int RenderProcessHostImpl::GetNextRoutingID() { 1331 int RenderProcessHostImpl::GetNextRoutingID() {
1300 return widget_helper_->GetNextRoutingID(); 1332 return widget_helper_->GetNextRoutingID();
1301 } 1333 }
1302 1334
1303 void RenderProcessHostImpl::ResumeDeferredNavigation( 1335 void RenderProcessHostImpl::ResumeDeferredNavigation(
1304 const GlobalRequestID& request_id) { 1336 const GlobalRequestID& request_id) {
1305 widget_helper_->ResumeDeferredNavigation(request_id); 1337 widget_helper_->ResumeDeferredNavigation(request_id);
1306 } 1338 }
1307 1339
1308 void RenderProcessHostImpl::NotifyTimezoneChange(const std::string& zone_id) { 1340 void RenderProcessHostImpl::NotifyTimezoneChange(const std::string& zone_id) {
1309 Send(new ViewMsg_TimezoneChange(zone_id)); 1341 Send(new ViewMsg_TimezoneChange(zone_id));
1310 } 1342 }
1311 1343
1312 shell::InterfaceProvider* RenderProcessHostImpl::GetRemoteInterfaces() { 1344 shell::InterfaceProvider* RenderProcessHostImpl::GetRemoteInterfaces() {
1313 return mojo_child_connection_->GetRemoteInterfaces(); 1345 return mojo_child_connection_->GetRemoteInterfaces();
1314 } 1346 }
1315 1347
1348 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() {
1349 if (!remote_route_provider_) {
1350 DCHECK(channel_);
1351 channel_->GetRemoteAssociatedInterface(&remote_route_provider_);
1352 }
1353 return remote_route_provider_.get();
1354 }
1355
1316 std::unique_ptr<base::SharedPersistentMemoryAllocator> 1356 std::unique_ptr<base::SharedPersistentMemoryAllocator>
1317 RenderProcessHostImpl::TakeMetricsAllocator() { 1357 RenderProcessHostImpl::TakeMetricsAllocator() {
1318 return std::move(metrics_allocator_); 1358 return std::move(metrics_allocator_);
1319 } 1359 }
1320 1360
1321 const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics() 1361 const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics()
1322 const { 1362 const {
1323 return init_time_; 1363 return init_time_;
1324 } 1364 }
1325 1365
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 } 1414 }
1375 1415
1376 void RenderProcessHostImpl::AddRoute(int32_t routing_id, 1416 void RenderProcessHostImpl::AddRoute(int32_t routing_id,
1377 IPC::Listener* listener) { 1417 IPC::Listener* listener) {
1378 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " 1418 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: "
1379 << routing_id; 1419 << routing_id;
1380 listeners_.AddWithID(listener, routing_id); 1420 listeners_.AddWithID(listener, routing_id);
1381 } 1421 }
1382 1422
1383 void RenderProcessHostImpl::RemoveRoute(int32_t routing_id) { 1423 void RenderProcessHostImpl::RemoveRoute(int32_t routing_id) {
1384 DCHECK(listeners_.Lookup(routing_id) != NULL); 1424 DCHECK(listeners_.Lookup(routing_id) != nullptr);
1385 listeners_.Remove(routing_id); 1425 listeners_.Remove(routing_id);
1386 Cleanup(); 1426 Cleanup();
1387 } 1427 }
1388 1428
1389 void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) { 1429 void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) {
1390 observers_.AddObserver(observer); 1430 observers_.AddObserver(observer);
1391 } 1431 }
1392 1432
1393 void RenderProcessHostImpl::RemoveObserver( 1433 void RenderProcessHostImpl::RemoveObserver(
1394 RenderProcessHostObserver* observer) { 1434 RenderProcessHostObserver* observer) {
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 // Set this before ProcessDied() so observers can tell if the render process 1919 // Set this before ProcessDied() so observers can tell if the render process
1880 // died due to fast shutdown versus another cause. 1920 // died due to fast shutdown versus another cause.
1881 fast_shutdown_started_ = true; 1921 fast_shutdown_started_ = true;
1882 1922
1883 ProcessDied(false /* already_dead */, nullptr); 1923 ProcessDied(false /* already_dead */, nullptr);
1884 return true; 1924 return true;
1885 } 1925 }
1886 1926
1887 bool RenderProcessHostImpl::Send(IPC::Message* msg) { 1927 bool RenderProcessHostImpl::Send(IPC::Message* msg) {
1888 TRACE_EVENT0("renderer_host", "RenderProcessHostImpl::Send"); 1928 TRACE_EVENT0("renderer_host", "RenderProcessHostImpl::Send");
1929
1930 std::unique_ptr<IPC::Message> message(msg);
1931
1889 #if !defined(OS_ANDROID) 1932 #if !defined(OS_ANDROID)
1890 DCHECK(!msg->is_sync()); 1933 DCHECK(!message->is_sync());
1891 #endif 1934 #endif
1892 1935
1893 if (!channel_) { 1936 if (!channel_) {
1894 #if defined(OS_ANDROID) 1937 #if defined(OS_ANDROID)
1895 if (msg->is_sync()) { 1938 if (message->is_sync())
1896 delete msg;
1897 return false; 1939 return false;
1898 }
1899 #endif 1940 #endif
1900 if (!is_initialized_) { 1941 if (!is_initialized_) {
1901 queued_messages_.push(msg); 1942 queued_messages_.emplace(std::move(message));
1902 return true; 1943 return true;
1903 } else {
1904 delete msg;
1905 return false;
1906 } 1944 }
1945 return false;
1907 } 1946 }
1908 1947
1909 if (child_process_launcher_.get() && child_process_launcher_->IsStarting()) {
1910 #if defined(OS_ANDROID) 1948 #if defined(OS_ANDROID)
1911 if (msg->is_sync()) { 1949 if (child_process_launcher_.get() && child_process_launcher_->IsStarting() &&
1912 delete msg; 1950 message->is_sync()) {
1913 return false; 1951 return false;
1914 } 1952 }
1915 #endif 1953 #endif
1916 queued_messages_.push(msg);
1917 return true;
1918 }
1919 1954
1920 return channel_->Send(msg); 1955 return channel_->Send(message.release());
1921 } 1956 }
1922 1957
1923 bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) { 1958 bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) {
1924 // If we're about to be deleted, or have initiated the fast shutdown sequence, 1959 // If we're about to be deleted, or have initiated the fast shutdown sequence,
1925 // we ignore incoming messages. 1960 // we ignore incoming messages.
1926 1961
1927 if (deleting_soon_ || fast_shutdown_started_) 1962 if (deleting_soon_ || fast_shutdown_started_)
1928 return false; 1963 return false;
1929 1964
1930 mark_child_process_activity_time(); 1965 mark_child_process_activity_time();
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
2566 return; 2601 return;
2567 metrics_allocator_.reset(new base::SharedPersistentMemoryAllocator( 2602 metrics_allocator_.reset(new base::SharedPersistentMemoryAllocator(
2568 std::move(shm), GetID(), "RendererMetrics", /*readonly=*/false)); 2603 std::move(shm), GetID(), "RendererMetrics", /*readonly=*/false));
2569 2604
2570 base::SharedMemoryHandle shm_handle; 2605 base::SharedMemoryHandle shm_handle;
2571 metrics_allocator_->shared_memory()->ShareToProcess(destination, &shm_handle); 2606 metrics_allocator_->shared_memory()->ShareToProcess(destination, &shm_handle);
2572 Send(new ChildProcessMsg_SetHistogramMemory( 2607 Send(new ChildProcessMsg_SetHistogramMemory(
2573 shm_handle, metrics_allocator_->shared_memory()->mapped_size())); 2608 shm_handle, metrics_allocator_->shared_memory()->mapped_size()));
2574 } 2609 }
2575 2610
2611 void RenderProcessHostImpl::OnRouteProviderRequest(
2612 mojom::RouteProviderAssociatedRequest request) {
2613 if (route_provider_binding_.is_bound())
2614 return;
2615 route_provider_binding_.Bind(std::move(request));
2616 }
2617
2576 void RenderProcessHostImpl::ProcessDied(bool already_dead, 2618 void RenderProcessHostImpl::ProcessDied(bool already_dead,
2577 RendererClosedDetails* known_details) { 2619 RendererClosedDetails* known_details) {
2578 // Our child process has died. If we didn't expect it, it's a crash. 2620 // Our child process has died. If we didn't expect it, it's a crash.
2579 // In any case, we need to let everyone know it's gone. 2621 // In any case, we need to let everyone know it's gone.
2580 // The OnChannelError notification can fire multiple times due to nested sync 2622 // The OnChannelError notification can fire multiple times due to nested sync
2581 // calls to a renderer. If we don't have a valid channel here it means we 2623 // calls to a renderer. If we don't have a valid channel here it means we
2582 // already handled the error. 2624 // already handled the error.
2583 2625
2584 // It should not be possible for us to be called re-entrantly. 2626 // It should not be possible for us to be called re-entrantly.
2585 DCHECK(!within_process_died_observer_); 2627 DCHECK(!within_process_died_observer_);
(...skipping 24 matching lines...) Expand all
2610 } 2652 }
2611 2653
2612 RendererClosedDetails details(status, exit_code); 2654 RendererClosedDetails details(status, exit_code);
2613 2655
2614 child_process_launcher_.reset(); 2656 child_process_launcher_.reset();
2615 #if USE_ATTACHMENT_BROKER 2657 #if USE_ATTACHMENT_BROKER
2616 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel( 2658 IPC::AttachmentBroker::GetGlobal()->DeregisterCommunicationChannel(
2617 channel_.get()); 2659 channel_.get());
2618 #endif 2660 #endif
2619 channel_.reset(); 2661 channel_.reset();
2620 while (!queued_messages_.empty()) { 2662 while (!queued_messages_.empty())
2621 delete queued_messages_.front();
2622 queued_messages_.pop(); 2663 queued_messages_.pop();
2623 }
2624 UpdateProcessPriority(); 2664 UpdateProcessPriority();
2625 DCHECK(!is_process_backgrounded_); 2665 DCHECK(!is_process_backgrounded_);
2626 2666
2627 // RenderProcessExited observers and RenderProcessGone handlers might 2667 // RenderProcessExited observers and RenderProcessGone handlers might
2628 // navigate or perform other actions that require a connection. Ensure that 2668 // navigate or perform other actions that require a connection. Ensure that
2629 // there is one before calling them. 2669 // there is one before calling them.
2630 child_token_ = mojo::edk::GenerateRandomToken(); 2670 child_token_ = mojo::edk::GenerateRandomToken();
2631 shell::Connector* connector = 2671 shell::Connector* connector =
2632 BrowserContext::GetShellConnectorFor(browser_context_); 2672 BrowserContext::GetShellConnectorFor(browser_context_);
2633 if (!connector) 2673 if (!connector)
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2764 // especially don't want to send the RENDERER_PROCESS_CREATED notification, 2804 // especially don't want to send the RENDERER_PROCESS_CREATED notification,
2765 // since some clients might expect a RENDERER_PROCESS_TERMINATED afterwards to 2805 // since some clients might expect a RENDERER_PROCESS_TERMINATED afterwards to
2766 // properly cleanup. 2806 // properly cleanup.
2767 if (deleting_soon_) 2807 if (deleting_soon_)
2768 return; 2808 return;
2769 2809
2770 if (child_process_launcher_) { 2810 if (child_process_launcher_) {
2771 DCHECK(child_process_launcher_->GetProcess().IsValid()); 2811 DCHECK(child_process_launcher_->GetProcess().IsValid());
2772 DCHECK(!is_process_backgrounded_); 2812 DCHECK(!is_process_backgrounded_);
2773 2813
2814 // Unpause the channel now that the process is launched. We don't flush it
2815 // yet to ensure that any initialization messages sent here (e.g., things
2816 // done in response to NOTIFICATION_RENDER_PROCESS_CREATED; see below)
2817 // preempt already queued messages.
2818 channel_->Unpause(false /* flush */);
2819
2774 if (mojo_child_connection_) { 2820 if (mojo_child_connection_) {
2775 mojo_child_connection_->SetProcessHandle( 2821 mojo_child_connection_->SetProcessHandle(
2776 child_process_launcher_->GetProcess().Handle()); 2822 child_process_launcher_->GetProcess().Handle());
2777 } 2823 }
2778 2824
2779 // Not all platforms launch processes in the same backgrounded state. Make 2825 // Not all platforms launch processes in the same backgrounded state. Make
2780 // sure |is_process_backgrounded_| reflects this platform's initial process 2826 // sure |is_process_backgrounded_| reflects this platform's initial process
2781 // state. 2827 // state.
2782 is_process_backgrounded_ = 2828 is_process_backgrounded_ =
2783 child_process_launcher_->GetProcess().IsProcessBackgrounded(); 2829 child_process_launcher_->GetProcess().IsProcessBackgrounded();
2784 2830
2785 // Disable updating process priority on startup for now as it incorrectly 2831 // Disable updating process priority on startup for now as it incorrectly
2786 // results in backgrounding foreground navigations until their first commit 2832 // results in backgrounding foreground navigations until their first commit
2787 // is made. A better long term solution would be to be aware of the tab's 2833 // is made. A better long term solution would be to be aware of the tab's
2788 // visibility at this point. https://crbug.com/560446. 2834 // visibility at this point. https://crbug.com/560446.
2789 // Except on Android for now because of https://crbug.com/601184 :-(. 2835 // Except on Android for now because of https://crbug.com/601184 :-(.
2790 #if defined(OS_ANDROID) 2836 #if defined(OS_ANDROID)
2791 UpdateProcessPriority(); 2837 UpdateProcessPriority();
2792 #endif 2838 #endif
2793 2839
2794 // Share histograms between the renderer and this process. 2840 // Share histograms between the renderer and this process.
2795 CreateSharedRendererHistogramAllocator(); 2841 CreateSharedRendererHistogramAllocator();
2796 } 2842 }
2797 2843
2798 // NOTE: This needs to be before sending queued messages because 2844 // NOTE: This needs to be before flushing queued messages, because
2799 // ExtensionService uses this notification to initialize the renderer process 2845 // ExtensionService uses this notification to initialize the renderer process
2800 // with state that must be there before any JavaScript executes. 2846 // with state that must be there before any JavaScript executes.
2801 // 2847 //
2802 // The queued messages contain such things as "navigate". If this notification 2848 // The queued messages contain such things as "navigate". If this notification
2803 // was after, we can end up executing JavaScript before the initialization 2849 // was after, we can end up executing JavaScript before the initialization
2804 // happens. 2850 // happens.
2805 NotificationService::current()->Notify(NOTIFICATION_RENDERER_PROCESS_CREATED, 2851 NotificationService::current()->Notify(NOTIFICATION_RENDERER_PROCESS_CREATED,
2806 Source<RenderProcessHost>(this), 2852 Source<RenderProcessHost>(this),
2807 NotificationService::NoDetails()); 2853 NotificationService::NoDetails());
2808 2854
2809 while (!queued_messages_.empty()) { 2855 if (child_process_launcher_)
2810 Send(queued_messages_.front()); 2856 channel_->Flush();
2811 queued_messages_.pop();
2812 }
2813 2857
2814 if (IsReady()) { 2858 if (IsReady()) {
2815 DCHECK(!sent_render_process_ready_); 2859 DCHECK(!sent_render_process_ready_);
2816 sent_render_process_ready_ = true; 2860 sent_render_process_ready_ = true;
2817 // Send RenderProcessReady only if the channel is already connected. 2861 // Send RenderProcessReady only if the channel is already connected.
2818 FOR_EACH_OBSERVER(RenderProcessHostObserver, 2862 FOR_EACH_OBSERVER(RenderProcessHostObserver,
2819 observers_, 2863 observers_,
2820 RenderProcessReady(this)); 2864 RenderProcessReady(this));
2821 } 2865 }
2822 2866
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2965 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; 3009 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error;
2966 3010
2967 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias 3011 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias
2968 // enough information here so that we can determine what the bad message was. 3012 // enough information here so that we can determine what the bad message was.
2969 base::debug::Alias(&error); 3013 base::debug::Alias(&error);
2970 bad_message::ReceivedBadMessage(process.get(), 3014 bad_message::ReceivedBadMessage(process.get(),
2971 bad_message::RPH_MOJO_PROCESS_ERROR); 3015 bad_message::RPH_MOJO_PROCESS_ERROR);
2972 } 3016 }
2973 3017
2974 } // namespace content 3018 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698