| 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 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 } | 356 } |
| 357 | 357 |
| 358 class RenderFrameSetupImpl : public mojom::RenderFrameSetup { | 358 class RenderFrameSetupImpl : public mojom::RenderFrameSetup { |
| 359 public: | 359 public: |
| 360 explicit RenderFrameSetupImpl( | 360 explicit RenderFrameSetupImpl( |
| 361 mojo::InterfaceRequest<mojom::RenderFrameSetup> request) | 361 mojo::InterfaceRequest<mojom::RenderFrameSetup> request) |
| 362 : routing_id_highmark_(-1), binding_(this, std::move(request)) {} | 362 : routing_id_highmark_(-1), binding_(this, std::move(request)) {} |
| 363 | 363 |
| 364 void ExchangeInterfaceProviders( | 364 void ExchangeInterfaceProviders( |
| 365 int32_t frame_routing_id, | 365 int32_t frame_routing_id, |
| 366 mojo::shell::mojom::InterfaceProviderRequest services, | 366 shell::mojom::InterfaceProviderRequest services, |
| 367 mojo::shell::mojom::InterfaceProviderPtr exposed_services) | 367 shell::mojom::InterfaceProviderPtr exposed_services) override { |
| 368 override { | |
| 369 // TODO(morrita): This is for investigating http://crbug.com/415059 and | 368 // TODO(morrita): This is for investigating http://crbug.com/415059 and |
| 370 // should be removed once it is fixed. | 369 // should be removed once it is fixed. |
| 371 CHECK_LT(routing_id_highmark_, frame_routing_id); | 370 CHECK_LT(routing_id_highmark_, frame_routing_id); |
| 372 routing_id_highmark_ = frame_routing_id; | 371 routing_id_highmark_ = frame_routing_id; |
| 373 | 372 |
| 374 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id); | 373 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| 375 // We can receive a GetServiceProviderForFrame message for a frame not yet | 374 // We can receive a GetServiceProviderForFrame message for a frame not yet |
| 376 // created due to a race between the message and a ViewMsg_New IPC that | 375 // created due to a race between the message and a ViewMsg_New IPC that |
| 377 // triggers creation of the RenderFrame we want. | 376 // triggers creation of the RenderFrame we want. |
| 378 if (!frame) { | 377 if (!frame) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 389 int32_t routing_id_highmark_; | 388 int32_t routing_id_highmark_; |
| 390 mojo::StrongBinding<mojom::RenderFrameSetup> binding_; | 389 mojo::StrongBinding<mojom::RenderFrameSetup> binding_; |
| 391 }; | 390 }; |
| 392 | 391 |
| 393 void CreateRenderFrameSetup( | 392 void CreateRenderFrameSetup( |
| 394 mojo::InterfaceRequest<mojom::RenderFrameSetup> request) { | 393 mojo::InterfaceRequest<mojom::RenderFrameSetup> request) { |
| 395 new RenderFrameSetupImpl(std::move(request)); | 394 new RenderFrameSetupImpl(std::move(request)); |
| 396 } | 395 } |
| 397 | 396 |
| 398 void SetupEmbeddedWorkerOnWorkerThread( | 397 void SetupEmbeddedWorkerOnWorkerThread( |
| 399 mojo::shell::mojom::InterfaceProviderRequest services, | 398 shell::mojom::InterfaceProviderRequest services, |
| 400 mojo::shell::mojom::InterfaceProviderPtrInfo exposed_services) { | 399 shell::mojom::InterfaceProviderPtrInfo exposed_services) { |
| 401 ServiceWorkerContextClient* client = | 400 ServiceWorkerContextClient* client = |
| 402 ServiceWorkerContextClient::ThreadSpecificInstance(); | 401 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 403 // It is possible for client to be null if for some reason the worker died | 402 // It is possible for client to be null if for some reason the worker died |
| 404 // before this call made it to the worker thread. In that case just do | 403 // before this call made it to the worker thread. In that case just do |
| 405 // nothing and let mojo close the connection. | 404 // nothing and let mojo close the connection. |
| 406 if (!client) | 405 if (!client) |
| 407 return; | 406 return; |
| 408 client->BindServiceRegistry(std::move(services), | 407 client->BindServiceRegistry(std::move(services), |
| 409 mojo::MakeProxy(std::move(exposed_services))); | 408 mojo::MakeProxy(std::move(exposed_services))); |
| 410 } | 409 } |
| 411 | 410 |
| 412 class EmbeddedWorkerSetupImpl : public mojom::EmbeddedWorkerSetup { | 411 class EmbeddedWorkerSetupImpl : public mojom::EmbeddedWorkerSetup { |
| 413 public: | 412 public: |
| 414 explicit EmbeddedWorkerSetupImpl( | 413 explicit EmbeddedWorkerSetupImpl( |
| 415 mojo::InterfaceRequest<mojom::EmbeddedWorkerSetup> request) | 414 mojo::InterfaceRequest<mojom::EmbeddedWorkerSetup> request) |
| 416 : binding_(this, std::move(request)) {} | 415 : binding_(this, std::move(request)) {} |
| 417 | 416 |
| 418 void ExchangeInterfaceProviders( | 417 void ExchangeInterfaceProviders( |
| 419 int32_t thread_id, | 418 int32_t thread_id, |
| 420 mojo::shell::mojom::InterfaceProviderRequest services, | 419 shell::mojom::InterfaceProviderRequest services, |
| 421 mojo::shell::mojom::InterfaceProviderPtr exposed_services) override { | 420 shell::mojom::InterfaceProviderPtr exposed_services) override { |
| 422 WorkerThreadRegistry::Instance()->GetTaskRunnerFor(thread_id)->PostTask( | 421 WorkerThreadRegistry::Instance()->GetTaskRunnerFor(thread_id)->PostTask( |
| 423 FROM_HERE, | 422 FROM_HERE, |
| 424 base::Bind(&SetupEmbeddedWorkerOnWorkerThread, base::Passed(&services), | 423 base::Bind(&SetupEmbeddedWorkerOnWorkerThread, base::Passed(&services), |
| 425 base::Passed(exposed_services.PassInterface()))); | 424 base::Passed(exposed_services.PassInterface()))); |
| 426 } | 425 } |
| 427 | 426 |
| 428 private: | 427 private: |
| 429 mojo::StrongBinding<mojom::EmbeddedWorkerSetup> binding_; | 428 mojo::StrongBinding<mojom::EmbeddedWorkerSetup> binding_; |
| 430 }; | 429 }; |
| 431 | 430 |
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1042 PendingRenderFrameConnectMap::iterator it = | 1041 PendingRenderFrameConnectMap::iterator it = |
| 1043 pending_render_frame_connects_.find(routing_id); | 1042 pending_render_frame_connects_.find(routing_id); |
| 1044 if (it == pending_render_frame_connects_.end()) | 1043 if (it == pending_render_frame_connects_.end()) |
| 1045 return; | 1044 return; |
| 1046 | 1045 |
| 1047 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(routing_id); | 1046 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(routing_id); |
| 1048 if (!frame) | 1047 if (!frame) |
| 1049 return; | 1048 return; |
| 1050 | 1049 |
| 1051 scoped_refptr<PendingRenderFrameConnect> connection(it->second); | 1050 scoped_refptr<PendingRenderFrameConnect> connection(it->second); |
| 1052 mojo::shell::mojom::InterfaceProviderRequest services( | 1051 shell::mojom::InterfaceProviderRequest services( |
| 1053 std::move(connection->services())); | 1052 std::move(connection->services())); |
| 1054 mojo::shell::mojom::InterfaceProviderPtr exposed_services( | 1053 shell::mojom::InterfaceProviderPtr exposed_services( |
| 1055 std::move(connection->exposed_services())); | 1054 std::move(connection->exposed_services())); |
| 1056 exposed_services.set_connection_error_handler(mojo::Closure()); | 1055 exposed_services.set_connection_error_handler(mojo::Closure()); |
| 1057 pending_render_frame_connects_.erase(it); | 1056 pending_render_frame_connects_.erase(it); |
| 1058 | 1057 |
| 1059 frame->BindServiceRegistry(std::move(services), std::move(exposed_services)); | 1058 frame->BindServiceRegistry(std::move(services), std::move(exposed_services)); |
| 1060 } | 1059 } |
| 1061 | 1060 |
| 1062 void RenderThreadImpl::RemoveRoute(int32_t routing_id) { | 1061 void RenderThreadImpl::RemoveRoute(int32_t routing_id) { |
| 1063 ChildThreadImpl::GetRouter()->RemoveRoute(routing_id); | 1062 ChildThreadImpl::GetRouter()->RemoveRoute(routing_id); |
| 1064 } | 1063 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1075 void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32_t routing_id) { | 1074 void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32_t routing_id) { |
| 1076 RemoveRoute(routing_id); | 1075 RemoveRoute(routing_id); |
| 1077 if (devtools_agent_message_filter_.get()) { | 1076 if (devtools_agent_message_filter_.get()) { |
| 1078 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread( | 1077 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread( |
| 1079 routing_id); | 1078 routing_id); |
| 1080 } | 1079 } |
| 1081 } | 1080 } |
| 1082 | 1081 |
| 1083 void RenderThreadImpl::RegisterPendingRenderFrameConnect( | 1082 void RenderThreadImpl::RegisterPendingRenderFrameConnect( |
| 1084 int routing_id, | 1083 int routing_id, |
| 1085 mojo::shell::mojom::InterfaceProviderRequest services, | 1084 shell::mojom::InterfaceProviderRequest services, |
| 1086 mojo::shell::mojom::InterfaceProviderPtr exposed_services) { | 1085 shell::mojom::InterfaceProviderPtr exposed_services) { |
| 1087 std::pair<PendingRenderFrameConnectMap::iterator, bool> result = | 1086 std::pair<PendingRenderFrameConnectMap::iterator, bool> result = |
| 1088 pending_render_frame_connects_.insert(std::make_pair( | 1087 pending_render_frame_connects_.insert(std::make_pair( |
| 1089 routing_id, | 1088 routing_id, |
| 1090 make_scoped_refptr(new PendingRenderFrameConnect( | 1089 make_scoped_refptr(new PendingRenderFrameConnect( |
| 1091 routing_id, std::move(services), std::move(exposed_services))))); | 1090 routing_id, std::move(services), std::move(exposed_services))))); |
| 1092 CHECK(result.second) << "Inserting a duplicate item."; | 1091 CHECK(result.second) << "Inserting a duplicate item."; |
| 1093 } | 1092 } |
| 1094 | 1093 |
| 1095 mojom::StoragePartitionService* RenderThreadImpl::GetStoragePartitionService() { | 1094 mojom::StoragePartitionService* RenderThreadImpl::GetStoragePartitionService() { |
| 1096 return storage_partition_service_.get(); | 1095 return storage_partition_service_.get(); |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2120 void RenderThreadImpl::ReleaseFreeMemory() { | 2119 void RenderThreadImpl::ReleaseFreeMemory() { |
| 2121 base::allocator::ReleaseFreeMemory(); | 2120 base::allocator::ReleaseFreeMemory(); |
| 2122 discardable_shared_memory_manager()->ReleaseFreeMemory(); | 2121 discardable_shared_memory_manager()->ReleaseFreeMemory(); |
| 2123 | 2122 |
| 2124 if (blink_platform_impl_) | 2123 if (blink_platform_impl_) |
| 2125 blink::decommitFreeableMemory(); | 2124 blink::decommitFreeableMemory(); |
| 2126 } | 2125 } |
| 2127 | 2126 |
| 2128 RenderThreadImpl::PendingRenderFrameConnect::PendingRenderFrameConnect( | 2127 RenderThreadImpl::PendingRenderFrameConnect::PendingRenderFrameConnect( |
| 2129 int routing_id, | 2128 int routing_id, |
| 2130 mojo::shell::mojom::InterfaceProviderRequest services, | 2129 shell::mojom::InterfaceProviderRequest services, |
| 2131 mojo::shell::mojom::InterfaceProviderPtr exposed_services) | 2130 shell::mojom::InterfaceProviderPtr exposed_services) |
| 2132 : routing_id_(routing_id), | 2131 : routing_id_(routing_id), |
| 2133 services_(std::move(services)), | 2132 services_(std::move(services)), |
| 2134 exposed_services_(std::move(exposed_services)) { | 2133 exposed_services_(std::move(exposed_services)) { |
| 2135 // The RenderFrame may be deleted before the ExchangeInterfaceProviders | 2134 // The RenderFrame may be deleted before the ExchangeInterfaceProviders |
| 2136 // message is received. In that case, the RenderFrameHost should close the | 2135 // message is received. In that case, the RenderFrameHost should close the |
| 2137 // connection, which is detected by setting an error handler on | 2136 // connection, which is detected by setting an error handler on |
| 2138 // |exposed_services_|. | 2137 // |exposed_services_|. |
| 2139 exposed_services_.set_connection_error_handler(base::Bind( | 2138 exposed_services_.set_connection_error_handler(base::Bind( |
| 2140 &RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError, | 2139 &RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError, |
| 2141 base::Unretained(this))); | 2140 base::Unretained(this))); |
| 2142 } | 2141 } |
| 2143 | 2142 |
| 2144 RenderThreadImpl::PendingRenderFrameConnect::~PendingRenderFrameConnect() { | 2143 RenderThreadImpl::PendingRenderFrameConnect::~PendingRenderFrameConnect() { |
| 2145 } | 2144 } |
| 2146 | 2145 |
| 2147 void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { | 2146 void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { |
| 2148 size_t erased = | 2147 size_t erased = |
| 2149 RenderThreadImpl::current()->pending_render_frame_connects_.erase( | 2148 RenderThreadImpl::current()->pending_render_frame_connects_.erase( |
| 2150 routing_id_); | 2149 routing_id_); |
| 2151 DCHECK_EQ(1u, erased); | 2150 DCHECK_EQ(1u, erased); |
| 2152 } | 2151 } |
| 2153 | 2152 |
| 2154 } // namespace content | 2153 } // namespace content |
| OLD | NEW |