Index: content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
index 1d045dd715919590067ddf6dee7715a615815126..2cbc9989b89de29784a4080fc2048a13dc9490eb 100644 |
--- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
+++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
@@ -12,51 +12,72 @@ |
#include "content/public/common/content_client.h" |
#include "content/renderer/service_worker/embedded_worker_devtools_agent.h" |
#include "content/renderer/service_worker/service_worker_context_client.h" |
-#include "mojo/public/cpp/bindings/strong_binding.h" |
#include "third_party/WebKit/public/web/WebEmbeddedWorker.h" |
#include "third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h" |
namespace content { |
-namespace { |
- |
-void OnError() { |
- // TODO(shimazu): Implement here |
- NOTIMPLEMENTED(); |
-} |
- |
-} // namespace |
- |
// static |
void EmbeddedWorkerInstanceClientImpl::Create( |
EmbeddedWorkerDispatcher* dispatcher, |
mojo::InterfaceRequest<mojom::EmbeddedWorkerInstanceClient> request) { |
- auto binding = mojo::MakeStrongBinding( |
- base::MakeUnique<EmbeddedWorkerInstanceClientImpl>(dispatcher), |
- std::move(request)); |
- binding->set_connection_error_handler(base::Bind(&OnError)); |
+ // This won't be leaked because the lifetime will be managed internally. |
+ new EmbeddedWorkerInstanceClientImpl(dispatcher, std::move(request)); |
+} |
+ |
+void EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted() { |
+ DCHECK(embedded_worker_id_); |
+ DCHECK(stop_callback_); |
+ dispatcher_->UnregisterWorker(embedded_worker_id_.value()); |
+ embedded_worker_id_.reset(); |
+ stop_callback_.Run(); |
+ TRACE_EVENT0("ServiceWorker", |
+ "EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted"); |
+ stop_callback_.Reset(); |
} |
void EmbeddedWorkerInstanceClientImpl::StartWorker( |
const EmbeddedWorkerStartParams& params) { |
TRACE_EVENT0("ServiceWorker", |
"EmbeddedWorkerInstanceClientImpl::StartWorker"); |
+ embedded_worker_id_ = params.embedded_worker_id; |
std::unique_ptr<EmbeddedWorkerDispatcher::WorkerWrapper> wrapper = |
dispatcher_->StartWorkerContext( |
- params, |
- base::MakeUnique<ServiceWorkerContextClient>( |
- params.embedded_worker_id, params.service_worker_version_id, |
- params.scope, params.script_url, |
- params.worker_devtools_agent_route_id)); |
+ params, base::MakeUnique<ServiceWorkerContextClient>( |
+ params.embedded_worker_id, |
+ params.service_worker_version_id, params.scope, |
+ params.script_url, params.worker_devtools_agent_route_id, |
+ std::move(temporal_self_))); |
wrapper_ = wrapper.get(); |
dispatcher_->RegisterWorker(params.embedded_worker_id, std::move(wrapper)); |
} |
+void EmbeddedWorkerInstanceClientImpl::StopWorker( |
+ const StopWorkerCallback& callback) { |
+ DCHECK(embedded_worker_id_); |
+ DCHECK(!stop_callback_); |
+ TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StopWorker"); |
+ stop_callback_ = std::move(callback); |
+ dispatcher_->RecordStopWorkerTimer(embedded_worker_id_.value()); |
+ wrapper_->worker()->terminateWorkerContext(); |
+} |
+ |
EmbeddedWorkerInstanceClientImpl::EmbeddedWorkerInstanceClientImpl( |
- EmbeddedWorkerDispatcher* dispatcher) |
- : dispatcher_(dispatcher) {} |
+ EmbeddedWorkerDispatcher* dispatcher, |
+ mojo::InterfaceRequest<mojom::EmbeddedWorkerInstanceClient> request) |
+ : dispatcher_(dispatcher), |
+ binding_(this, std::move(request)), |
+ temporal_self_(std::unique_ptr<EmbeddedWorkerInstanceClientImpl>(this)) { |
+ binding_.set_connection_error_handler(base::Bind( |
+ &EmbeddedWorkerInstanceClientImpl::OnError, base::Unretained(this))); |
+} |
EmbeddedWorkerInstanceClientImpl::~EmbeddedWorkerInstanceClientImpl() {} |
+void EmbeddedWorkerInstanceClientImpl::OnError() { |
+ // Removes myself if it's owned by myself. |
+ temporal_self_.reset(); |
+} |
+ |
} // namespace content |