| OLD | NEW |
| (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 |
| OLD | NEW |