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

Unified Diff: content/renderer/service_worker/embedded_worker_instance_client_impl.cc

Issue 2787883003: [ServiceWorker] Add EmbeddedWorkerInstanceHost Interface. (Closed)
Patch Set: Refine code comments Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698