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

Side by Side Diff: third_party/WebKit/Source/core/fetch/Resource.cpp

Issue 1997833002: Don't keep a separate m_revalidatingRequest on Resource (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 290
291 for (const auto& resource : resources) 291 for (const auto& resource : resources)
292 resource->finishPendingClients(); 292 resource->finishPendingClients();
293 } 293 }
294 294
295 Resource::Resource(const ResourceRequest& request, Type type, const ResourceLoad erOptions& options) 295 Resource::Resource(const ResourceRequest& request, Type type, const ResourceLoad erOptions& options)
296 : m_resourceRequest(request) 296 : m_resourceRequest(request)
297 , m_options(options) 297 , m_options(options)
298 , m_responseTimestamp(currentTime()) 298 , m_responseTimestamp(currentTime())
299 , m_cancelTimer(this, &Resource::cancelTimerFired) 299 , m_cancelTimer(this, &Resource::cancelTimerFired)
300 , m_isRevalidating(false)
300 , m_loadFinishTime(0) 301 , m_loadFinishTime(0)
301 , m_identifier(0) 302 , m_identifier(0)
302 , m_encodedSize(0) 303 , m_encodedSize(0)
303 , m_decodedSize(0) 304 , m_decodedSize(0)
304 , m_overheadSize(calculateOverheadSize()) 305 , m_overheadSize(calculateOverheadSize())
305 , m_preloadCount(0) 306 , m_preloadCount(0)
306 , m_cacheIdentifier(MemoryCache::defaultCacheIdentifier()) 307 , m_cacheIdentifier(MemoryCache::defaultCacheIdentifier())
307 , m_preloadResult(PreloadNotReferenced) 308 , m_preloadResult(PreloadNotReferenced)
308 , m_type(type) 309 , m_type(type)
309 , m_status(NotStarted) 310 , m_status(NotStarted)
(...skipping 30 matching lines...) Expand all
340 { 341 {
341 // TOOD(japhet): Temporary, out of place hack to stop a top crasher. 342 // TOOD(japhet): Temporary, out of place hack to stop a top crasher.
342 // Make this more organic. 343 // Make this more organic.
343 if (!fetcher->loadingTaskRunner()) 344 if (!fetcher->loadingTaskRunner())
344 return; 345 return;
345 346
346 RELEASE_ASSERT(!m_loader); 347 RELEASE_ASSERT(!m_loader);
347 ASSERT(stillNeedsLoad()); 348 ASSERT(stillNeedsLoad());
348 m_status = Pending; 349 m_status = Pending;
349 350
350 ResourceRequest& request(m_revalidatingRequest.isNull() ? m_resourceRequest : m_revalidatingRequest); 351 KURL url = m_resourceRequest.url();
351 KURL url = request.url(); 352 m_resourceRequest.setAllowStoredCredentials(m_options.allowCredentials == Al lowStoredCredentials);
352 request.setAllowStoredCredentials(m_options.allowCredentials == AllowStoredC redentials);
353 353
354 m_fetcherSecurityOrigin = fetcher->context().getSecurityOrigin(); 354 m_fetcherSecurityOrigin = fetcher->context().getSecurityOrigin();
355 m_loader = ResourceLoader::create(fetcher, this); 355 m_loader = ResourceLoader::create(fetcher, this);
356 m_loader->start(request); 356 m_loader->start(m_resourceRequest);
357 // If the request reference is null (i.e., a synchronous revalidation will 357 m_resourceRequest.setURL(url);
358 // null the request), don't make the request non-null by setting the url.
359 if (!request.isNull())
360 request.setURL(url);
361 } 358 }
362 359
363 void Resource::checkNotify() 360 void Resource::checkNotify()
364 { 361 {
365 if (isLoading()) 362 if (isLoading())
366 return; 363 return;
367 364
368 ResourceClientWalker<ResourceClient> w(m_clients); 365 ResourceClientWalker<ResourceClient> w(m_clients);
369 while (ResourceClient* c = w.next()) 366 while (ResourceClient* c = w.next())
370 c->notifyFinished(this); 367 c->notifyFinished(this);
371 } 368 }
372 369
373 void Resource::appendData(const char* data, size_t length) 370 void Resource::appendData(const char* data, size_t length)
374 { 371 {
375 TRACE_EVENT0("blink", "Resource::appendData"); 372 TRACE_EVENT0("blink", "Resource::appendData");
376 ASSERT(m_revalidatingRequest.isNull()); 373 DCHECK(!m_isRevalidating);
377 ASSERT(!errorOccurred()); 374 ASSERT(!errorOccurred());
378 if (m_options.dataBufferingPolicy == DoNotBufferData) 375 if (m_options.dataBufferingPolicy == DoNotBufferData)
379 return; 376 return;
380 if (m_data) 377 if (m_data)
381 m_data->append(data, length); 378 m_data->append(data, length);
382 else 379 else
383 m_data = SharedBuffer::createPurgeable(data, length); 380 m_data = SharedBuffer::createPurgeable(data, length);
384 setEncodedSize(m_data->size()); 381 setEncodedSize(m_data->size());
385 } 382 }
386 383
387 void Resource::setResourceBuffer(PassRefPtr<SharedBuffer> resourceBuffer) 384 void Resource::setResourceBuffer(PassRefPtr<SharedBuffer> resourceBuffer)
388 { 385 {
389 ASSERT(m_revalidatingRequest.isNull()); 386 DCHECK(!m_isRevalidating);
390 ASSERT(!errorOccurred()); 387 ASSERT(!errorOccurred());
391 ASSERT(m_options.dataBufferingPolicy == BufferData); 388 ASSERT(m_options.dataBufferingPolicy == BufferData);
392 m_data = resourceBuffer; 389 m_data = resourceBuffer;
393 setEncodedSize(m_data->size()); 390 setEncodedSize(m_data->size());
394 } 391 }
395 392
396 void Resource::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy) 393 void Resource::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy)
397 { 394 {
398 m_options.dataBufferingPolicy = dataBufferingPolicy; 395 m_options.dataBufferingPolicy = dataBufferingPolicy;
399 m_data.clear(); 396 m_data.clear();
400 setEncodedSize(0); 397 setEncodedSize(0);
401 } 398 }
402 399
403 void Resource::markClientsAndObserversFinished() 400 void Resource::markClientsAndObserversFinished()
404 { 401 {
405 while (!m_clients.isEmpty()) { 402 while (!m_clients.isEmpty()) {
406 HashCountedSet<ResourceClient*>::iterator it = m_clients.begin(); 403 HashCountedSet<ResourceClient*>::iterator it = m_clients.begin();
407 for (int i = it->value; i; i--) { 404 for (int i = it->value; i; i--) {
408 m_finishedClients.add(it->key); 405 m_finishedClients.add(it->key);
409 m_clients.remove(it); 406 m_clients.remove(it);
410 } 407 }
411 } 408 }
412 } 409 }
413 410
414 void Resource::error(const ResourceError& error) 411 void Resource::error(const ResourceError& error)
415 { 412 {
416 ASSERT(!error.isNull()); 413 ASSERT(!error.isNull());
417 m_error = error; 414 m_error = error;
418 if (!m_revalidatingRequest.isNull()) 415 m_isRevalidating = false;
419 m_revalidatingRequest = ResourceRequest();
420 416
421 if (m_error.isCancellation() || !isPreloaded()) 417 if (m_error.isCancellation() || !isPreloaded())
422 memoryCache()->remove(this); 418 memoryCache()->remove(this);
423 419
424 setStatus(LoadError); 420 setStatus(LoadError);
425 ASSERT(errorOccurred()); 421 ASSERT(errorOccurred());
426 m_data.clear(); 422 m_data.clear();
427 m_loader = nullptr; 423 m_loader = nullptr;
428 checkNotify(); 424 checkNotify();
429 markClientsAndObserversFinished(); 425 markClientsAndObserversFinished();
430 } 426 }
431 427
432 void Resource::finish(double loadFinishTime) 428 void Resource::finish(double loadFinishTime)
433 { 429 {
434 ASSERT(m_revalidatingRequest.isNull()); 430 DCHECK(!m_isRevalidating);
435 m_loadFinishTime = loadFinishTime; 431 m_loadFinishTime = loadFinishTime;
436 if (!errorOccurred()) 432 if (!errorOccurred())
437 m_status = Cached; 433 m_status = Cached;
438 m_loader = nullptr; 434 m_loader = nullptr;
439 checkNotify(); 435 checkNotify();
440 markClientsAndObserversFinished(); 436 markClientsAndObserversFinished();
441 } 437 }
442 438
443 AtomicString Resource::httpContentType() const 439 AtomicString Resource::httpContentType() const
444 { 440 {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 return currentAge(response, responseTimestamp) <= freshnessLifetime(response , responseTimestamp); 540 return currentAge(response, responseTimestamp) <= freshnessLifetime(response , responseTimestamp);
545 } 541 }
546 542
547 const ResourceRequest& Resource::lastResourceRequest() const 543 const ResourceRequest& Resource::lastResourceRequest() const
548 { 544 {
549 if (!m_redirectChain.size()) 545 if (!m_redirectChain.size())
550 return m_resourceRequest; 546 return m_resourceRequest;
551 return m_redirectChain.last().m_request; 547 return m_redirectChain.last().m_request;
552 } 548 }
553 549
554 void Resource::setRevalidatingRequest(const ResourceRequest& request) 550 void Resource::setRevalidatingRequest(const ResourceRequest& request)
yhirano 2016/05/23 11:40:38 DCHECK(!request.isNull())?
Nate Chapin 2016/05/26 21:43:02 Done.
555 { 551 {
556 m_revalidatingRequest = request; 552 m_isRevalidating = true;
553 m_resourceRequest = request;
557 m_status = NotStarted; 554 m_status = NotStarted;
558 } 555 }
559 556
560 void Resource::willFollowRedirect(ResourceRequest& newRequest, const ResourceRes ponse& redirectResponse) 557 void Resource::willFollowRedirect(ResourceRequest& newRequest, const ResourceRes ponse& redirectResponse)
561 { 558 {
562 newRequest.setAllowStoredCredentials(m_options.allowCredentials == AllowStor edCredentials); 559 newRequest.setAllowStoredCredentials(m_options.allowCredentials == AllowStor edCredentials);
563 m_redirectChain.append(RedirectPair(newRequest, redirectResponse)); 560 m_redirectChain.append(RedirectPair(newRequest, redirectResponse));
564 } 561 }
565 562
566 void Resource::setResponse(const ResourceResponse& response) 563 void Resource::setResponse(const ResourceResponse& response)
567 { 564 {
568 m_response = response; 565 m_response = response;
569 if (m_response.wasFetchedViaServiceWorker()) 566 if (m_response.wasFetchedViaServiceWorker())
570 m_cacheHandler = ServiceWorkerResponseCachedMetadataHandler::create(this , m_fetcherSecurityOrigin.get()); 567 m_cacheHandler = ServiceWorkerResponseCachedMetadataHandler::create(this , m_fetcherSecurityOrigin.get());
571 } 568 }
572 569
573 bool Resource::unlock() 570 bool Resource::unlock()
574 { 571 {
575 if (!m_data) 572 if (!m_data)
576 return false; 573 return false;
577 574
578 if (!m_data->isLocked()) 575 if (!m_data->isLocked())
579 return true; 576 return true;
580 577
581 if (!memoryCache()->contains(this) || hasClientsOrObservers() || !m_revalida tingRequest.isNull() || !m_loadFinishTime || !isSafeToUnlock()) 578 if (!memoryCache()->contains(this) || hasClientsOrObservers() || !isLoaded() || !isSafeToUnlock())
Nate Chapin 2016/05/19 22:18:39 Switched this to !isLoaded(), which I think is wha
582 return false; 579 return false;
583 580
584 m_data->unlock(); 581 m_data->unlock();
585 return true; 582 return true;
586 } 583 }
587 584
588 void Resource::responseReceived(const ResourceResponse& response, PassOwnPtr<Web DataConsumerHandle>) 585 void Resource::responseReceived(const ResourceResponse& response, PassOwnPtr<Web DataConsumerHandle>)
589 { 586 {
590 m_responseTimestamp = currentTime(); 587 m_responseTimestamp = currentTime();
591 588
592 if (!m_revalidatingRequest.isNull()) { 589 if (m_isRevalidating) {
590 m_isRevalidating = false;
593 if (response.httpStatusCode() == 304) { 591 if (response.httpStatusCode() == 304) {
594 revalidationSucceeded(response); 592 revalidationSucceeded(response);
595 return; 593 return;
596 } 594 }
597 revalidationFailed(); 595 revalidationFailed();
598 } 596 }
599 setResponse(response); 597 setResponse(response);
600 String encoding = response.textEncodingName(); 598 String encoding = response.textEncodingName();
601 if (!encoding.isNull()) 599 if (!encoding.isNull())
602 setEncoding(encoding); 600 setEncoding(encoding);
603 } 601 }
604 602
605 void Resource::setSerializedCachedMetadata(const char* data, size_t size) 603 void Resource::setSerializedCachedMetadata(const char* data, size_t size)
606 { 604 {
607 ASSERT(m_revalidatingRequest.isNull()); 605 DCHECK(!m_isRevalidating);
608 ASSERT(!m_response.isNull()); 606 ASSERT(!m_response.isNull());
609 if (m_cacheHandler) 607 if (m_cacheHandler)
610 m_cacheHandler->setSerializedCachedMetadata(data, size); 608 m_cacheHandler->setSerializedCachedMetadata(data, size);
611 } 609 }
612 610
613 CachedMetadataHandler* Resource::cacheHandler() 611 CachedMetadataHandler* Resource::cacheHandler()
614 { 612 {
615 return m_cacheHandler.get(); 613 return m_cacheHandler.get();
616 } 614 }
617 615
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 m_preloadResult = PreloadReferenced; 692 m_preloadResult = PreloadReferenced;
695 } 693 }
696 if (!hasClientsOrObservers()) 694 if (!hasClientsOrObservers())
697 memoryCache()->makeLive(this); 695 memoryCache()->makeLive(this);
698 } 696 }
699 697
700 void Resource::addClient(ResourceClient* client) 698 void Resource::addClient(ResourceClient* client)
701 { 699 {
702 willAddClientOrObserver(); 700 willAddClientOrObserver();
703 701
704 if (!m_revalidatingRequest.isNull()) { 702 if (m_isRevalidating) {
705 m_clients.add(client); 703 m_clients.add(client);
yhirano 2016/05/23 11:40:38 Not related to this CL but it looks a |didAddClien
Nate Chapin 2016/05/26 21:43:02 I don't think we want didAddClient here: that woul
yhirano 2016/05/27 01:55:56 Ah, I see, thank you.
706 return; 704 return;
707 } 705 }
708 706
709 // If we have existing data to send to the new client and the resource type supprts it, send it asynchronously. 707 // If we have existing data to send to the new client and the resource type supprts it, send it asynchronously.
710 if (!m_response.isNull() && !shouldSendCachedDataSynchronouslyForType(getTyp e()) && !m_needsSynchronousCacheHit) { 708 if (!m_response.isNull() && !shouldSendCachedDataSynchronouslyForType(getTyp e()) && !m_needsSynchronousCacheHit) {
711 m_clientsAwaitingCallback.add(client); 709 m_clientsAwaitingCallback.add(client);
712 ResourceCallback::callbackHandler().schedule(this); 710 ResourceCallback::callbackHandler().schedule(this);
713 return; 711 return;
714 } 712 }
715 713
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 const HTTPHeaderMap& newHeaders = validatingResponse.httpHeaderFields(); 909 const HTTPHeaderMap& newHeaders = validatingResponse.httpHeaderFields();
912 for (const auto& header : newHeaders) { 910 for (const auto& header : newHeaders) {
913 // Entity headers should not be sent by servers when generating a 304 911 // Entity headers should not be sent by servers when generating a 304
914 // response; misconfigured servers send them anyway. We shouldn't allow 912 // response; misconfigured servers send them anyway. We shouldn't allow
915 // such headers to update the original request. We'll base this on the 913 // such headers to update the original request. We'll base this on the
916 // list defined by RFC2616 7.1, with a few additions for extension heade rs 914 // list defined by RFC2616 7.1, with a few additions for extension heade rs
917 // we care about. 915 // we care about.
918 if (!shouldUpdateHeaderAfterRevalidation(header.key)) 916 if (!shouldUpdateHeaderAfterRevalidation(header.key))
919 continue; 917 continue;
920 m_response.setHTTPHeaderField(header.key, header.value); 918 m_response.setHTTPHeaderField(header.key, header.value);
921 } 919 }
yhirano 2016/05/23 11:40:38 m_isRevalidating = false;
Nate Chapin 2016/05/26 21:43:03 This is now set in responseReceived(), just before
922
923 m_resourceRequest = m_revalidatingRequest;
924 m_revalidatingRequest = ResourceRequest();
925 } 920 }
926 921
927 void Resource::revalidationFailed() 922 void Resource::revalidationFailed()
928 { 923 {
929 m_resourceRequest = m_revalidatingRequest;
930 m_revalidatingRequest = ResourceRequest();
931 m_redirectChain.clear(); 924 m_redirectChain.clear();
yhirano 2016/05/23 11:40:38 ditto
Nate Chapin 2016/05/26 21:43:02 ditto :)
932 m_data.clear(); 925 m_data.clear();
933 m_cacheHandler.clear(); 926 m_cacheHandler.clear();
934 destroyDecodedDataForFailedRevalidation(); 927 destroyDecodedDataForFailedRevalidation();
935 } 928 }
936 929
937 bool Resource::canReuseRedirectChain() 930 bool Resource::canReuseRedirectChain()
938 { 931 {
939 for (auto& redirect : m_redirectChain) { 932 for (auto& redirect : m_redirectChain) {
940 if (!canUseResponse(redirect.m_redirectResponse, m_responseTimestamp)) 933 if (!canUseResponse(redirect.m_redirectResponse, m_responseTimestamp))
941 return false; 934 return false;
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 case Resource::Media: 1122 case Resource::Media:
1130 return "Media"; 1123 return "Media";
1131 case Resource::Manifest: 1124 case Resource::Manifest:
1132 return "Manifest"; 1125 return "Manifest";
1133 } 1126 }
1134 ASSERT_NOT_REACHED(); 1127 ASSERT_NOT_REACHED();
1135 return "Unknown"; 1128 return "Unknown";
1136 } 1129 }
1137 1130
1138 } // namespace blink 1131 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698