OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2011 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 , m_substituteData(substituteData) | 96 , m_substituteData(substituteData) |
97 , m_originalRequestCopy(req) | 97 , m_originalRequestCopy(req) |
98 , m_request(req) | 98 , m_request(req) |
99 , m_originalSubstituteDataWasValid(substituteData.isValid()) | 99 , m_originalSubstituteDataWasValid(substituteData.isValid()) |
100 , m_committed(false) | 100 , m_committed(false) |
101 , m_isStopping(false) | 101 , m_isStopping(false) |
102 , m_gotFirstByte(false) | 102 , m_gotFirstByte(false) |
103 , m_isClientRedirect(false) | 103 , m_isClientRedirect(false) |
104 , m_isLoadingMultipartContent(false) | 104 , m_isLoadingMultipartContent(false) |
105 , m_wasOnloadHandled(false) | 105 , m_wasOnloadHandled(false) |
106 , m_substituteResourceDeliveryTimer(this, &DocumentLoader::substituteResourc
eDeliveryTimerFired) | |
107 , m_loadingMainResource(false) | 106 , m_loadingMainResource(false) |
108 , m_timeOfLastDataReceived(0.0) | 107 , m_timeOfLastDataReceived(0.0) |
109 , m_identifierForLoadWithoutResourceLoader(0) | 108 , m_identifierForLoadWithoutResourceLoader(0) |
110 , m_dataLoadTimer(this, &DocumentLoader::handleSubstituteDataLoadNow) | 109 , m_dataLoadTimer(this, &DocumentLoader::handleSubstituteDataLoadNow) |
111 , m_applicationCacheHost(adoptPtr(new ApplicationCacheHost(this))) | 110 , m_applicationCacheHost(adoptPtr(new ApplicationCacheHost(this))) |
112 { | 111 { |
113 } | 112 } |
114 | 113 |
115 FrameLoader* DocumentLoader::frameLoader() const | 114 FrameLoader* DocumentLoader::frameLoader() const |
116 { | 115 { |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 info.addMember(m_mainResource, "mainResource"); | 682 info.addMember(m_mainResource, "mainResource"); |
684 info.addMember(m_resourceLoaders, "resourceLoaders"); | 683 info.addMember(m_resourceLoaders, "resourceLoaders"); |
685 info.addMember(m_multipartResourceLoaders, "multipartResourceLoaders"); | 684 info.addMember(m_multipartResourceLoaders, "multipartResourceLoaders"); |
686 info.addMember(m_substituteData, "substituteData"); | 685 info.addMember(m_substituteData, "substituteData"); |
687 info.addMember(m_pageTitle.string(), "pageTitle.string()"); | 686 info.addMember(m_pageTitle.string(), "pageTitle.string()"); |
688 info.addMember(m_overrideEncoding, "overrideEncoding"); | 687 info.addMember(m_overrideEncoding, "overrideEncoding"); |
689 info.addMember(m_originalRequest, "originalRequest"); | 688 info.addMember(m_originalRequest, "originalRequest"); |
690 info.addMember(m_originalRequestCopy, "originalRequestCopy"); | 689 info.addMember(m_originalRequestCopy, "originalRequestCopy"); |
691 info.addMember(m_request, "request"); | 690 info.addMember(m_request, "request"); |
692 info.addMember(m_response, "response"); | 691 info.addMember(m_response, "response"); |
693 info.addMember(m_pendingSubstituteResources, "pendingSubstituteResources"); | |
694 info.addMember(m_substituteResourceDeliveryTimer, "substituteResourceDeliver
yTimer"); | |
695 info.addMember(m_archiveResourceCollection, "archiveResourceCollection"); | 692 info.addMember(m_archiveResourceCollection, "archiveResourceCollection"); |
696 info.addMember(m_archive, "archive"); | 693 info.addMember(m_archive, "archive"); |
697 info.addMember(m_resourcesClientKnowsAbout, "resourcesClientKnowsAbout"); | 694 info.addMember(m_resourcesClientKnowsAbout, "resourcesClientKnowsAbout"); |
698 info.addMember(m_resourcesLoadedFromMemoryCacheForClientNotification, "resou
rcesLoadedFromMemoryCacheForClientNotification"); | 695 info.addMember(m_resourcesLoadedFromMemoryCacheForClientNotification, "resou
rcesLoadedFromMemoryCacheForClientNotification"); |
699 info.addMember(m_applicationCacheHost, "applicationCacheHost"); | 696 info.addMember(m_applicationCacheHost, "applicationCacheHost"); |
700 } | 697 } |
701 | 698 |
702 void DocumentLoader::dataReceived(CachedResource* resource, const char* data, in
t length) | 699 void DocumentLoader::dataReceived(CachedResource* resource, const char* data, in
t length) |
703 { | 700 { |
704 ASSERT(data); | 701 ASSERT(data); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 return; | 829 return; |
833 addAllArchiveResources(m_archive.get()); | 830 addAllArchiveResources(m_archive.get()); |
834 | 831 |
835 ArchiveResource* mainResource = m_archive->mainResource(); | 832 ArchiveResource* mainResource = m_archive->mainResource(); |
836 m_substituteData = SubstituteData(mainResource->data(), mainResource->mimeTy
pe(), mainResource->textEncoding(), KURL()); | 833 m_substituteData = SubstituteData(mainResource->data(), mainResource->mimeTy
pe(), mainResource->textEncoding(), KURL()); |
837 } | 834 } |
838 | 835 |
839 void DocumentLoader::clearArchiveResources() | 836 void DocumentLoader::clearArchiveResources() |
840 { | 837 { |
841 m_archiveResourceCollection.clear(); | 838 m_archiveResourceCollection.clear(); |
842 m_substituteResourceDeliveryTimer.stop(); | |
843 } | 839 } |
844 | 840 |
845 ArchiveResource* DocumentLoader::archiveResourceForURL(const KURL& url) const | 841 bool DocumentLoader::scheduleArchiveLoad(CachedResource* cachedResource, const R
esourceRequest& request) |
846 { | 842 { |
847 if (!m_archiveResourceCollection) | 843 if (!m_archive) |
848 return 0; | 844 return false; |
849 | |
850 ArchiveResource* resource = m_archiveResourceCollection->archiveResourceForU
RL(url); | |
851 | 845 |
852 return resource && !resource->shouldIgnoreWhenUnarchiving() ? resource : 0; | 846 ASSERT(m_archiveResourceCollection); |
853 } | 847 ArchiveResource* archiveResource = m_archiveResourceCollection->archiveResou
rceForURL(request.url()); |
| 848 ASSERT(archiveResource); |
854 | 849 |
855 void DocumentLoader::deliverSubstituteResourcesAfterDelay() | 850 cachedResource->setLoading(true); |
856 { | 851 SharedBuffer* data = archiveResource->data(); |
857 if (m_pendingSubstituteResources.isEmpty()) | 852 cachedResource->responseReceived(archiveResource->response()); |
858 return; | 853 cachedResource->appendData(data->data(), data->size()); |
859 ASSERT(m_frame && m_frame->page()); | 854 cachedResource->finish(); |
860 if (m_frame->page()->defersLoading()) | 855 return true; |
861 return; | |
862 if (!m_substituteResourceDeliveryTimer.isActive()) | |
863 m_substituteResourceDeliveryTimer.startOneShot(0); | |
864 } | |
865 | |
866 void DocumentLoader::substituteResourceDeliveryTimerFired(Timer<DocumentLoader>*
) | |
867 { | |
868 if (m_pendingSubstituteResources.isEmpty()) | |
869 return; | |
870 ASSERT(m_frame && m_frame->page()); | |
871 if (m_frame->page()->defersLoading()) | |
872 return; | |
873 | |
874 SubstituteResourceMap copy; | |
875 copy.swap(m_pendingSubstituteResources); | |
876 | |
877 SubstituteResourceMap::const_iterator end = copy.end(); | |
878 for (SubstituteResourceMap::const_iterator it = copy.begin(); it != end; ++i
t) { | |
879 RefPtr<ResourceLoader> loader = it->key; | |
880 SubstituteResource* resource = it->value.get(); | |
881 | |
882 if (resource) { | |
883 SharedBuffer* data = resource->data(); | |
884 | |
885 loader->didReceiveResponse(0, resource->response()); | |
886 | |
887 // Calling ResourceLoader::didReceiveResponse can end up cancelling
the load, | |
888 // so we need to check if the loader has reached its terminal state. | |
889 if (loader->reachedTerminalState()) | |
890 return; | |
891 | |
892 loader->didReceiveData(0, data->data(), data->size(), data->size()); | |
893 | |
894 // Calling ResourceLoader::didReceiveData can end up cancelling the
load, | |
895 // so we need to check if the loader has reached its terminal state. | |
896 if (loader->reachedTerminalState()) | |
897 return; | |
898 | |
899 loader->didFinishLoading(0, 0); | |
900 } else { | |
901 // A null resource means that we should fail the load. | |
902 // FIXME: Maybe we should use another error here - something like "n
ot in cache". | |
903 loader->didFail(0, loader->cannotShowURLError()); | |
904 } | |
905 } | |
906 } | |
907 | |
908 #ifndef NDEBUG | |
909 bool DocumentLoader::isSubstituteLoadPending(ResourceLoader* loader) const | |
910 { | |
911 return m_pendingSubstituteResources.contains(loader); | |
912 } | |
913 #endif | |
914 | |
915 void DocumentLoader::cancelPendingSubstituteLoad(ResourceLoader* loader) | |
916 { | |
917 if (m_pendingSubstituteResources.isEmpty()) | |
918 return; | |
919 m_pendingSubstituteResources.remove(loader); | |
920 if (m_pendingSubstituteResources.isEmpty()) | |
921 m_substituteResourceDeliveryTimer.stop(); | |
922 } | |
923 | |
924 bool DocumentLoader::scheduleArchiveLoad(ResourceLoader* loader, const ResourceR
equest& request) | |
925 { | |
926 if (ArchiveResource* resource = archiveResourceForURL(request.url())) { | |
927 m_pendingSubstituteResources.set(loader, resource); | |
928 deliverSubstituteResourcesAfterDelay(); | |
929 return true; | |
930 } | |
931 return m_archive; | |
932 } | 856 } |
933 | 857 |
934 void DocumentLoader::setTitle(const StringWithDirection& title) | 858 void DocumentLoader::setTitle(const StringWithDirection& title) |
935 { | 859 { |
936 if (m_pageTitle == title) | 860 if (m_pageTitle == title) |
937 return; | 861 return; |
938 | 862 |
939 m_pageTitle = title; | 863 m_pageTitle = title; |
940 frameLoader()->didChangeTitle(this); | 864 frameLoader()->didChangeTitle(this); |
941 } | 865 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 | 907 |
984 void DocumentLoader::setDefersLoading(bool defers) | 908 void DocumentLoader::setDefersLoading(bool defers) |
985 { | 909 { |
986 // Multiple frames may be loading the same main resource simultaneously. If
deferral state changes, | 910 // Multiple frames may be loading the same main resource simultaneously. If
deferral state changes, |
987 // each frame's DocumentLoader will try to send a setDefersLoading() to the
same underlying ResourceLoader. Ensure only | 911 // each frame's DocumentLoader will try to send a setDefersLoading() to the
same underlying ResourceLoader. Ensure only |
988 // the "owning" DocumentLoader does so, as setDefersLoading() is not resilie
nt to setting the same value repeatedly. | 912 // the "owning" DocumentLoader does so, as setDefersLoading() is not resilie
nt to setting the same value repeatedly. |
989 if (mainResourceLoader() && mainResourceLoader()->documentLoader() == this) | 913 if (mainResourceLoader() && mainResourceLoader()->documentLoader() == this) |
990 mainResourceLoader()->setDefersLoading(defers); | 914 mainResourceLoader()->setDefersLoading(defers); |
991 | 915 |
992 setAllDefersLoading(m_resourceLoaders, defers); | 916 setAllDefersLoading(m_resourceLoaders, defers); |
993 if (!defers) | |
994 deliverSubstituteResourcesAfterDelay(); | |
995 } | 917 } |
996 | 918 |
997 void DocumentLoader::setMainResourceDataBufferingPolicy(DataBufferingPolicy data
BufferingPolicy) | 919 void DocumentLoader::setMainResourceDataBufferingPolicy(DataBufferingPolicy data
BufferingPolicy) |
998 { | 920 { |
999 if (m_mainResource) | 921 if (m_mainResource) |
1000 m_mainResource->setDataBufferingPolicy(dataBufferingPolicy); | 922 m_mainResource->setDataBufferingPolicy(dataBufferingPolicy); |
1001 } | 923 } |
1002 | 924 |
1003 void DocumentLoader::stopLoadingSubresources() | 925 void DocumentLoader::stopLoadingSubresources() |
1004 { | 926 { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1141 commitLoad(resourceData->data(), resourceData->size()); | 1063 commitLoad(resourceData->data(), resourceData->size()); |
1142 } | 1064 } |
1143 | 1065 |
1144 void DocumentLoader::handledOnloadEvents() | 1066 void DocumentLoader::handledOnloadEvents() |
1145 { | 1067 { |
1146 m_wasOnloadHandled = true; | 1068 m_wasOnloadHandled = true; |
1147 applicationCacheHost()->stopDeferringEvents(); | 1069 applicationCacheHost()->stopDeferringEvents(); |
1148 } | 1070 } |
1149 | 1071 |
1150 } // namespace WebCore | 1072 } // namespace WebCore |
OLD | NEW |