Chromium Code Reviews| Index: content/renderer/render_thread_impl.cc |
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
| index 41137e503dd1d8923984bbeb6950c827312cda56..465437f1e3a569b5ab5662331d2d5492964374db 100644 |
| --- a/content/renderer/render_thread_impl.cc |
| +++ b/content/renderer/render_thread_impl.cc |
| @@ -874,9 +874,10 @@ void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) { |
| scoped_refptr<PendingRenderFrameConnect> connection(it->second); |
| mojo::InterfaceRequest<mojo::ServiceProvider> services( |
| - connection->services.Pass()); |
| + connection->services().Pass()); |
| mojo::ServiceProviderPtr exposed_services( |
| - connection->exposed_services.Pass()); |
| + connection->exposed_services().Pass()); |
| + exposed_services.set_error_handler(nullptr); |
| pending_render_frame_connects_.erase(it); |
| frame->BindServiceRegistry(services.Pass(), exposed_services.Pass()); |
| @@ -911,8 +912,7 @@ void RenderThreadImpl::RegisterPendingRenderFrameConnect( |
| pending_render_frame_connects_.insert(std::make_pair( |
| routing_id, |
| make_scoped_refptr(new PendingRenderFrameConnect( |
| - services.Pass(), |
| - exposed_services.Pass())))); |
| + routing_id, services.Pass(), exposed_services.Pass())))); |
| CHECK(result.second) << "Inserting a duplicate item."; |
| } |
| @@ -1790,13 +1790,26 @@ void RenderThreadImpl::WidgetRestored() { |
| } |
| RenderThreadImpl::PendingRenderFrameConnect::PendingRenderFrameConnect( |
| + int routing_id, |
| mojo::InterfaceRequest<mojo::ServiceProvider> services, |
| mojo::ServiceProviderPtr exposed_services) |
| - : services(services.Pass()), |
| - exposed_services(exposed_services.Pass()) { |
| + : routing_id_(routing_id), |
| + services_(services.Pass()), |
| + exposed_services_(exposed_services.Pass()) { |
| + // The RenderFrame may be deleted before the ExchangeServiceProviders message |
| + // is received. In that case, the RenderFrameHost should close the connection, |
| + // which is detected by setting an error handler on |exposed_services_|. |
| + exposed_services_.set_error_handler(this); |
| } |
| RenderThreadImpl::PendingRenderFrameConnect::~PendingRenderFrameConnect() { |
| } |
| +void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { |
| + size_t erased = |
| + RenderThreadImpl::current()->pending_render_frame_connects_.erase( |
| + routing_id_); |
| + DCHECK_EQ(erased, 1u); |
|
Avi (use Gerrit)
2015/03/13 13:54:07
Put the expected value first; if the DCHECK fails,
Sam McNally
2015/03/15 22:28:19
Done.
|
| +} |
| + |
| } // namespace content |