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

Side by Side Diff: Source/web/WebSharedWorkerImpl.cpp

Issue 1175463004: Cleanup: Remove WeakPtr usage in WebSharedWorkerImpl (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: more documentation Created 5 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « Source/web/WebSharedWorkerImpl.h ('k') | public/web/WebSharedWorker.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 SecurityOrigin::create(KURL(ParsedURLString, "http://localhost")); 158 SecurityOrigin::create(KURL(ParsedURLString, "http://localhost"));
159 origin.release(); 159 origin.release();
160 } 160 }
161 } 161 }
162 162
163 WebSharedWorkerImpl::WebSharedWorkerImpl(WebSharedWorkerClient* client) 163 WebSharedWorkerImpl::WebSharedWorkerImpl(WebSharedWorkerClient* client)
164 : m_webView(0) 164 : m_webView(0)
165 , m_mainFrame(0) 165 , m_mainFrame(0)
166 , m_askedToTerminate(false) 166 , m_askedToTerminate(false)
167 , m_workerInspectorProxy(WorkerInspectorProxy::create()) 167 , m_workerInspectorProxy(WorkerInspectorProxy::create())
168 , m_client(WeakReference<WebSharedWorkerClient>::create(client)) 168 , m_client(client)
169 , m_clientWeakPtr(WeakPtr<WebSharedWorkerClient>(m_client))
170 , m_pauseWorkerContextOnStart(false) 169 , m_pauseWorkerContextOnStart(false)
171 , m_isPausedOnStart(false) 170 , m_isPausedOnStart(false)
172 { 171 {
173 initializeWebKitStaticValues(); 172 initializeWebKitStaticValues();
174 } 173 }
175 174
176 WebSharedWorkerImpl::~WebSharedWorkerImpl() 175 WebSharedWorkerImpl::~WebSharedWorkerImpl()
177 { 176 {
178 ASSERT(m_webView); 177 ASSERT(m_webView);
179 // Detach the client before closing the view to avoid getting called back. 178 // Detach the client before closing the view to avoid getting called back.
180 m_mainFrame->setClient(0); 179 m_mainFrame->setClient(0);
181 180
182 m_webView->close(); 181 m_webView->close();
183 m_mainFrame->close(); 182 m_mainFrame->close();
184 if (m_loaderProxy) 183 if (m_loaderProxy)
185 m_loaderProxy->detachProvider(this); 184 m_loaderProxy->detachProvider(this);
186 } 185 }
187 186
188 void WebSharedWorkerImpl::terminateWorkerThread() 187 void WebSharedWorkerImpl::terminateWorkerThread()
189 { 188 {
190 if (m_askedToTerminate) 189 if (m_askedToTerminate)
191 return; 190 return;
192 m_askedToTerminate = true; 191 m_askedToTerminate = true;
193 if (m_mainScriptLoader) { 192 if (m_mainScriptLoader) {
194 m_mainScriptLoader->cancel(); 193 m_mainScriptLoader->cancel();
195 m_mainScriptLoader.clear(); 194 m_mainScriptLoader.clear();
196 if (client()) 195 m_client->workerScriptLoadFailed();
197 client()->workerScriptLoadFailed();
198 delete this; 196 delete this;
199 return; 197 return;
200 } 198 }
201 if (m_workerThread) 199 if (m_workerThread)
202 m_workerThread->terminate(); 200 m_workerThread->terminate();
203 m_workerInspectorProxy->workerThreadTerminated(); 201 m_workerInspectorProxy->workerThreadTerminated();
204 } 202 }
205 203
206 void WebSharedWorkerImpl::initializeLoader() 204 void WebSharedWorkerImpl::initializeLoader()
207 { 205 {
208 // Create 'shadow page'. This page is never displayed, it is used to proxy t he 206 // Create 'shadow page'. This page is never displayed, it is used to proxy t he
209 // loading requests from the worker context to the rest of WebKit and Chromi um 207 // loading requests from the worker context to the rest of WebKit and Chromi um
210 // infrastructure. 208 // infrastructure.
211 ASSERT(!m_webView); 209 ASSERT(!m_webView);
212 m_webView = WebView::create(0); 210 m_webView = WebView::create(0);
213 // FIXME: http://crbug.com/363843. This needs to find a better way to 211 // FIXME: http://crbug.com/363843. This needs to find a better way to
214 // not create graphics layers. 212 // not create graphics layers.
215 m_webView->settings()->setAcceleratedCompositingEnabled(false); 213 m_webView->settings()->setAcceleratedCompositingEnabled(false);
216 // FIXME: Settings information should be passed to the Worker process from B rowser process when the worker 214 // FIXME: Settings information should be passed to the Worker process from B rowser process when the worker
217 // is created (similar to RenderThread::OnCreateNewView). 215 // is created (similar to RenderThread::OnCreateNewView).
218 m_mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(WebTreeScopeType::Do cument, this)); 216 m_mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(WebTreeScopeType::Do cument, this));
219 m_webView->setMainFrame(m_mainFrame); 217 m_webView->setMainFrame(m_mainFrame);
220 m_mainFrame->setDevToolsAgentClient(this); 218 m_mainFrame->setDevToolsAgentClient(this);
221 219
222 // If we were asked to pause worker context on start and wait for debugger t hen it is the good time to do that. 220 // If we were asked to pause worker context on start and wait for debugger t hen it is the good time to do that.
223 client()->workerReadyForInspection(); 221 m_client->workerReadyForInspection();
224 if (m_pauseWorkerContextOnStart) { 222 if (m_pauseWorkerContextOnStart) {
225 m_isPausedOnStart = true; 223 m_isPausedOnStart = true;
226 return; 224 return;
227 } 225 }
228 loadShadowPage(); 226 loadShadowPage();
229 } 227 }
230 228
231 WebApplicationCacheHost* WebSharedWorkerImpl::createApplicationCacheHost(WebLoca lFrame*, WebApplicationCacheHostClient* appcacheHostClient) 229 WebApplicationCacheHost* WebSharedWorkerImpl::createApplicationCacheHost(WebLoca lFrame*, WebApplicationCacheHostClient* appcacheHostClient)
232 { 230 {
233 if (client()) 231 return m_client->createApplicationCacheHost(appcacheHostClient);
234 return client()->createApplicationCacheHost(appcacheHostClient);
235 return 0;
236 } 232 }
237 233
238 void WebSharedWorkerImpl::loadShadowPage() 234 void WebSharedWorkerImpl::loadShadowPage()
239 { 235 {
240 // Construct substitute data source for the 'shadow page'. We only need it 236 // Construct substitute data source for the 'shadow page'. We only need it
241 // to have same origin as the worker so the loading checks work correctly. 237 // to have same origin as the worker so the loading checks work correctly.
242 CString content(""); 238 CString content("");
243 RefPtr<SharedBuffer> buffer(SharedBuffer::create(content.data(), content.len gth())); 239 RefPtr<SharedBuffer> buffer(SharedBuffer::create(content.data(), content.len gth()));
244 m_mainFrame->frame()->loader().load(FrameLoadRequest(0, ResourceRequest(m_ur l), SubstituteData(buffer, "text/html", "UTF-8", KURL()))); 240 m_mainFrame->frame()->loader().load(FrameLoadRequest(0, ResourceRequest(m_ur l), SubstituteData(buffer, "text/html", "UTF-8", KURL())));
245 } 241 }
246 242
247 void WebSharedWorkerImpl::willSendRequest( 243 void WebSharedWorkerImpl::willSendRequest(
248 WebLocalFrame* frame, unsigned, WebURLRequest& request, 244 WebLocalFrame* frame, unsigned, WebURLRequest& request,
249 const WebURLResponse& redirectResponse) 245 const WebURLResponse& redirectResponse)
250 { 246 {
251 if (m_networkProvider) 247 if (m_networkProvider)
252 m_networkProvider->willSendRequest(frame->dataSource(), request); 248 m_networkProvider->willSendRequest(frame->dataSource(), request);
253 } 249 }
254 250
255 void WebSharedWorkerImpl::didFinishDocumentLoad(WebLocalFrame* frame) 251 void WebSharedWorkerImpl::didFinishDocumentLoad(WebLocalFrame* frame)
256 { 252 {
257 ASSERT(!m_loadingDocument); 253 ASSERT(!m_loadingDocument);
258 ASSERT(!m_mainScriptLoader); 254 ASSERT(!m_mainScriptLoader);
259 m_networkProvider = adoptPtr(client()->createServiceWorkerNetworkProvider(fr ame->dataSource())); 255 m_networkProvider = adoptPtr(m_client->createServiceWorkerNetworkProvider(fr ame->dataSource()));
260 m_mainScriptLoader = Loader::create(); 256 m_mainScriptLoader = Loader::create();
261 m_loadingDocument = toWebLocalFrameImpl(frame)->frame()->document(); 257 m_loadingDocument = toWebLocalFrameImpl(frame)->frame()->document();
262 m_mainScriptLoader->load( 258 m_mainScriptLoader->load(
263 m_loadingDocument.get(), 259 m_loadingDocument.get(),
264 m_url, 260 m_url,
265 bind(&WebSharedWorkerImpl::didReceiveScriptLoaderResponse, this), 261 bind(&WebSharedWorkerImpl::didReceiveScriptLoaderResponse, this),
266 bind(&WebSharedWorkerImpl::onScriptLoaderFinished, this)); 262 bind(&WebSharedWorkerImpl::onScriptLoaderFinished, this));
267 } 263 }
268 264
269 bool WebSharedWorkerImpl::isControlledByServiceWorker(WebDataSource& dataSource) 265 bool WebSharedWorkerImpl::isControlledByServiceWorker(WebDataSource& dataSource)
270 { 266 {
271 return m_networkProvider && m_networkProvider->isControlledByServiceWorker(d ataSource); 267 return m_networkProvider && m_networkProvider->isControlledByServiceWorker(d ataSource);
272 } 268 }
273 269
274 int64_t WebSharedWorkerImpl::serviceWorkerID(WebDataSource& dataSource) 270 int64_t WebSharedWorkerImpl::serviceWorkerID(WebDataSource& dataSource)
275 { 271 {
276 if (!m_networkProvider) 272 if (!m_networkProvider)
277 return -1; 273 return -1;
278 return m_networkProvider->serviceWorkerID(dataSource); 274 return m_networkProvider->serviceWorkerID(dataSource);
279 } 275 }
280 276
281 void WebSharedWorkerImpl::sendProtocolMessage(int callId, const WebString& messa ge, const WebString& state) 277 void WebSharedWorkerImpl::sendProtocolMessage(int callId, const WebString& messa ge, const WebString& state)
282 { 278 {
283 client()->sendDevToolsMessage(callId, message, state); 279 m_client->sendDevToolsMessage(callId, message, state);
284 } 280 }
285 281
286 void WebSharedWorkerImpl::resumeStartup() 282 void WebSharedWorkerImpl::resumeStartup()
287 { 283 {
288 bool isPausedOnStart = m_isPausedOnStart; 284 bool isPausedOnStart = m_isPausedOnStart;
289 m_isPausedOnStart = false; 285 m_isPausedOnStart = false;
290 if (isPausedOnStart) 286 if (isPausedOnStart)
291 loadShadowPage(); 287 loadShadowPage();
292 } 288 }
293 289
(...skipping 23 matching lines...) Expand all
317 313
318 } 314 }
319 315
320 void WebSharedWorkerImpl::workerGlobalScopeClosed() 316 void WebSharedWorkerImpl::workerGlobalScopeClosed()
321 { 317 {
322 Platform::current()->mainThread()->postTask(FROM_HERE, threadSafeBind(&WebSh aredWorkerImpl::workerGlobalScopeClosedOnMainThread, AllowCrossThreadAccess(this ))); 318 Platform::current()->mainThread()->postTask(FROM_HERE, threadSafeBind(&WebSh aredWorkerImpl::workerGlobalScopeClosedOnMainThread, AllowCrossThreadAccess(this )));
323 } 319 }
324 320
325 void WebSharedWorkerImpl::workerGlobalScopeClosedOnMainThread() 321 void WebSharedWorkerImpl::workerGlobalScopeClosedOnMainThread()
326 { 322 {
327 if (client()) 323 m_client->workerContextClosed();
328 client()->workerContextClosed();
329 324
330 terminateWorkerThread(); 325 terminateWorkerThread();
331 } 326 }
332 327
333 void WebSharedWorkerImpl::workerGlobalScopeStarted(WorkerGlobalScope*) 328 void WebSharedWorkerImpl::workerGlobalScopeStarted(WorkerGlobalScope*)
334 { 329 {
335 } 330 }
336 331
337 void WebSharedWorkerImpl::workerThreadTerminated() 332 void WebSharedWorkerImpl::workerThreadTerminated()
338 { 333 {
339 Platform::current()->mainThread()->postTask(FROM_HERE, threadSafeBind(&WebSh aredWorkerImpl::workerThreadTerminatedOnMainThread, AllowCrossThreadAccess(this) )); 334 Platform::current()->mainThread()->postTask(FROM_HERE, threadSafeBind(&WebSh aredWorkerImpl::workerThreadTerminatedOnMainThread, AllowCrossThreadAccess(this) ));
340 } 335 }
341 336
342 void WebSharedWorkerImpl::workerThreadTerminatedOnMainThread() 337 void WebSharedWorkerImpl::workerThreadTerminatedOnMainThread()
343 { 338 {
344 if (client()) 339 m_client->workerContextDestroyed();
345 client()->workerContextDestroyed();
346 // The lifetime of this proxy is controlled by the worker context. 340 // The lifetime of this proxy is controlled by the worker context.
347 delete this; 341 delete this;
348 } 342 }
349 343
350 // WorkerLoaderProxyProvider --------------------------------------------------- -------- 344 // WorkerLoaderProxyProvider --------------------------------------------------- --------
351 345
352 void WebSharedWorkerImpl::postTaskToLoader(PassOwnPtr<ExecutionContextTask> task ) 346 void WebSharedWorkerImpl::postTaskToLoader(PassOwnPtr<ExecutionContextTask> task )
353 { 347 {
354 m_mainFrame->frame()->document()->postTask(FROM_HERE, task); 348 m_mainFrame->frame()->document()->postTask(FROM_HERE, task);
355 } 349 }
(...skipping 23 matching lines...) Expand all
379 void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType poli cyType) 373 void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType poli cyType)
380 { 374 {
381 m_url = url; 375 m_url = url;
382 m_name = name; 376 m_name = name;
383 initializeLoader(); 377 initializeLoader();
384 } 378 }
385 379
386 void WebSharedWorkerImpl::didReceiveScriptLoaderResponse() 380 void WebSharedWorkerImpl::didReceiveScriptLoaderResponse()
387 { 381 {
388 InspectorInstrumentation::didReceiveScriptResponse(m_loadingDocument.get(), m_mainScriptLoader->identifier()); 382 InspectorInstrumentation::didReceiveScriptResponse(m_loadingDocument.get(), m_mainScriptLoader->identifier());
389 if (client()) 383 m_client->selectAppCacheID(m_mainScriptLoader->appCacheID());
390 client()->selectAppCacheID(m_mainScriptLoader->appCacheID());
391 } 384 }
392 385
393 void WebSharedWorkerImpl::onScriptLoaderFinished() 386 void WebSharedWorkerImpl::onScriptLoaderFinished()
394 { 387 {
395 ASSERT(m_loadingDocument); 388 ASSERT(m_loadingDocument);
396 ASSERT(m_mainScriptLoader); 389 ASSERT(m_mainScriptLoader);
397 if (m_askedToTerminate) 390 if (m_askedToTerminate)
398 return; 391 return;
399 if (m_mainScriptLoader->failed()) { 392 if (m_mainScriptLoader->failed()) {
400 m_mainScriptLoader->cancel(); 393 m_mainScriptLoader->cancel();
401 if (client()) 394 m_client->workerScriptLoadFailed();
402 client()->workerScriptLoadFailed();
403 395
404 // The SharedWorker was unable to load the initial script, so 396 // The SharedWorker was unable to load the initial script, so
405 // shut it down right here. 397 // shut it down right here.
406 delete this; 398 delete this;
407 return; 399 return;
408 } 400 }
409 401
410 Document* document = m_mainFrame->frame()->document(); 402 Document* document = m_mainFrame->frame()->document();
411 WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart; 403 WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart;
412 if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) 404 if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document))
413 startMode = PauseWorkerGlobalScopeOnStart; 405 startMode = PauseWorkerGlobalScopeOnStart;
414 406
415 // FIXME: this document's origin is pristine and without any extra privilege s. (crbug.com/254993) 407 // FIXME: this document's origin is pristine and without any extra privilege s. (crbug.com/254993)
416 SecurityOrigin* starterOrigin = document->securityOrigin(); 408 SecurityOrigin* starterOrigin = document->securityOrigin();
417 409
418 OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); 410 OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create();
419 provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::c reate()); 411 provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::c reate());
420 WebSecurityOrigin webSecurityOrigin(m_loadingDocument->securityOrigin()); 412 WebSecurityOrigin webSecurityOrigin(m_loadingDocument->securityOrigin());
421 provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(client()- >createWorkerContentSettingsClientProxy(webSecurityOrigin))); 413 provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(m_client- >createWorkerContentSettingsClientProxy(webSecurityOrigin)));
422 OwnPtr<WorkerThreadStartupData> startupData = WorkerThreadStartupData::creat e(m_url, m_loadingDocument->userAgent(m_url), m_mainScriptLoader->script(), null ptr, startMode, m_mainScriptLoader->contentSecurityPolicy()->headers(), starterO rigin, workerClients.release()); 414 OwnPtr<WorkerThreadStartupData> startupData = WorkerThreadStartupData::creat e(m_url, m_loadingDocument->userAgent(m_url), m_mainScriptLoader->script(), null ptr, startMode, m_mainScriptLoader->contentSecurityPolicy()->headers(), starterO rigin, workerClients.release());
423 m_loaderProxy = WorkerLoaderProxy::create(this); 415 m_loaderProxy = WorkerLoaderProxy::create(this);
424 setWorkerThread(SharedWorkerThread::create(m_name, m_loaderProxy, *this)); 416 setWorkerThread(SharedWorkerThread::create(m_name, m_loaderProxy, *this));
425 InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScri ptLoader->identifier(), m_mainScriptLoader->script()); 417 InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScri ptLoader->identifier(), m_mainScriptLoader->script());
426 m_mainScriptLoader.clear(); 418 m_mainScriptLoader.clear();
427 419
428 workerThread()->start(startupData.release()); 420 workerThread()->start(startupData.release());
429 m_workerInspectorProxy->workerThreadCreated(m_loadingDocument.get(), workerT hread(), m_url); 421 m_workerInspectorProxy->workerThreadCreated(m_loadingDocument.get(), workerT hread(), m_url);
430 if (client()) 422 m_client->workerScriptLoaded();
431 client()->workerScriptLoaded();
432 } 423 }
433 424
434 void WebSharedWorkerImpl::terminateWorkerContext() 425 void WebSharedWorkerImpl::terminateWorkerContext()
435 { 426 {
436 terminateWorkerThread(); 427 terminateWorkerThread();
437 } 428 }
438 429
439 void WebSharedWorkerImpl::clientDestroyed()
440 {
441 m_client.clear();
442 }
443
444 void WebSharedWorkerImpl::pauseWorkerContextOnStart() 430 void WebSharedWorkerImpl::pauseWorkerContextOnStart()
445 { 431 {
446 m_pauseWorkerContextOnStart = true; 432 m_pauseWorkerContextOnStart = true;
447 } 433 }
448 434
449 void WebSharedWorkerImpl::attachDevTools(const WebString& hostId) 435 void WebSharedWorkerImpl::attachDevTools(const WebString& hostId)
450 { 436 {
451 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); 437 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent();
452 if (devtoolsAgent) 438 if (devtoolsAgent)
453 devtoolsAgent->attach(hostId); 439 devtoolsAgent->attach(hostId);
(...skipping 22 matching lines...) Expand all
476 if (devtoolsAgent) 462 if (devtoolsAgent)
477 devtoolsAgent->dispatchOnInspectorBackend(message); 463 devtoolsAgent->dispatchOnInspectorBackend(message);
478 } 464 }
479 465
480 WebSharedWorker* WebSharedWorker::create(WebSharedWorkerClient* client) 466 WebSharedWorker* WebSharedWorker::create(WebSharedWorkerClient* client)
481 { 467 {
482 return new WebSharedWorkerImpl(client); 468 return new WebSharedWorkerImpl(client);
483 } 469 }
484 470
485 } // namespace blink 471 } // namespace blink
OLDNEW
« no previous file with comments | « Source/web/WebSharedWorkerImpl.h ('k') | public/web/WebSharedWorker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698