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

Side by Side Diff: third_party/WebKit/Source/modules/serviceworkers/IsolatedWorkerReportingProxy.cpp

Issue 2118243002: [proof-of-concept] SW thread independent of the main thread Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 3 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 2016 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 "modules/serviceworkers/IsolatedWorkerReportingProxy.h"
6
7 #include "mojo/public/cpp/bindings/binding.h"
8 #include "platform/TraceEvent.h"
9 #include "core/inspector/ConsoleMessage.h"
10 #include "modules/serviceworkers/IsolatedWorkerThread.h"
11 #include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
12 #include "modules/serviceworkers/WaitUntilObserver.h"
13 #include "modules/serviceworkers/FetchEvent.h"
14 #include "modules/serviceworkers/FetchEventInit.h"
15 #include "modules/serviceworkers/IsolatedWorkerReportingProxy.h"
16 #include "modules/serviceworkers/IsolatedWorkerThread.h"
17 #include "modules/serviceworkers/RespondWithObserver.h"
18 #include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
19 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
20 #include "web/ServiceWorkerGlobalScopeClientImpl.h"
21 #include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
22 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h"
23
24 namespace blink {
25 class IsolatedWorkerReportingProxy::IsolatedServiceWorkerContextClient
26 : public WebServiceWorkerContextClient {
27 public:
28 IsolatedServiceWorkerContextClient(IsolatedWorkerReportingProxy* proxy)
29 : m_proxy(proxy)
30 {
31 }
32 ~IsolatedServiceWorkerContextClient() {}
33
34 private:
35 void respondToFetchEvent(int responseID, double) override
36 {
37 m_proxy->respondToFetchEvent(responseID);
38 }
39 void respondToFetchEvent(int responseID, const WebServiceWorkerResponse& res ponse, double) override
40 {
41 m_proxy->respondToFetchEvent(responseID, response);
42 }
43 void didHandleFetchEvent(int eventFinishID, WebServiceWorkerEventResult resu lt, double) override
44 {
45 LOG(ERROR) << "didHandleFetchEvent " << eventFinishID;
46 }
47 void getClient(const WebString&, WebServiceWorkerClientCallbacks*) override {}
48 void getClients(const WebServiceWorkerClientQueryOptions&, WebServiceWorkerC lientsCallbacks*) override {}
49 void openWindow(const WebURL&, WebServiceWorkerClientCallbacks*) override {}
50 void setCachedMetadata(const WebURL& url, const char* data, size_t size) {}
51 void clearCachedMetadata(const WebURL& url) {}
52 void postMessageToClient(const WebString& uuid, const WebString&, WebMessage PortChannelArray*) override {}
53 void postMessageToCrossOriginClient(const WebCrossOriginServiceWorkerClient& , const WebString&, WebMessagePortChannelArray*) override {}
54 void skipWaiting(WebServiceWorkerSkipWaitingCallbacks*) override {}
55 void claim(WebServiceWorkerClientsClaimCallbacks*) override {}
56 void focus(const WebString& uuid, WebServiceWorkerClientCallbacks*) override {}
57 void navigate(const WebString& uuid, const WebURL&, WebServiceWorkerClientCa llbacks*) override {}
58 void registerForeignFetchScopes(const WebVector<WebURL>& subScopes, const We bVector<WebSecurityOrigin>& origins) override {}
59 IsolatedWorkerReportingProxy* m_proxy;
60 };
61
62 class IsolatedWorkerReportingProxy::IsolatedWorkerClientImpl : public mojom::bli nk::IsolatedWorkerClient {
63 public:
64 explicit IsolatedWorkerClientImpl(IsolatedWorkerReportingProxy* workerReport ingProxy)
65 : m_binding(this)
66 , m_workerReportingProxy(workerReportingProxy)
67 {
68 TRACE_EVENT0(
69 "ServiceWorker",
70 "IsolatedWorkerClientImpl::IsolatedWorkerClientImpl");
71 LOG(ERROR) << "IsolatedWorkerClientImpl" << this;
72 }
73 ~IsolatedWorkerClientImpl() override
74 {
75 LOG(ERROR) << "~IsolatedWorkerClientImpl" << this;
76 }
77 void Bind(mojom::blink::IsolatedWorkerClientRequest local_interfaces_request )
78 {
79 DCHECK(!m_binding.is_bound());
80 m_binding.Bind(std::move(local_interfaces_request));
81 }
82
83 void OnFetchEvent(int32_t responseID, int32_t eventFinishID, const String& u rl, bool is_navigate, const OnFetchEventCallback& callback) override
84 {
85 TRACE_EVENT0(
86 "ServiceWorker",
87 "IsolatedWorkerClientImpl::OnFetchEvent");
88 LOG(ERROR) << "responseID: " << responseID << " eventFinishID: " << even tFinishID;
89 m_workerReportingProxy->OnFetchEvent(responseID, eventFinishID, url, is_ navigate, callback);
90 //callback.Run(1000);
91 }
92
93 private:
94 mojo::Binding<mojom::blink::IsolatedWorkerClient> m_binding;
95 IsolatedWorkerReportingProxy* m_workerReportingProxy;
96 };
97
98 std::unique_ptr<IsolatedWorkerReportingProxy> IsolatedWorkerReportingProxy::crea te(std::unique_ptr<WebIsolatedWorkerContextClient> workerContextClient)
99 {
100
101 return wrapUnique(new IsolatedWorkerReportingProxy(std::move(workerContextCl ient)));
102 }
103 IsolatedWorkerReportingProxy::~IsolatedWorkerReportingProxy()
104 {
105 LOG(ERROR) << "~IsolatedWorkerReportingProxy";
106 }
107 void IsolatedWorkerReportingProxy::setVersionID(int64_t versionID)
108 {
109 m_versionID = versionID;
110 }
111 void IsolatedWorkerReportingProxy::setThread(IsolatedWorkerThread* thread)
112 {
113 m_thread = thread;
114 }
115
116 void IsolatedWorkerReportingProxy::reportException(const String& errorMessage, s td::unique_ptr<SourceLocation>, int exceptionId)
117 {
118 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::reportException ");
119 LOG(ERROR) << "IsolatedWorkerReportingProxy::reportException: \"" << errorMe ssage.utf8().data() << "\"";
120 }
121 void IsolatedWorkerReportingProxy::reportConsoleMessage(MessageSource, MessageLe vel, const String& message, SourceLocation*)
122 {
123 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::reportConsoleMe ssage");
124 LOG(ERROR) << "IsolatedWorkerReportingProxy::reportConsoleMessage: \"" << me ssage.utf8().data() << "\"";
125 }
126 void IsolatedWorkerReportingProxy::postMessageToPageInspector(const String&)
127 {
128 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::postMessageToPa geInspector");
129 LOG(ERROR) << "IsolatedWorkerReportingProxy::postMessageToPageInspector";
130 }
131
132 // Invoked when the worker script is evaluated. |success| is true if the
133 // evaluation completed with no uncaught exception.
134 void IsolatedWorkerReportingProxy::didEvaluateWorkerScript(bool success)
135 {
136 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::didEvaluateWork erScript");
137 LOG(ERROR) << "IsolatedWorkerReportingProxy::didEvaluateWorkerScript";
138
139 // m_isolated_worker_host_service->WorkerScriptEvaluated();
140 m_isolated_worker_host_service->OnScriptEvaluated();
141 m_thread->postTask(
142 BLINK_FROM_HERE, createSameThreadTask(
143 &IsolatedWorkerReportingProxy::sendWorkerStarted, W TF::unretained(this)));
144 }
145
146 // Invoked when the thread creates a worker script context.
147 void IsolatedWorkerReportingProxy::didInitializeWorkerContext()
148 {
149 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::didInitializeWo rkerContext");
150 LOG(ERROR) << "IsolatedWorkerReportingProxy::didInitializeWorkerContext";
151 m_scriptList = m_workerContextClient->takeWorkerScriptList();
152 for (const auto& script : *m_scriptList) {
153 LOG(ERROR) << "script: " << script->url;
154 }
155 }
156
157 // Invoked when the new WorkerGlobalScope is started.
158 void IsolatedWorkerReportingProxy::workerGlobalScopeStarted(WorkerOrWorkletGloba lScope* workerGlobalScope)
159 {
160 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::workerGlobalSco peStarted");
161 LOG(ERROR) << "IsolatedWorkerReportingProxy::workerGlobalScopeStarted";
162 CHECK(workerGlobalScope == m_thread->globalScope());
163
164 std::unique_ptr<WebServiceWorkerRegistration::Handle> registrationHandle(m_w orkerContextClient->takeAssociatedRegistration());
165 static_cast<ServiceWorkerGlobalScope*>(workerGlobalScope)->setRegistration(s td::move(registrationHandle));
166
167 m_seriveWorkerContextClient.reset(new IsolatedServiceWorkerContextClient(thi s));
168 provideServiceWorkerGlobalScopeClientToWorker(static_cast<WorkerGlobalScope* >(workerGlobalScope)->clients(), ServiceWorkerGlobalScopeClientImpl::create(*m_s eriveWorkerContextClient));
169 }
170
171 // Invoked when close() is invoked on the worker context.
172 void IsolatedWorkerReportingProxy::workerGlobalScopeClosed()
173 {
174 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::workerGlobalSco peClosed");
175 LOG(ERROR) << "IsolatedWorkerReportingProxy::workerGlobalScopeClosed";
176 }
177
178 // Invoked when the thread is stopped and WorkerGlobalScope is being
179 // destructed. (This is be the last method that is called on this
180 // interface)
181 void IsolatedWorkerReportingProxy::workerThreadTerminated()
182 {
183 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::workerThreadTer minated");
184 LOG(ERROR) << "IsolatedWorkerReportingProxy::workerThreadTerminated";
185 }
186
187 // Invoked when the thread is about to be stopped and WorkerGlobalScope
188 // is to be destructed. (When this is called it is guaranteed that
189 // WorkerGlobalScope is still alive)
190 void IsolatedWorkerReportingProxy::willDestroyWorkerGlobalScope()
191 {
192 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::willDestroyWork erGlobalScope");
193 LOG(ERROR) << "IsolatedWorkerReportingProxy::willDestroyWorkerGlobalScope";
194 }
195
196 void IsolatedWorkerReportingProxy::initializeOnWorkerThread()
197 {
198 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::initializeOnWor kerThread");
199 LOG(ERROR) << "IsolatedWorkerReportingProxy::initializeOnWorkerThread";
200 m_workerContextClient->initializeOnWorkerThread();
201 m_workerContextClient->connectToRemoteService(mojo::GetProxy(&m_isolated_wor ker_host_service));
202 mojom::blink::IsolatedWorkerClientPtr client_ptr;
203 m_isolatedWorkerClient.reset(new IsolatedWorkerClientImpl(this));
204 m_isolatedWorkerClient->Bind(GetProxy(&client_ptr));
205 m_isolated_worker_host_service->OnThreadStarted(m_versionID, std::move(clien t_ptr));
206 }
207
208 std::unique_ptr<String> IsolatedWorkerReportingProxy::takeAlternativeCode(const KURL& url)
209 {
210 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::takeAlternative Code");
211 LOG(ERROR) << url.getString().utf8().data();
212 const String urlString(url.getString());
213 for (const auto& script : *m_scriptList) {
214 if (String::fromUTF8(script->url.data(), script->url.length()) != urlStr ing)
215 continue;
216 std::unique_ptr<String> scriptString(new String);
217 for (const auto& dataItem : *script->data) {
218 scriptString->append(String::fromUTF8(dataItem->data(), dataItem->si ze()));
219 }
220 return scriptString;
221 }
222 return nullptr;
223 }
224
225 std::unique_ptr<WTF::Vector<char>> IsolatedWorkerReportingProxy::takeAlternative CachedMetadata(const KURL& url)
226 {
227 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::takeAlternative Code");
228 LOG(ERROR) << url.getString().utf8().data();
229 const String urlString(url.getString());
230 for (const auto& script : *m_scriptList) {
231 if (String::fromUTF8(script->url.data(), script->url.length()) != urlStr ing)
232 continue;
233 std::unique_ptr<WTF::Vector<char>> data(new WTF::Vector<char>);
234 // TODO: reserve
235
236 for (const auto& dataItem : *script->meta_data) {
237 data->append(dataItem->data(), dataItem->size());
238 }
239 return data;
240 }
241 return nullptr;
242 }
243
244 IsolatedWorkerReportingProxy::IsolatedWorkerReportingProxy(std::unique_ptr<WebIs olatedWorkerContextClient> workerContextClient)
245 : m_workerContextClient(std::move(workerContextClient))
246 , m_weakFactory(this)
247 {
248 LOG(ERROR) << "IsolatedWorkerReportingProxy";
249 }
250 void IsolatedWorkerReportingProxy::sendWorkerStarted()
251 {
252 LOG(ERROR) << "sendWorkerStarted";
253 m_isolated_worker_host_service->OnWorkerStarted();
254 }
255 void IsolatedWorkerReportingProxy::OnFetchEvent(int32_t responseID, int32_t even tFinishID, const String& url, bool is_navigate, const mojom::blink::IsolatedWork erClient::OnFetchEventCallback& callback)
256 {
257 LOG(ERROR) << "IsolatedWorkerReportingProxy::OnFetchEvent " << url.utf8() .data();
258 m_onFetchCallbacks.set(responseID, callback);
259 blink::WebServiceWorkerRequest webRequest;
260 webRequest.setURL(blink::WebURL(KURL(ParsedURLString, url)));
261 if (is_navigate)
262 webRequest.setMode(WebURLRequest::FetchRequestModeNavigate);
263 WorkerGlobalScope* workerGlobalScope = static_cast<WorkerGlobalScope*>(m_thr ead->globalScope());
264 ScriptState::Scope scope(workerGlobalScope->scriptController()->getScriptSta te());
265 WaitUntilObserver* waitUntilObserver = WaitUntilObserver::create(workerGloba lScope, WaitUntilObserver::Fetch, eventFinishID);
266 RespondWithObserver* respondWithObserver = RespondWithObserver::create(worke rGlobalScope, responseID, webRequest.url(), webRequest.mode(), webRequest.frameT ype(), webRequest.requestContext(), waitUntilObserver);
267 Request* request = Request::create(workerGlobalScope->scriptController()->ge tScriptState(), webRequest);
268 request->getHeaders()->setGuard(Headers::ImmutableGuard);
269 FetchEventInit eventInit;
270 eventInit.setCancelable(true);
271 eventInit.setRequest(request);
272 eventInit.setClientId(webRequest.isMainResourceLoad() ? WebString() : webReq uest.clientId());
273 eventInit.setIsReload(webRequest.isReload());
274 FetchEvent* fetchEvent = FetchEvent::create(workerGlobalScope->scriptControl ler()->getScriptState(), EventTypeNames::fetch, eventInit, respondWithObserver, waitUntilObserver);
275 waitUntilObserver->willDispatchEvent();
276 DispatchEventResult dispatchResult = workerGlobalScope->dispatchEvent(fetchE vent);
277 respondWithObserver->didDispatchEvent(dispatchResult);
278 // false is okay because waitUntil for fetch event doesn't care about the
279 // promise rejection or an uncaught runtime script error.
280 waitUntilObserver->didDispatchEvent(false /*
281 errorOccurred */);
282 }
283
284 void IsolatedWorkerReportingProxy::respondToFetchEvent(int responseID)
285 {
286 LOG(ERROR) << "respondToFetchEvent " << responseID;
287 mojom::blink::IsolatedWorkerClient::OnFetchEventCallback callback = m_onFetc hCallbacks.take(responseID);
288 callback.Run(false, nullptr);
289 }
290 void IsolatedWorkerReportingProxy::respondToFetchEvent(int responseID, const Web ServiceWorkerResponse& response)
291 {
292 LOG(ERROR) << "respondToFetchEvent " << responseID;
293 LOG(ERROR) << "response blobid " << response.blobUUID().utf8().data();
294 LOG(ERROR) << "response blobid " << response.blobSize();
295 mojom::blink::ServiceWorkerResponsePtr res(mojom::blink::ServiceWorkerRespon se::New());
296 res->url = response.url().string();
297 res->status_code = response.status();
298 res->status_text = response.statusText();
299 res->blob_uuid = response.blobUUID();
300 res->blob_size = response.blobSize();
301 res->stream_url = response.streamURL().string();
302 mojom::blink::IsolatedWorkerClient::OnFetchEventCallback callback = m_onFetc hCallbacks.take(responseID);
303 callback.Run(true, std::move(res));
304 }
305
306 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698