| 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 726595e4abddd697b51c80e3e8647c3ef60b641e..7de9b338402e5fce10715075263a612ecf70086e 100644
|
| --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
|
| +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
|
| @@ -7,6 +7,7 @@
|
| #include <memory>
|
|
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "content/child/scoped_child_process_reference.h"
|
| #include "content/common/service_worker/embedded_worker_messages.h"
|
| @@ -18,64 +19,63 @@
|
|
|
| namespace content {
|
|
|
| +EmbeddedWorkerInstanceClientImpl::WorkerWrapper::WorkerWrapper(
|
| + blink::WebEmbeddedWorker* worker,
|
| + int devtools_agent_route_id)
|
| + : worker_(worker),
|
| + devtools_agent_(base::MakeUnique<EmbeddedWorkerDevToolsAgent>(
|
| + worker,
|
| + devtools_agent_route_id)) {}
|
| +
|
| +EmbeddedWorkerInstanceClientImpl::WorkerWrapper::~WorkerWrapper() = default;
|
| +
|
| // static
|
| void EmbeddedWorkerInstanceClientImpl::Create(
|
| - EmbeddedWorkerDispatcher* dispatcher,
|
| mojo::InterfaceRequest<mojom::EmbeddedWorkerInstanceClient> request) {
|
| // This won't be leaked because the lifetime will be managed internally.
|
| - new EmbeddedWorkerInstanceClientImpl(dispatcher, std::move(request));
|
| + new EmbeddedWorkerInstanceClientImpl(std::move(request));
|
| }
|
|
|
| -void EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted() {
|
| - DCHECK(embedded_worker_id_);
|
| - DCHECK(stop_callback_);
|
| +void EmbeddedWorkerInstanceClientImpl::WorkerContextDestroyed() {
|
| + DCHECK(wrapper_);
|
| TRACE_EVENT0("ServiceWorker",
|
| - "EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted");
|
| - // TODO(falken): The signals to the browser should be in the order:
|
| - // (1) WorkerStopped (via stop_callback_)
|
| - // (2) ProviderDestroyed (via UnregisterWorker destroying
|
| - // WebEmbeddedWorkerImpl)
|
| - // But this ordering is currently not guaranteed since the Mojo pipes are
|
| - // different. https://crbug.com/676526
|
| - stop_callback_.Run();
|
| - stop_callback_.Reset();
|
| - dispatcher_->UnregisterWorker(embedded_worker_id_.value());
|
| - embedded_worker_id_.reset();
|
| - wrapper_ = nullptr;
|
| + "EmbeddedWorkerInstanceClientImpl::WorkerContextDestroyed");
|
| +
|
| + if (stop_worker_time_) {
|
| + UMA_HISTOGRAM_MEDIUM_TIMES(
|
| + "ServiceWorker.TerminateThread.Time",
|
| + base::TimeTicks::Now() - stop_worker_time_.value());
|
| + stop_worker_time_.reset();
|
| + }
|
| + wrapper_.reset();
|
| }
|
|
|
| void EmbeddedWorkerInstanceClientImpl::StartWorker(
|
| const EmbeddedWorkerStartParams& params,
|
| - mojom::ServiceWorkerEventDispatcherRequest dispatcher_request) {
|
| + mojom::ServiceWorkerEventDispatcherRequest dispatcher_request,
|
| + mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host) {
|
| DCHECK(ChildThreadImpl::current());
|
| DCHECK(!wrapper_);
|
| - DCHECK(!embedded_worker_id_);
|
| + DCHECK(!stop_worker_time_.has_value());
|
| 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,
|
| - std::move(dispatcher_request), std::move(temporal_self_)));
|
| - wrapper_ = wrapper.get();
|
| - dispatcher_->RegisterWorker(params.embedded_worker_id, std::move(wrapper));
|
| +
|
| + wrapper_ = StartWorkerContext(
|
| + params,
|
| + base::MakeUnique<ServiceWorkerContextClient>(
|
| + params.embedded_worker_id, params.service_worker_version_id,
|
| + params.scope, params.script_url, std::move(dispatcher_request),
|
| + std::move(instance_host), std::move(temporal_self_)));
|
| }
|
|
|
| -void EmbeddedWorkerInstanceClientImpl::StopWorker(
|
| - const StopWorkerCallback& callback) {
|
| +void EmbeddedWorkerInstanceClientImpl::StopWorker() {
|
| // StopWorker must be called after StartWorker is called.
|
| DCHECK(ChildThreadImpl::current());
|
| DCHECK(wrapper_);
|
| - DCHECK(embedded_worker_id_);
|
| - DCHECK(!stop_callback_);
|
| + DCHECK(!stop_worker_time_.has_value());
|
|
|
| TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StopWorker");
|
| - stop_callback_ = callback;
|
| - dispatcher_->RecordStopWorkerTimer(embedded_worker_id_.value());
|
| + stop_worker_time_ = base::TimeTicks::Now();
|
| wrapper_->worker()->TerminateWorkerContext();
|
| }
|
|
|
| @@ -95,12 +95,8 @@ void EmbeddedWorkerInstanceClientImpl::AddMessageToConsole(
|
| }
|
|
|
| EmbeddedWorkerInstanceClientImpl::EmbeddedWorkerInstanceClientImpl(
|
| - EmbeddedWorkerDispatcher* dispatcher,
|
| mojo::InterfaceRequest<mojom::EmbeddedWorkerInstanceClient> request)
|
| - : dispatcher_(dispatcher),
|
| - binding_(this, std::move(request)),
|
| - temporal_self_(std::unique_ptr<EmbeddedWorkerInstanceClientImpl>(this)),
|
| - wrapper_(nullptr) {
|
| + : binding_(this, std::move(request)), temporal_self_(this) {
|
| binding_.set_connection_error_handler(base::Bind(
|
| &EmbeddedWorkerInstanceClientImpl::OnError, base::Unretained(this)));
|
| }
|
| @@ -112,4 +108,32 @@ void EmbeddedWorkerInstanceClientImpl::OnError() {
|
| temporal_self_.reset();
|
| }
|
|
|
| +std::unique_ptr<EmbeddedWorkerInstanceClientImpl::WorkerWrapper>
|
| +EmbeddedWorkerInstanceClientImpl::StartWorkerContext(
|
| + const EmbeddedWorkerStartParams& params,
|
| + std::unique_ptr<ServiceWorkerContextClient> context_client) {
|
| + auto wrapper = base::MakeUnique<WorkerWrapper>(
|
| + blink::WebEmbeddedWorker::Create(context_client.release(), nullptr),
|
| + params.worker_devtools_agent_route_id);
|
| +
|
| + blink::WebEmbeddedWorkerStartData start_data;
|
| + start_data.script_url = params.script_url;
|
| + start_data.user_agent =
|
| + blink::WebString::FromUTF8(GetContentClient()->GetUserAgent());
|
| + start_data.wait_for_debugger_mode =
|
| + params.wait_for_debugger
|
| + ? blink::WebEmbeddedWorkerStartData::kWaitForDebugger
|
| + : blink::WebEmbeddedWorkerStartData::kDontWaitForDebugger;
|
| + start_data.v8_cache_options = static_cast<blink::WebSettings::V8CacheOptions>(
|
| + params.settings.v8_cache_options);
|
| + start_data.data_saver_enabled = params.settings.data_saver_enabled;
|
| + start_data.pause_after_download_mode =
|
| + params.pause_after_download
|
| + ? blink::WebEmbeddedWorkerStartData::kPauseAfterDownload
|
| + : blink::WebEmbeddedWorkerStartData::kDontPauseAfterDownload;
|
| +
|
| + wrapper->worker()->StartWorkerContext(start_data);
|
| + return wrapper;
|
| +}
|
| +
|
| } // namespace content
|
|
|