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

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

Issue 2680973006: Mojo EDK: Add safe process connection API (Closed)
Patch Set: . Created 3 years, 10 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 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 if (renderer_path.empty()) 823 if (renderer_path.empty())
824 return false; 824 return false;
825 825
826 sent_render_process_ready_ = false; 826 sent_render_process_ready_ = false;
827 827
828 // We may reach Init() during process death notification (e.g. 828 // We may reach Init() during process death notification (e.g.
829 // RenderProcessExited on some observer). In this case the Channel may be 829 // RenderProcessExited on some observer). In this case the Channel may be
830 // null, so we re-initialize it here. 830 // null, so we re-initialize it here.
831 if (!channel_) 831 if (!channel_)
832 InitializeChannelProxy(); 832 InitializeChannelProxy();
833 DCHECK(pending_connection_);
833 834
834 // Unpause the Channel briefly. This will be paused again below if we launch a 835 // Unpause the Channel briefly. This will be paused again below if we launch a
835 // real child process. Note that messages may be sent in the short window 836 // real child process. Note that messages may be sent in the short window
836 // between now and then (e.g. in response to RenderProcessWillLaunch) and we 837 // between now and then (e.g. in response to RenderProcessWillLaunch) and we
837 // depend on those messages being sent right away. 838 // depend on those messages being sent right away.
838 // 839 //
839 // |channel_| must always be non-null here: either it was initialized in 840 // |channel_| must always be non-null here: either it was initialized in
840 // the constructor, or in the most recent call to ProcessDied(). 841 // the constructor, or in the most recent call to ProcessDied().
841 channel_->Unpause(false /* flush */); 842 channel_->Unpause(false /* flush */);
842 843
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 base::MakeUnique<base::CommandLine>(renderer_path); 904 base::MakeUnique<base::CommandLine>(renderer_path);
904 if (!renderer_prefix.empty()) 905 if (!renderer_prefix.empty())
905 cmd_line->PrependWrapper(renderer_prefix); 906 cmd_line->PrependWrapper(renderer_prefix);
906 AppendRendererCommandLine(cmd_line.get()); 907 AppendRendererCommandLine(cmd_line.get());
907 908
908 // Spawn the child process asynchronously to avoid blocking the UI thread. 909 // Spawn the child process asynchronously to avoid blocking the UI thread.
909 // As long as there's no renderer prefix, we can use the zygote process 910 // As long as there's no renderer prefix, we can use the zygote process
910 // at this stage. 911 // at this stage.
911 child_process_launcher_.reset(new ChildProcessLauncher( 912 child_process_launcher_.reset(new ChildProcessLauncher(
912 base::MakeUnique<RendererSandboxedProcessLauncherDelegate>(), 913 base::MakeUnique<RendererSandboxedProcessLauncherDelegate>(),
913 std::move(cmd_line), GetID(), this, child_token_, 914 std::move(cmd_line), GetID(), this, std::move(pending_connection_),
914 base::Bind(&RenderProcessHostImpl::OnMojoError, id_))); 915 base::Bind(&RenderProcessHostImpl::OnMojoError, id_)));
915 channel_->Pause(); 916 channel_->Pause();
916 917
917 fast_shutdown_started_ = false; 918 fast_shutdown_started_ = false;
918 } 919 }
919 920
920 if (!gpu_observer_registered_) { 921 if (!gpu_observer_registered_) {
921 gpu_observer_registered_ = true; 922 gpu_observer_registered_ = true;
922 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); 923 ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
923 } 924 }
924 925
925 is_initialized_ = true; 926 is_initialized_ = true;
926 init_time_ = base::TimeTicks::Now(); 927 init_time_ = base::TimeTicks::Now();
927 return true; 928 return true;
928 } 929 }
929 930
930 void RenderProcessHostImpl::EnableSendQueue() { 931 void RenderProcessHostImpl::EnableSendQueue() {
931 if (!channel_) 932 if (!channel_)
932 InitializeChannelProxy(); 933 InitializeChannelProxy();
933 } 934 }
934 935
935 void RenderProcessHostImpl::InitializeChannelProxy() { 936 void RenderProcessHostImpl::InitializeChannelProxy() {
936 // Generate a token used to identify the new child process.
937 child_token_ = mojo::edk::GenerateRandomToken();
938
939 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = 937 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
940 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); 938 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
941 939
942 // Acquire a Connector which will route connections to a new instance of the 940 // Acquire a Connector which will route connections to a new instance of the
943 // renderer service. 941 // renderer service.
944 service_manager::Connector* connector = 942 service_manager::Connector* connector =
945 BrowserContext::GetConnectorFor(browser_context_); 943 BrowserContext::GetConnectorFor(browser_context_);
946 if (!connector) { 944 if (!connector) {
947 // Note that some embedders (e.g. Android WebView) may not initialize a 945 // Note that some embedders (e.g. Android WebView) may not initialize a
948 // Connector per BrowserContext. In those cases we fall back to the 946 // Connector per BrowserContext. In those cases we fall back to the
949 // browser-wide Connector. 947 // browser-wide Connector.
950 if (!ServiceManagerConnection::GetForProcess()) { 948 if (!ServiceManagerConnection::GetForProcess()) {
951 // Additionally, some test code may not initialize the process-wide 949 // Additionally, some test code may not initialize the process-wide
952 // ServiceManagerConnection prior to this point. This class of test code 950 // ServiceManagerConnection prior to this point. This class of test code
953 // doesn't care about render processes, so we can initialize a dummy 951 // doesn't care about render processes, so we can initialize a dummy
954 // connection. 952 // connection.
955 service_manager::mojom::ServiceRequest request(&test_service_); 953 service_manager::mojom::ServiceRequest request(&test_service_);
956 ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create( 954 ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create(
957 std::move(request), io_task_runner)); 955 std::move(request), io_task_runner));
958 } 956 }
959 connector = ServiceManagerConnection::GetForProcess()->GetConnector(); 957 connector = ServiceManagerConnection::GetForProcess()->GetConnector();
960 } 958 }
961 959
962 // Establish a ServiceManager connection for the new render service instance. 960 // Establish a ServiceManager connection for the new render service instance.
961 pending_connection_.reset(new mojo::edk::PendingProcessConnection);
963 child_connection_.reset(new ChildConnection( 962 child_connection_.reset(new ChildConnection(
964 mojom::kRendererServiceName, 963 mojom::kRendererServiceName,
965 base::StringPrintf("%d_%d", id_, instance_id_++), child_token_, connector, 964 base::StringPrintf("%d_%d", id_, instance_id_++),
966 io_task_runner)); 965 pending_connection_.get(), connector, io_task_runner));
967 966
968 // Send an interface request to bootstrap the IPC::Channel. Note that this 967 // Send an interface request to bootstrap the IPC::Channel. Note that this
969 // request will happily sit on the pipe until the process is launched and 968 // request will happily sit on the pipe until the process is launched and
970 // connected to the ServiceManager. We take the other end immediately and 969 // connected to the ServiceManager. We take the other end immediately and
971 // plug it into a new ChannelProxy. 970 // plug it into a new ChannelProxy.
972 IPC::mojom::ChannelBootstrapPtr bootstrap; 971 IPC::mojom::ChannelBootstrapPtr bootstrap;
973 GetRemoteInterfaces()->GetInterface(&bootstrap); 972 GetRemoteInterfaces()->GetInterface(&bootstrap);
974 std::unique_ptr<IPC::ChannelFactory> channel_factory = 973 std::unique_ptr<IPC::ChannelFactory> channel_factory =
975 IPC::ChannelMojo::CreateServerFactory( 974 IPC::ChannelMojo::CreateServerFactory(
976 bootstrap.PassInterface().PassHandle(), io_task_runner); 975 bootstrap.PassInterface().PassHandle(), io_task_runner);
(...skipping 2099 matching lines...) Expand 10 before | Expand all | Expand 10 after
3076 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; 3075 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error;
3077 3076
3078 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. 3077 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing.
3079 // Capture the error message in a crash key value. 3078 // Capture the error message in a crash key value.
3080 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); 3079 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error);
3081 bad_message::ReceivedBadMessage(render_process_id, 3080 bad_message::ReceivedBadMessage(render_process_id,
3082 bad_message::RPH_MOJO_PROCESS_ERROR); 3081 bad_message::RPH_MOJO_PROCESS_ERROR);
3083 } 3082 }
3084 3083
3085 } // namespace content 3084 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_process_host_impl.h ('k') | content/common/child_process_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698