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

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

Issue 1706083002: Split ImageResourceClient into ResourceClient and ImageResourceObserver [1/2] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit refine. Created 4 years, 9 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 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 } 431 }
432 432
433 bool Resource::unlock() 433 bool Resource::unlock()
434 { 434 {
435 if (!m_data) 435 if (!m_data)
436 return false; 436 return false;
437 437
438 if (!m_data->isLocked()) 438 if (!m_data->isLocked())
439 return true; 439 return true;
440 440
441 if (!memoryCache()->contains(this) || hasClients() || !m_revalidatingRequest .isNull() || !m_loadFinishTime || !isSafeToUnlock()) 441 if (!memoryCache()->contains(this) || hasClientsOrObservers() || !m_revalida tingRequest.isNull() || !m_loadFinishTime || !isSafeToUnlock())
442 return false; 442 return false;
443 443
444 m_data->unlock(); 444 m_data->unlock();
445 return true; 445 return true;
446 } 446 }
447 447
448 void Resource::responseReceived(const ResourceResponse& response, PassOwnPtr<Web DataConsumerHandle>) 448 void Resource::responseReceived(const ResourceResponse& response, PassOwnPtr<Web DataConsumerHandle>)
449 { 449 {
450 m_responseTimestamp = currentTime(); 450 m_responseTimestamp = currentTime();
451 451
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 #if ENABLE(OILPAN) 511 #if ENABLE(OILPAN)
512 return this; 512 return this;
513 #else 513 #else
514 return m_weakPtrFactory.createWeakPtr(); 514 return m_weakPtrFactory.createWeakPtr();
515 #endif 515 #endif
516 } 516 }
517 517
518 String Resource::reasonNotDeletable() const 518 String Resource::reasonNotDeletable() const
519 { 519 {
520 StringBuilder builder; 520 StringBuilder builder;
521 if (hasClients()) { 521 if (hasClientsOrObservers()) {
522 builder.append("hasClients("); 522 builder.append("hasClients(");
523 builder.appendNumber(m_clients.size()); 523 builder.appendNumber(m_clients.size());
524 if (!m_clientsAwaitingCallback.isEmpty()) { 524 if (!m_clientsAwaitingCallback.isEmpty()) {
525 builder.append(", AwaitingCallback="); 525 builder.append(", AwaitingCallback=");
526 builder.appendNumber(m_clientsAwaitingCallback.size()); 526 builder.appendNumber(m_clientsAwaitingCallback.size());
527 } 527 }
528 if (!m_finishedClients.isEmpty()) { 528 if (!m_finishedClients.isEmpty()) {
529 builder.append(", Finished="); 529 builder.append(", Finished=");
530 builder.appendNumber(m_finishedClients.size()); 530 builder.appendNumber(m_finishedClients.size());
531 } 531 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 return true; 586 return true;
587 if (type == Resource::CSSStyleSheet) 587 if (type == Resource::CSSStyleSheet)
588 return true; 588 return true;
589 if (type == Resource::Script) 589 if (type == Resource::Script)
590 return true; 590 return true;
591 if (type == Resource::Font) 591 if (type == Resource::Font)
592 return true; 592 return true;
593 return false; 593 return false;
594 } 594 }
595 595
596 void Resource::addClient(ResourceClient* client) 596 void Resource::willAddClientOrObserver()
597 { 597 {
598 ASSERT(!isPurgeable()); 598 ASSERT(!isPurgeable());
599
600 if (m_preloadResult == PreloadNotReferenced) { 599 if (m_preloadResult == PreloadNotReferenced) {
601 if (isLoaded()) 600 if (isLoaded())
602 m_preloadResult = PreloadReferencedWhileComplete; 601 m_preloadResult = PreloadReferencedWhileComplete;
603 else if (m_requestedFromNetworkingLayer) 602 else if (m_requestedFromNetworkingLayer)
604 m_preloadResult = PreloadReferencedWhileLoading; 603 m_preloadResult = PreloadReferencedWhileLoading;
605 else 604 else
606 m_preloadResult = PreloadReferenced; 605 m_preloadResult = PreloadReferenced;
607 } 606 }
608 if (!hasClients()) 607 if (!hasClientsOrObservers())
609 memoryCache()->makeLive(this); 608 memoryCache()->makeLive(this);
609 }
610
611 void Resource::addClient(ResourceClient* client)
612 {
613 willAddClientOrObserver();
610 614
611 if (!m_revalidatingRequest.isNull()) { 615 if (!m_revalidatingRequest.isNull()) {
612 m_clients.add(client); 616 m_clients.add(client);
613 return; 617 return;
614 } 618 }
615 619
616 // If we have existing data to send to the new client and the resource type supprts it, send it asynchronously. 620 // If we have existing data to send to the new client and the resource type supprts it, send it asynchronously.
617 if (!m_response.isNull() && !shouldSendCachedDataSynchronouslyForType(getTyp e()) && !m_needsSynchronousCacheHit) { 621 if (!m_response.isNull() && !shouldSendCachedDataSynchronouslyForType(getTyp e()) && !m_needsSynchronousCacheHit) {
618 m_clientsAwaitingCallback.add(client); 622 m_clientsAwaitingCallback.add(client);
619 ResourceCallback::callbackHandler()->schedule(this); 623 ResourceCallback::callbackHandler()->schedule(this);
620 return; 624 return;
621 } 625 }
622 626
623 m_clients.add(client); 627 m_clients.add(client);
624 didAddClient(client); 628 didAddClient(client);
625 return; 629 return;
626 } 630 }
627 631
628 void Resource::removeClient(ResourceClient* client) 632 void Resource::removeClient(ResourceClient* client)
629 { 633 {
630 ASSERT(hasClient(client)); 634 ASSERT(hasClient(client));
631 if (m_finishedClients.contains(client)) 635 if (m_finishedClients.contains(client))
632 m_finishedClients.remove(client); 636 m_finishedClients.remove(client);
633 else if (m_clientsAwaitingCallback.contains(client)) 637 else if (m_clientsAwaitingCallback.contains(client))
634 m_clientsAwaitingCallback.remove(client); 638 m_clientsAwaitingCallback.remove(client);
635 else 639 else
636 m_clients.remove(client); 640 m_clients.remove(client);
637 641
638 didRemoveClient(client);
639
640 if (m_clientsAwaitingCallback.isEmpty()) 642 if (m_clientsAwaitingCallback.isEmpty())
641 ResourceCallback::callbackHandler()->cancel(this); 643 ResourceCallback::callbackHandler()->cancel(this);
642 644
643 if (!hasClients()) { 645 didRemoveClientOrObserver();
646 // This object may be dead here.
647 }
648
649 void Resource::didRemoveClientOrObserver()
650 {
651 if (!hasClientsOrObservers()) {
644 RefPtrWillBeRawPtr<Resource> protect(this); 652 RefPtrWillBeRawPtr<Resource> protect(this);
645 memoryCache()->makeDead(this); 653 memoryCache()->makeDead(this);
646 allClientsRemoved(); 654 allClientsAndObserversRemoved();
647 655
648 // RFC2616 14.9.2: 656 // RFC2616 14.9.2:
649 // "no-store: ... MUST make a best-effort attempt to remove the informat ion from volatile storage as promptly as possible" 657 // "no-store: ... MUST make a best-effort attempt to remove the informat ion from volatile storage as promptly as possible"
650 // "... History buffers MAY store such responses as part of their normal operation." 658 // "... History buffers MAY store such responses as part of their normal operation."
651 // We allow non-secure content to be reused in history, but we do not al low secure content to be reused. 659 // We allow non-secure content to be reused in history, but we do not al low secure content to be reused.
652 if (hasCacheControlNoStoreHeader() && url().protocolIs("https")) { 660 if (hasCacheControlNoStoreHeader() && url().protocolIs("https")) {
653 memoryCache()->remove(this); 661 memoryCache()->remove(this);
654 memoryCache()->prune(); 662 memoryCache()->prune();
655 } else { 663 } else {
656 memoryCache()->prune(this); 664 memoryCache()->prune(this);
657 } 665 }
658 } 666 }
659 // This object may be dead here. 667 // This object may be dead here.
660 } 668 }
661 669
662 void Resource::allClientsRemoved() 670 void Resource::allClientsAndObserversRemoved()
663 { 671 {
664 if (!m_loader) 672 if (!m_loader)
665 return; 673 return;
666 if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this )) 674 if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this ))
667 cancelTimerFired(&m_cancelTimer); 675 cancelTimerFired(&m_cancelTimer);
668 else if (!m_cancelTimer.isActive()) 676 else if (!m_cancelTimer.isActive())
669 m_cancelTimer.startOneShot(0, BLINK_FROM_HERE); 677 m_cancelTimer.startOneShot(0, BLINK_FROM_HERE);
670 678
671 unlock(); 679 unlock();
672 } 680 }
673 681
674 void Resource::cancelTimerFired(Timer<Resource>* timer) 682 void Resource::cancelTimerFired(Timer<Resource>* timer)
675 { 683 {
676 ASSERT_UNUSED(timer, timer == &m_cancelTimer); 684 ASSERT_UNUSED(timer, timer == &m_cancelTimer);
677 if (hasClients() || !m_loader) 685 if (hasClientsOrObservers() || !m_loader)
678 return; 686 return;
679 RefPtrWillBeRawPtr<Resource> protect(this); 687 RefPtrWillBeRawPtr<Resource> protect(this);
680 m_loader->cancelIfNotFinishing(); 688 m_loader->cancelIfNotFinishing();
681 if (m_status != Cached) 689 if (m_status != Cached)
682 memoryCache()->remove(this); 690 memoryCache()->remove(this);
683 } 691 }
684 692
685 void Resource::setDecodedSize(size_t decodedSize) 693 void Resource::setDecodedSize(size_t decodedSize)
686 { 694 {
687 if (decodedSize == m_decodedSize) 695 if (decodedSize == m_decodedSize)
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 return m_data && !m_data->isLocked(); 890 return m_data && !m_data->isLocked();
883 } 891 }
884 892
885 bool Resource::lock() 893 bool Resource::lock()
886 { 894 {
887 if (!m_data) 895 if (!m_data)
888 return true; 896 return true;
889 if (m_data->isLocked()) 897 if (m_data->isLocked())
890 return true; 898 return true;
891 899
892 ASSERT(!hasClients()); 900 ASSERT(!hasClientsOrObservers());
893 901
894 // If locking fails, our buffer has been purged. There's no point 902 // If locking fails, our buffer has been purged. There's no point
895 // in leaving a purged resource in MemoryCache. 903 // in leaving a purged resource in MemoryCache.
896 if (!m_data->lock()) { 904 if (!m_data->lock()) {
897 memoryCache()->remove(this); 905 memoryCache()->remove(this);
898 return false; 906 return false;
899 } 907 }
900 return true; 908 return true;
901 } 909 }
902 910
903 size_t Resource::overheadSize() const 911 size_t Resource::overheadSize() const
904 { 912 {
905 static const int kAverageClientsHashMapSize = 384; 913 static const int kAverageClientsHashMapSize = 384;
906 return sizeof(Resource) + m_response.memoryUsage() + kAverageClientsHashMapS ize + m_resourceRequest.url().string().length() * 2; 914 return sizeof(Resource) + m_response.memoryUsage() + kAverageClientsHashMapS ize + m_resourceRequest.url().string().length() * 2;
907 } 915 }
908 916
909 void Resource::didChangePriority(ResourceLoadPriority loadPriority, int intraPri orityValue) 917 void Resource::didChangePriority(ResourceLoadPriority loadPriority, int intraPri orityValue)
910 { 918 {
911 m_resourceRequest.setPriority(loadPriority, intraPriorityValue); 919 m_resourceRequest.setPriority(loadPriority, intraPriorityValue);
912 if (m_loader) 920 if (m_loader)
913 m_loader->didChangePriority(loadPriority, intraPriorityValue); 921 m_loader->didChangePriority(loadPriority, intraPriorityValue);
914 } 922 }
915 923
916 ResourcePriority Resource::priorityFromClients()
917 {
918 ResourcePriority priority;
919 ResourceClientWalker<ResourceClient> walker(m_clients);
920 while (ResourceClient* c = walker.next()) {
921 ResourcePriority nextPriority = c->computeResourcePriority();
922 if (nextPriority.visibility == ResourcePriority::NotVisible)
923 continue;
924 priority.visibility = ResourcePriority::Visible;
925 priority.intraPriorityValue += nextPriority.intraPriorityValue;
926 }
927 return priority;
928 }
929
930 Resource::ResourceCallback* Resource::ResourceCallback::callbackHandler() 924 Resource::ResourceCallback* Resource::ResourceCallback::callbackHandler()
931 { 925 {
932 // Oilpan + LSan: as the callbackHandler() singleton is used by Resource 926 // Oilpan + LSan: as the callbackHandler() singleton is used by Resource
933 // and ResourcePtr finalizers, it cannot be released upon shutdown in 927 // and ResourcePtr finalizers, it cannot be released upon shutdown in
934 // preparation for leak detection. 928 // preparation for leak detection.
935 // 929 //
936 // Keep it out of LSan's reach instead. 930 // Keep it out of LSan's reach instead.
937 LEAK_SANITIZER_DISABLED_SCOPE; 931 LEAK_SANITIZER_DISABLED_SCOPE;
938 DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<ResourceCallback>, callbackHandle r, (adoptPtrWillBeNoop(new ResourceCallback))); 932 DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<ResourceCallback>, callbackHandle r, (adoptPtrWillBeNoop(new ResourceCallback)));
939 return callbackHandler.get(); 933 return callbackHandler.get();
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1110 case Resource::Media: 1104 case Resource::Media:
1111 return "Media"; 1105 return "Media";
1112 case Resource::Manifest: 1106 case Resource::Manifest:
1113 return "Manifest"; 1107 return "Manifest";
1114 } 1108 }
1115 ASSERT_NOT_REACHED(); 1109 ASSERT_NOT_REACHED();
1116 return "Unknown"; 1110 return "Unknown";
1117 } 1111 }
1118 1112
1119 } // namespace blink 1113 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698