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

Side by Side Diff: content/renderer/service_worker/embedded_worker_impl.cc

Issue 1223193009: WIP attempt to replace StartWorker/StopWorker IPCs with a new mojo EmbeddedWorker service. Base URL: https://chromium.googlesource.com/chromium/src.git@mojo-event-dispatching-option2
Patch Set: Created 5 years, 5 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/service_worker/embedded_worker_impl.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "content/child/scoped_child_process_reference.h"
9 #include "content/child/thread_safe_sender.h"
10 #include "content/common/service_worker/embedded_worker_messages.h"
11 #include "content/public/common/content_client.h"
12 #include "content/renderer/render_thread_impl.h"
13 #include "content/renderer/service_worker/embedded_worker_devtools_agent.h"
14 #include "content/renderer/service_worker/service_worker_context_client.h"
15 #include "mojo/common/url_type_converters.h"
16 #include "third_party/WebKit/public/web/WebEmbeddedWorker.h"
17 #include "third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h"
18
19 namespace content {
20
21 namespace {
22 static const int kInvalidEmbeddedWorkerId = -1;
23 } // namespace
24
25 // A thin wrapper of WebEmbeddedWorker which also adds and releases process
26 // references automatically.
27 class EmbeddedWorkerImpl::WorkerWrapper {
28 public:
29 WorkerWrapper(blink::WebEmbeddedWorker* worker, int devtools_agent_route_id)
30 : worker_(worker),
31 dev_tools_agent_(
32 new EmbeddedWorkerDevToolsAgent(worker, devtools_agent_route_id)) {}
33 ~WorkerWrapper() {}
34
35 blink::WebEmbeddedWorker* worker() { return worker_.get(); }
36
37 private:
38 ScopedChildProcessReference process_ref_;
39 scoped_ptr<blink::WebEmbeddedWorker> worker_;
40 scoped_ptr<EmbeddedWorkerDevToolsAgent> dev_tools_agent_;
41 };
42
43 // static
44 void EmbeddedWorkerImpl::Create(
45 ThreadSafeSender* thread_safe_sender,
46 mojo::InterfaceRequest<EmbeddedWorker> request) {
47 new EmbeddedWorkerImpl(thread_safe_sender, request.Pass());
48 }
49
50 EmbeddedWorkerImpl::EmbeddedWorkerImpl(
51 ThreadSafeSender* thread_safe_sender,
52 mojo::InterfaceRequest<EmbeddedWorker> request)
53 : binding_(this, request.Pass()),
54 embedded_worker_id_(kInvalidEmbeddedWorkerId),
55 thread_safe_sender_(thread_safe_sender),
56 main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
57 binding_.set_connection_error_handler([this]() { ConnectionLost(); });
58 }
59
60 EmbeddedWorkerImpl::~EmbeddedWorkerImpl() {
61 }
62
63 void EmbeddedWorkerImpl::ConnectionLost() {
64 // This should eventually call WorkerContextDestroyed. (We may need to post
65 // a delayed task to forcibly abort the worker context if we find it
66 // necessary)
67 if (wrapper_) {
68 TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerImpl::StopWorker");
69 wrapper_->worker()->terminateWorkerContext();
70 } else {
71 delete this;
72 }
73 }
74
75 void EmbeddedWorkerImpl::WorkerContextDestroyed() {
76 thread_safe_sender_->Send(
77 new EmbeddedWorkerHostMsg_WorkerStopped(embedded_worker_id_));
78 main_thread_task_runner_->PostTask(
79 FROM_HERE, base::Bind(&EmbeddedWorkerImpl::DeleteOnMainThread,
80 base::Unretained(this)));
81 }
82
83 void EmbeddedWorkerImpl::Initialize(EmbeddedWorkerStartWorkerParamsPtr params) {
84 DCHECK_EQ(embedded_worker_id_, kInvalidEmbeddedWorkerId);
85 DCHECK(!wrapper_);
86 TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerImpl::Initialize");
87 RenderThread::Get()->EnsureWebKitInitialized();
88 wrapper_.reset((new WorkerWrapper(
89 blink::WebEmbeddedWorker::create(
90 new ServiceWorkerContextClient(
91 params->embedded_worker_id, this,
92 params->service_worker_version_id, params->scope.To<GURL>(),
93 params->script_url.To<GURL>(),
94 params->worker_devtools_agent_route_id),
95 NULL),
96 params->worker_devtools_agent_route_id)));
97 embedded_worker_id_ = params->embedded_worker_id;
98
99 blink::WebEmbeddedWorkerStartData start_data;
100 start_data.scriptURL = params->script_url.To<GURL>();
101 start_data.userAgent = base::UTF8ToUTF16(GetContentClient()->GetUserAgent());
102 start_data.pauseAfterDownloadMode =
103 params->pause_after_download
104 ? blink::WebEmbeddedWorkerStartData::PauseAfterDownload
105 : blink::WebEmbeddedWorkerStartData::DontPauseAfterDownload;
106 start_data.waitForDebuggerMode =
107 params->wait_for_debugger
108 ? blink::WebEmbeddedWorkerStartData::WaitForDebugger
109 : blink::WebEmbeddedWorkerStartData::DontWaitForDebugger;
110 start_data.v8CacheOptions =
111 static_cast<blink::WebSettings::V8CacheOptions>(params->v8_cache_options);
112
113 wrapper_->worker()->startWorkerContext(start_data);
114 }
115
116 void EmbeddedWorkerImpl::DeleteOnMainThread() {
117 delete this;
118 }
119
120 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698