WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-138835-20141120123040.patch (text/plain), 34.83 KB, created by
youenn fablet
on 2014-11-20 03:30:26 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2014-11-20 03:30:26 PST
Size:
34.83 KB
patch
obsolete
>Subversion Revision: 176149 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index f206c9351bf3b1d76c16e543295aba238fe4d629..21a52a9d240030ed4d6a1d07e67faf52b2511972 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,52 @@ >+2014-11-20 Youenn Fablet <youenn.fablet@crf.canon.fr> >+ >+ Move Blob loading in Web Process. >+ https://bugs.webkit.org/show_bug.cgi?id=138835 >+ >+ Reviewed by NOBODY (OOPS!). >+ Made blob loading happening at SubresourceLoader level. >+ Ensure that blob registration and resolution always happen within Web Process. >+ In particular blobs are resolved within form data when added as HTTP body so that the network layer does not need to do that anymore. >+ >+ Existing tests cover this patch. >+ >+ * WebCore.xcodeproj/project.pbxproj: Made BlobResourceHandle.h accessible to SubresourceLoader.cpp. >+ * loader/FrameLoader.cpp: >+ (WebCore::FrameLoader::loadResourceSynchronously): Direct call to SubresourceLoader::loadResourceSynchronously. >+ * loader/ResourceLoadScheduler.cpp: >+ (WebCore::ResourceLoadScheduler::scheduleSubresourceLoad): Moved SubresourceLoader object creation into CachedResource. >+ * loader/ResourceLoadScheduler.h: Ditto. >+ * loader/ResourceLoader.cpp: >+ (WebCore::ResourceLoader::willSwitchToSubstituteResource): Make use of cancelHandle. >+ (WebCore::ResourceLoader::cancel): Ditto. >+ (WebCore::ResourceLoader::cancelHandle): Virtual method to cancel the resource handle, overriden in SubresourceLoader to also cancel the blob handle. >+ * loader/ResourceLoader.h: Added cancelHandle and accessor to frame. >+ (WebCore::ResourceLoader::frame): >+ * loader/SubresourceLoader.cpp: >+ (WebCore::SubresourceLoader::loadSynchronously): Centralizes all sync loading. >+ (WebCore::SubresourceLoader::scheduleLoad): Centralizes all async loading start. >+ (WebCore::SubresourceLoader::cancelHandle): Cancel blob handle if one. >+ * loader/SubresourceLoader.h: >+ * loader/appcache/ApplicationCacheHost.cpp: >+ (WebCore::ApplicationCacheHost::maybeLoadSynchronously): const parameter change. >+ * loader/appcache/ApplicationCacheHost.h: Ditto. >+ * loader/cache/CachedResource.cpp: >+ (WebCore::CachedResource::load): Directly create SubresourceLoader object and request to load it. >+ * platform/network/BlobRegistryImpl.cpp: >+ (WebCore::BlobRegistryImpl::registerFileBlobURL): Removed ResourceHandle callback hook. >+ (WebCore::BlobRegistryImpl::registerBlobURL): Ditto. >+ * platform/network/BlobResourceHandle.cpp: >+ (WebCore::BlobResourceHandle::createAsync):: Direct handling of blob url resolution. >+ (WebCore::BlobResourceHandle::loadResourceSynchronously): Direct handling of blob url resolution. >+ * platform/network/BlobResourceHandle.h: Ditto plus made cancel() public. >+ * platform/network/FormData.cpp: >+ (WebCore::blobIsOutOfDate): Added check whether blob file item is out of date or not (taken from soup backend). >+ (WebCore::appendBlobResolved): Ensure that out-of-date files are not actually added to the form data. >+ * platform/network/ResourceRequestBase.cpp: >+ (WebCore::ResourceRequestBase::setHTTPBody): Resolve blobs if any. >+ * xml/XMLHttpRequest.cpp: >+ (WebCore::XMLHttpRequest::responseBlob): Removed fixme. >+ > 2014-11-14 Andreas Kling <akling@apple.com> > > [mac] Only images that are actually purgeable should be advertised as such. >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index 91f9ba95d7b6e0c65c679920ceb756b985c54cf1..5467c7bcb583504dffe43917734ccad6d0520997 100644 >--- a/Source/WebKit2/ChangeLog >+++ b/Source/WebKit2/ChangeLog >@@ -1,3 +1,17 @@ >+2014-11-20 Youenn Fablet <youenn.fablet@crf.canon.fr> >+ >+ Move Blob loading in Web Process >+ https://bugs.webkit.org/show_bug.cgi?id=138835 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * WebProcess/FileAPI/BlobRegistryProxy.h: Added a FIXME as this class may no longer be needed. >+ * WebProcess/Network/WebResourceLoadScheduler.cpp: >+ (WebKit::WebResourceLoadScheduler::scheduleSubresourceLoad): Moved SubresourceLoader object creation into CachedResource. >+ * WebProcess/Network/WebResourceLoadScheduler.h: Ditto. >+ * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp: >+ (WebKit::WebPlatformStrategies::createBlobRegistry): Ensure that we use Web Process blob registry. >+ > 2014-11-14 Tim Horton <timothy_horton@apple.com> > > Frequent crashes under actionContextForResultAtPoint >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 1799ac54be029691dc9048739a43a6c4f0636649..627346d1b4c1345b6f675be213789d06986cc97e 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -1183,7 +1183,7 @@ > 2E94F43C119207DA00B7F75D /* JSFileReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E94F43A119207DA00B7F75D /* JSFileReader.h */; }; > 2EA768040FE7126400AB9C8A /* WorkerScriptLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EA768030FE7126400AB9C8A /* WorkerScriptLoaderClient.h */; }; > 2EB4BCD2121F03E300EC4885 /* BlobResourceHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2EB4BCD0121F03E300EC4885 /* BlobResourceHandle.cpp */; }; >- 2EB4BCD3121F03E300EC4885 /* BlobResourceHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EB4BCD1121F03E300EC4885 /* BlobResourceHandle.h */; }; >+ 2EB4BCD3121F03E300EC4885 /* BlobResourceHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EB4BCD1121F03E300EC4885 /* BlobResourceHandle.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 2ECF7ADC10162B3800427DE7 /* JSErrorEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2ECF7ADA10162B3800427DE7 /* JSErrorEvent.cpp */; }; > 2ECF7ADD10162B3800427DE7 /* JSErrorEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ECF7ADB10162B3800427DE7 /* JSErrorEvent.h */; }; > 2ECF7AE110162B5800427DE7 /* ErrorEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2ECF7ADE10162B5800427DE7 /* ErrorEvent.cpp */; }; >diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp >index 519408b57f626132a9ae32bd5047598d3c5d37c8..4b76513166c1ff5b517389dba4231410410f3817 100644 >--- a/Source/WebCore/loader/FrameLoader.cpp >+++ b/Source/WebCore/loader/FrameLoader.cpp >@@ -36,7 +36,6 @@ > #include "FrameLoader.h" > > #include "AXObjectCache.h" >-#include "ApplicationCacheHost.h" > #include "BackForwardController.h" > #include "BeforeUnloadEvent.h" > #include "CachedPage.h" >@@ -113,6 +112,7 @@ > #include "SerializedScriptValue.h" > #include "Settings.h" > #include "SubframeLoader.h" >+#include "SubresourceLoader.h" > #include "TextResourceDecoder.h" > #include "WindowFeatures.h" > #include "XMLDocumentParser.h" >@@ -2673,11 +2673,7 @@ unsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& requ > > if (error.isNull()) { > ASSERT(!newRequest.isNull()); >- >- if (!documentLoader()->applicationCacheHost()->maybeLoadSynchronously(newRequest, error, response, data)) { >- platformStrategies()->loaderStrategy()->loadResourceSynchronously(networkingContext(), identifier, newRequest, storedCredentials, clientCredentialPolicy, error, response, data); >- documentLoader()->applicationCacheHost()->maybeLoadFallbackSynchronously(newRequest, error, response, data); >- } >+ SubresourceLoader::loadSynchronously(this, identifier, newRequest, storedCredentials, clientCredentialPolicy, error, response, data); > } > notifier().sendRemainingDelegateMessages(m_documentLoader.get(), identifier, request, response, data.data(), data.size(), -1, error); > return identifier; >diff --git a/Source/WebCore/loader/ResourceLoadScheduler.cpp b/Source/WebCore/loader/ResourceLoadScheduler.cpp >index 6d8b9e7fe496ba955a18887fe9b605d706c28e94..2167b9badd238e534a118f23771fca9b892906a5 100644 >--- a/Source/WebCore/loader/ResourceLoadScheduler.cpp >+++ b/Source/WebCore/loader/ResourceLoadScheduler.cpp >@@ -112,11 +112,10 @@ ResourceLoadScheduler::~ResourceLoadScheduler() > { > } > >-PassRefPtr<SubresourceLoader> ResourceLoadScheduler::scheduleSubresourceLoad(Frame* frame, CachedResource* resource, const ResourceRequest& request, const ResourceLoaderOptions& options) >+bool ResourceLoadScheduler::scheduleSubresourceLoad(SubresourceLoader* loader) > { >- RefPtr<SubresourceLoader> loader = SubresourceLoader::create(frame, resource, request, options); > if (loader) >- scheduleLoad(loader.get()); >+ scheduleLoad(loader); > #if PLATFORM(IOS) > // Since we defer loader initialization until scheduling on iOS, the frame > // load delegate that would be called in SubresourceLoader::create() on >@@ -124,9 +123,9 @@ PassRefPtr<SubresourceLoader> ResourceLoadScheduler::scheduleSubresourceLoad(Fra > // callers of this method is that a null loader is returned if the load was > // cancelled by a frame load delegate. > if (!loader || loader->reachedTerminalState()) >- return nullptr; >+ return false; > #endif >- return loader.release(); >+ return true; > } > > PassRefPtr<NetscapePlugInStreamLoader> ResourceLoadScheduler::schedulePluginStreamLoad(Frame* frame, NetscapePlugInStreamLoaderClient* client, const ResourceRequest& request) >diff --git a/Source/WebCore/loader/ResourceLoadScheduler.h b/Source/WebCore/loader/ResourceLoadScheduler.h >index 5b3742f3931f09fc35a916b651b2619941ae334d..45d404a72d8aed9fc833d5954646838e3143abde 100644 >--- a/Source/WebCore/loader/ResourceLoadScheduler.h >+++ b/Source/WebCore/loader/ResourceLoadScheduler.h >@@ -50,7 +50,7 @@ class ResourceLoadScheduler { > public: > friend ResourceLoadScheduler* resourceLoadScheduler(); > >- WEBCORE_EXPORT virtual PassRefPtr<SubresourceLoader> scheduleSubresourceLoad(Frame*, CachedResource*, const ResourceRequest&, const ResourceLoaderOptions&); >+ WEBCORE_EXPORT virtual bool scheduleSubresourceLoad(SubresourceLoader*); > WEBCORE_EXPORT virtual PassRefPtr<NetscapePlugInStreamLoader> schedulePluginStreamLoad(Frame*, NetscapePlugInStreamLoaderClient*, const ResourceRequest&); > WEBCORE_EXPORT virtual void remove(ResourceLoader*); > virtual void setDefersLoading(ResourceLoader*, bool); >diff --git a/Source/WebCore/loader/ResourceLoader.cpp b/Source/WebCore/loader/ResourceLoader.cpp >index e522d3cafd87085cf9a77b73116f7228e6c9d6e7..d68d40e64b8dde59258a5e7d2835018b01e164e3 100644 >--- a/Source/WebCore/loader/ResourceLoader.cpp >+++ b/Source/WebCore/loader/ResourceLoader.cpp >@@ -210,8 +210,7 @@ void ResourceLoader::willSwitchToSubstituteResource() > { > ASSERT(!m_documentLoader->isSubstituteLoadPending(this)); > platformStrategies()->loaderStrategy()->resourceLoadScheduler()->remove(this); >- if (m_handle) >- m_handle->cancel(); >+ cancelHandle(); > } > > void ResourceLoader::addDataOrBuffer(const char* data, unsigned length, SharedBuffer* buffer, DataPayloadType dataPayloadType) >@@ -428,10 +427,7 @@ void ResourceLoader::cancel(const ResourceError& error) > m_handle->clearAuthentication(); > > m_documentLoader->cancelPendingSubstituteLoad(this); >- if (m_handle) { >- m_handle->cancel(); >- m_handle = 0; >- } >+ cancelHandle(); > cleanupForError(nonNullError); > } > >@@ -449,6 +445,14 @@ void ResourceLoader::cancel(const ResourceError& error) > releaseResources(); > } > >+void ResourceLoader::cancelHandle() >+{ >+ if (m_handle) { >+ m_handle->cancel(); >+ m_handle = 0; >+ } >+} >+ > ResourceError ResourceLoader::cancelledError() > { > return frameLoader()->cancelledError(m_request); >diff --git a/Source/WebCore/loader/ResourceLoader.h b/Source/WebCore/loader/ResourceLoader.h >index 1615f6d9bf8dc34a4e9bcf46bb63b68f6cfda01a..393bfd8cbdf9a4e4ffd3428bad069528cb76c52c 100644 >--- a/Source/WebCore/loader/ResourceLoader.h >+++ b/Source/WebCore/loader/ResourceLoader.h >@@ -70,6 +70,7 @@ public: > virtual const ResourceRequest& iOSOriginalRequest() const { return request(); } > #endif > >+ WEBCORE_EXPORT Frame* frame() const { return m_frame.get(); }; > WEBCORE_EXPORT FrameLoader* frameLoader() const; > DocumentLoader* documentLoader() const { return m_documentLoader.get(); } > WEBCORE_EXPORT const ResourceRequest& originalRequest() const { return m_originalRequest; } >@@ -151,6 +152,8 @@ protected: > > bool wasCancelled() const { return m_cancellationStatus >= Cancelled; } > >+ virtual void cancelHandle(); >+ > void didReceiveDataOrBuffer(const char*, unsigned, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType); > > const ResourceLoaderOptions& options() { return m_options; } >diff --git a/Source/WebCore/loader/SubresourceLoader.cpp b/Source/WebCore/loader/SubresourceLoader.cpp >index 206dd22b6332ac5f10962e86942b79089e3932ce..0432a18aa67cf1cfc3ea8a6f5166f98974863d48 100644 >--- a/Source/WebCore/loader/SubresourceLoader.cpp >+++ b/Source/WebCore/loader/SubresourceLoader.cpp >@@ -29,20 +29,25 @@ > #include "config.h" > #include "SubresourceLoader.h" > >+#include "ApplicationCacheHost.h" > #include "CachedResourceLoader.h" > #include "Document.h" > #include "DocumentLoader.h" > #include "Frame.h" > #include "FrameLoader.h" >+#include "LoaderStrategy.h" > #include "Logging.h" > #include "MemoryCache.h" > #include "Page.h" > #include "PageActivityAssertionToken.h" >+#include "PlatformStrategies.h" >+#include "ResourceLoadScheduler.h" > #include <wtf/Ref.h> > #include <wtf/RefCountedLeakCounter.h> > #include <wtf/StdLibExtras.h> > #include <wtf/text/CString.h> > >+ > #if PLATFORM(IOS) > #include <RuntimeApplicationChecksIOS.h> > #endif >@@ -100,7 +105,41 @@ PassRefPtr<SubresourceLoader> SubresourceLoader::create(Frame* frame, CachedReso > return nullptr; > return subloader.release(); > } >- >+ >+void SubresourceLoader::loadSynchronously(FrameLoader* frameLoader, unsigned long identifier, const ResourceRequest& request, StoredCredentials storedCredentials, ClientCredentialPolicy clientCredentialPolicy, ResourceError& error, ResourceResponse& response, Vector<char>& data) >+{ >+ if (request.url().protocolIs("blob")) { >+ BlobResourceHandle::loadResourceSynchronously(request, error, response, data); >+ return; >+ } >+ >+ if (!frameLoader->documentLoader()->applicationCacheHost()->maybeLoadSynchronously(request, error, response, data)) { >+ platformStrategies()->loaderStrategy()->loadResourceSynchronously(frameLoader->networkingContext(), identifier, request, storedCredentials, clientCredentialPolicy, error, response, data); >+ frameLoader->documentLoader()->applicationCacheHost()->maybeLoadFallbackSynchronously(request, error, response, data); >+ } >+} >+ >+bool SubresourceLoader::scheduleLoad() >+{ >+ if (url().protocolIs("blob")) { >+ m_blobHandle = BlobResourceHandle::createAsync(request(), this); >+ if (!m_blobHandle) >+ return false; >+ m_blobHandle->start(); >+ return true; >+ } >+ return platformStrategies()->loaderStrategy()->resourceLoadScheduler()->scheduleSubresourceLoad(this); >+} >+ >+void SubresourceLoader::cancelHandle() >+{ >+ if (m_blobHandle) { >+ m_blobHandle->cancel(); >+ m_blobHandle = nullptr; >+ } >+ ResourceLoader::cancelHandle(); >+} >+ > #if PLATFORM(IOS) > bool SubresourceLoader::startLoading() > { >@@ -113,11 +152,6 @@ bool SubresourceLoader::startLoading() > } > #endif > >-CachedResource* SubresourceLoader::cachedResource() >-{ >- return m_resource; >-} >- > void SubresourceLoader::cancelIfNotFinishing() > { > if (m_state != Initialized) >diff --git a/Source/WebCore/loader/SubresourceLoader.h b/Source/WebCore/loader/SubresourceLoader.h >index 303ffd9abd7b1bb4d092d18019d6b1115e914289..24d233062174b59dde1f76d00a20f85fa4f75234 100644 >--- a/Source/WebCore/loader/SubresourceLoader.h >+++ b/Source/WebCore/loader/SubresourceLoader.h >@@ -29,6 +29,7 @@ > #ifndef SubresourceLoader_h > #define SubresourceLoader_h > >+#include "BlobResourceHandle.h" > #include "FrameLoaderTypes.h" > #include "ResourceLoader.h" > >@@ -44,13 +45,15 @@ class ResourceRequest; > > class SubresourceLoader final : public ResourceLoader { > public: >- WEBCORE_EXPORT static PassRefPtr<SubresourceLoader> create(Frame*, CachedResource*, const ResourceRequest&, const ResourceLoaderOptions&); >+ static PassRefPtr<SubresourceLoader> create(Frame*, CachedResource*, const ResourceRequest&, const ResourceLoaderOptions&); >+ static void loadSynchronously(FrameLoader*, unsigned long, const ResourceRequest&, StoredCredentials, ClientCredentialPolicy, ResourceError&, ResourceResponse&, Vector<char>&); > > virtual ~SubresourceLoader(); > >+ bool scheduleLoad(); > void cancelIfNotFinishing(); > virtual bool isSubresourceLoader() override; >- CachedResource* cachedResource(); >+ CachedResource* cachedResource() { return m_resource; }; > > #if PLATFORM(IOS) > virtual bool startLoading() override; >@@ -63,6 +66,7 @@ private: > SubresourceLoader(Frame*, CachedResource*, const ResourceLoaderOptions&); > > virtual bool init(const ResourceRequest&) override; >+ virtual void cancelHandle() override; > > virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse) override; > virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override; >@@ -122,6 +126,7 @@ private: > bool m_loadingMultipartContent; > SubresourceLoaderState m_state; > OwnPtr<RequestCountTracker> m_requestCountTracker; >+ RefPtr<BlobResourceHandle> m_blobHandle; > }; > > } >diff --git a/Source/WebCore/loader/appcache/ApplicationCacheHost.cpp b/Source/WebCore/loader/appcache/ApplicationCacheHost.cpp >index 9cfb505b0bb794864eacbf1aa9e5a7df5a5cd1f5..0f420eb8b6efbedb716723c3fa7b9b7ec4b1fc19 100644 >--- a/Source/WebCore/loader/appcache/ApplicationCacheHost.cpp >+++ b/Source/WebCore/loader/appcache/ApplicationCacheHost.cpp >@@ -202,7 +202,7 @@ bool ApplicationCacheHost::maybeLoadFallbackForError(ResourceLoader* resourceLoa > return false; > } > >-bool ApplicationCacheHost::maybeLoadSynchronously(ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data) >+bool ApplicationCacheHost::maybeLoadSynchronously(const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data) > { > ApplicationCacheResource* resource; > if (shouldLoadResourceFromApplicationCache(request, resource)) { >diff --git a/Source/WebCore/loader/appcache/ApplicationCacheHost.h b/Source/WebCore/loader/appcache/ApplicationCacheHost.h >index 86c17740e9b54c093128183fdb014a0ec12cf7df..ff095133d4e88252ab7e4117331c2669cc77b2ba 100644 >--- a/Source/WebCore/loader/appcache/ApplicationCacheHost.h >+++ b/Source/WebCore/loader/appcache/ApplicationCacheHost.h >@@ -128,7 +128,7 @@ namespace WebCore { > WEBCORE_EXPORT bool maybeLoadFallbackForResponse(ResourceLoader*, const ResourceResponse&); > WEBCORE_EXPORT bool maybeLoadFallbackForError(ResourceLoader*, const ResourceError&); > >- bool maybeLoadSynchronously(ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data); >+ bool maybeLoadSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data); > void maybeLoadFallbackSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data); > > bool canCacheInPageCache(); >diff --git a/Source/WebCore/loader/cache/CachedResource.cpp b/Source/WebCore/loader/cache/CachedResource.cpp >index 4f5f5a4a453cec8ff6dc73151b65e3fb21e35cbe..a1417abddbbd354d38a0291492bc601ef49b1b9f 100644 >--- a/Source/WebCore/loader/cache/CachedResource.cpp >+++ b/Source/WebCore/loader/cache/CachedResource.cpp >@@ -35,17 +35,15 @@ > #include "FrameLoaderClient.h" > #include "HTTPHeaderNames.h" > #include "InspectorInstrumentation.h" >-#include "URL.h" >-#include "LoaderStrategy.h" > #include "Logging.h" > #include "MemoryCache.h" >-#include "PlatformStrategies.h" > #include "ResourceHandle.h" >-#include "ResourceLoadScheduler.h" > #include "SchemeRegistry.h" > #include "SecurityOrigin.h" > #include "SecurityPolicy.h" > #include "SubresourceLoader.h" >+#include "URL.h" >+ > #include <wtf/CurrentTime.h> > #include <wtf/MathExtras.h> > #include <wtf/RefCountedLeakCounter.h> >@@ -271,8 +269,8 @@ void CachedResource::load(CachedResourceLoader* cachedResourceLoader, const Reso > m_fragmentIdentifierForRequest = String(); > } > >- m_loader = platformStrategies()->loaderStrategy()->resourceLoadScheduler()->scheduleSubresourceLoad(cachedResourceLoader->frame(), this, request, options); >- if (!m_loader) { >+ m_loader = SubresourceLoader::create(cachedResourceLoader->frame(), this, request, options); >+ if (!(m_loader && m_loader->scheduleLoad())) { > failBeforeStarting(); > return; > } >diff --git a/Source/WebCore/platform/network/BlobRegistryImpl.cpp b/Source/WebCore/platform/network/BlobRegistryImpl.cpp >index f09b9ed387f46719639d0df32c9f7f756cfd406f..0ec48cb76c8a15457997eb6a6cd4379ab1633810 100644 >--- a/Source/WebCore/platform/network/BlobRegistryImpl.cpp >+++ b/Source/WebCore/platform/network/BlobRegistryImpl.cpp >@@ -54,37 +54,6 @@ BlobRegistryImpl::~BlobRegistryImpl() > { > } > >-static PassRefPtr<ResourceHandle> createResourceHandle(const ResourceRequest& request, ResourceHandleClient* client) >-{ >- return static_cast<BlobRegistryImpl&>(blobRegistry()).createResourceHandle(request, client); >-} >- >-static void loadResourceSynchronously(NetworkingContext*, const ResourceRequest& request, StoredCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data) >-{ >- BlobData* blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(request.url()); >- BlobResourceHandle::loadResourceSynchronously(blobData, request, error, response, data); >-} >- >-static void registerBlobResourceHandleConstructor() >-{ >- static bool didRegister = false; >- if (!didRegister) { >- ResourceHandle::registerBuiltinConstructor("blob", createResourceHandle); >- ResourceHandle::registerBuiltinSynchronousLoader("blob", loadResourceSynchronously); >- didRegister = true; >- } >-} >- >-PassRefPtr<ResourceHandle> BlobRegistryImpl::createResourceHandle(const ResourceRequest& request, ResourceHandleClient* client) >-{ >- RefPtr<BlobResourceHandle> handle = BlobResourceHandle::createAsync(getBlobDataFromURL(request.url()), request, client); >- if (!handle) >- return 0; >- >- handle->start(); >- return handle.release(); >-} >- > void BlobRegistryImpl::appendStorageItems(BlobData* blobData, const BlobDataItemList& items, long long offset, long long length) > { > ASSERT(length != BlobDataItem::toEndOfFile); >@@ -117,7 +86,6 @@ void BlobRegistryImpl::appendStorageItems(BlobData* blobData, const BlobDataItem > void BlobRegistryImpl::registerFileBlobURL(const URL& url, PassRefPtr<BlobDataFileReference> file, const String& contentType) > { > ASSERT(isMainThread()); >- registerBlobResourceHandleConstructor(); > > RefPtr<BlobData> blobData = BlobData::create(); > blobData->setContentType(contentType); >@@ -129,7 +97,6 @@ void BlobRegistryImpl::registerFileBlobURL(const URL& url, PassRefPtr<BlobDataFi > void BlobRegistryImpl::registerBlobURL(const URL& url, Vector<BlobPart> blobParts, const String& contentType) > { > ASSERT(isMainThread()); >- registerBlobResourceHandleConstructor(); > > RefPtr<BlobData> blobData = BlobData::create(); > blobData->setContentType(contentType); >diff --git a/Source/WebCore/platform/network/BlobResourceHandle.cpp b/Source/WebCore/platform/network/BlobResourceHandle.cpp >index 08d5f51a8852e31f07d1daaf89276b04f0b070d5..e4c0411a4105ac362768dd9f5c642d8d8545259e 100644 >--- a/Source/WebCore/platform/network/BlobResourceHandle.cpp >+++ b/Source/WebCore/platform/network/BlobResourceHandle.cpp >@@ -34,6 +34,7 @@ > > #include "AsyncFileStream.h" > #include "BlobData.h" >+#include "BlobRegistryImpl.h" > #include "FileStream.h" > #include "FileSystem.h" > #include "HTTPHeaderNames.h" >@@ -134,22 +135,30 @@ void BlobResourceSynchronousLoader::didFail(ResourceHandle*, const ResourceError > /////////////////////////////////////////////////////////////////////////////// > // BlobResourceHandle > >-PassRefPtr<BlobResourceHandle> BlobResourceHandle::createAsync(BlobData* blobData, const ResourceRequest& request, ResourceHandleClient* client) >+PassRefPtr<BlobResourceHandle> BlobResourceHandle::createAsync(const ResourceRequest& request, ResourceHandleClient* client) > { > // FIXME: Should probably call didFail() instead of blocking the load without explanation. > if (!equalIgnoringCase(request.httpMethod(), "GET")) >- return 0; >+ return nullptr; >+ >+ BlobData* blobData = nullptr; >+ if (blobRegistry().isBlobRegistryImpl()) >+ blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(request.url()); > > return adoptRef(new BlobResourceHandle(blobData, request, client, true)); > } > >-void BlobResourceHandle::loadResourceSynchronously(BlobData* blobData, const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data) >+void BlobResourceHandle::loadResourceSynchronously(const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data) > { > if (!equalIgnoringCase(request.httpMethod(), "GET")) { > error = ResourceError(webKitBlobResourceDomain, methodNotAllowed, response.url(), "Request method must be GET"); > return; > } > >+ BlobData* blobData = nullptr; >+ if (blobRegistry().isBlobRegistryImpl()) >+ blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(request.url()); >+ > BlobResourceSynchronousLoader loader(error, response, data); > RefPtr<BlobResourceHandle> handle = adoptRef(new BlobResourceHandle(blobData, request, &loader, false)); > handle->start(); >diff --git a/Source/WebCore/platform/network/BlobResourceHandle.h b/Source/WebCore/platform/network/BlobResourceHandle.h >index 676dbff98976bb087d5bbc5d0ccab7f413b441fd..6c09936f72ca5efa713b788daac5e205051f0bfc 100644 >--- a/Source/WebCore/platform/network/BlobResourceHandle.h >+++ b/Source/WebCore/platform/network/BlobResourceHandle.h >@@ -46,17 +46,21 @@ class ResourceHandleClient; > class ResourceRequest; > struct BlobDataItem; > >+// FIXME: Move BlobResourceHandle out of ResourceHandle. > class BlobResourceHandle final : public FileStreamClient, public ResourceHandle { > public: >- static PassRefPtr<BlobResourceHandle> createAsync(BlobData*, const ResourceRequest&, ResourceHandleClient*); >+ static PassRefPtr<BlobResourceHandle> createAsync(const ResourceRequest&, ResourceHandleClient*); > >- static void loadResourceSynchronously(BlobData*, const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data); >+ static void loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data); > > void start(); > int readSync(char*, int); > > bool aborted() const { return m_aborted; } > >+ // ResourceHandle methods. >+ virtual void cancel() override; >+ > private: > BlobResourceHandle(BlobData*, const ResourceRequest&, ResourceHandleClient*, bool async); > virtual ~BlobResourceHandle(); >@@ -66,8 +70,6 @@ private: > virtual void didOpen(bool) override; > virtual void didRead(int) override; > >- // ResourceHandle methods. >- virtual void cancel() override; > virtual void continueDidReceiveResponse() override; > > void doStart(); >diff --git a/Source/WebCore/platform/network/FormData.cpp b/Source/WebCore/platform/network/FormData.cpp >index f7e12c211f008604b989b358a7556d02c6454b6f..47b3fa3b74cd979a03e516d2670527ae1b42bda7 100644 >--- a/Source/WebCore/platform/network/FormData.cpp >+++ b/Source/WebCore/platform/network/FormData.cpp >@@ -277,6 +277,19 @@ String FormData::flattenToString() const > return Latin1Encoding().decode(reinterpret_cast<const char*>(bytes.data()), bytes.size()); > } > >+static bool blobIsOutOfDate(const BlobDataItem& blobItem) >+{ >+ ASSERT(blobItem.type == BlobDataItem::File); >+ if (!isValidFileTime(blobItem.file->expectedModificationTime())) >+ return false; >+ >+ time_t fileModificationTime; >+ if (!getFileModificationTime(blobItem.file->path(), fileModificationTime)) >+ return true; >+ >+ return fileModificationTime != static_cast<time_t>(blobItem.file->expectedModificationTime()); >+} >+ > static void appendBlobResolved(FormData* formData, const URL& url) > { > if (!blobRegistry().isBlobRegistryImpl()) { >@@ -295,9 +308,10 @@ static void appendBlobResolved(FormData* formData, const URL& url) > const BlobDataItem& blobItem = *it; > if (blobItem.type == BlobDataItem::Data) > formData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset()), static_cast<int>(blobItem.length())); >- else if (blobItem.type == BlobDataItem::File) >- formData->appendFileRange(blobItem.file->path(), blobItem.offset(), blobItem.length(), blobItem.file->expectedModificationTime()); >- else >+ else if (blobItem.type == BlobDataItem::File) { >+ if (!blobIsOutOfDate(blobItem)) >+ formData->appendFileRange(blobItem.file->path(), blobItem.offset(), blobItem.length(), blobItem.file->expectedModificationTime()); >+ } else > ASSERT_NOT_REACHED(); > } > } >diff --git a/Source/WebCore/platform/network/ResourceRequestBase.cpp b/Source/WebCore/platform/network/ResourceRequestBase.cpp >index 09d8fb120cf5b764d571b015fe2b47992a97237e..03318577f784469e5542b0a04a1823bf7ec06837 100644 >--- a/Source/WebCore/platform/network/ResourceRequestBase.cpp >+++ b/Source/WebCore/platform/network/ResourceRequestBase.cpp >@@ -406,6 +406,9 @@ void ResourceRequestBase::setHTTPBody(PassRefPtr<FormData> httpBody) > updateResourceRequest(); > > m_httpBody = httpBody; >+ // We resolve blob references here as the blob registry is in the Web Process. >+ if (m_httpBody) >+ m_httpBody = m_httpBody->resolveBlobReferences(); > > m_resourceRequestBodyUpdated = true; > >diff --git a/Source/WebCore/xml/XMLHttpRequest.cpp b/Source/WebCore/xml/XMLHttpRequest.cpp >index bf86f031f5f14e2b040344283257c07984f57143..5ad9095157e18447b57f58004fadd3bd4be8afb8 100644 >--- a/Source/WebCore/xml/XMLHttpRequest.cpp >+++ b/Source/WebCore/xml/XMLHttpRequest.cpp >@@ -238,7 +238,6 @@ Blob* XMLHttpRequest::responseBlob() > > if (!m_responseBlob) { > if (m_binaryResponseBuilder) { >- // FIXME: We just received the data from NetworkProcess, and are sending it back. This is inefficient. > Vector<char> data; > data.append(m_binaryResponseBuilder->data(), m_binaryResponseBuilder->size()); > String normalizedContentType = Blob::normalizedContentType(responseMIMEType()); // responseMIMEType defaults to text/xml which may be incorrect. >diff --git a/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h b/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h >index 8cc069ae5f2528bd0302374c5673a7fc8e21c9d2..b5fad9cccb1eb7c6617a274537bebd4035733f7d 100644 >--- a/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h >+++ b/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h >@@ -32,6 +32,7 @@ > > namespace WebKit { > >+// FIXME: Remove this as Blob resolution & registration no longer happens in the Networking process. > class BlobRegistryProxy final : public WebCore::BlobRegistry { > public: > virtual void registerFileBlobURL(const WebCore::URL&, PassRefPtr<WebCore::BlobDataFileReference>, const String& contentType) override; >diff --git a/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp b/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp >index 88cb064e107293d790965a074adc12cdac80d68f..7d707d376ed2d5d5a3485c6135a9f70761dd59b0 100644 >--- a/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp >+++ b/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp >@@ -46,10 +46,8 @@ > #include <WebCore/FrameLoader.h> > #include <WebCore/NetscapePlugInStreamLoader.h> > #include <WebCore/ReferrerPolicy.h> >-#include <WebCore/ResourceLoader.h> > #include <WebCore/SessionID.h> > #include <WebCore/Settings.h> >-#include <WebCore/SubresourceLoader.h> > #include <wtf/text/CString.h> > > #if ENABLE(NETWORK_PROCESS) >@@ -68,12 +66,11 @@ WebResourceLoadScheduler::~WebResourceLoadScheduler() > { > } > >-PassRefPtr<SubresourceLoader> WebResourceLoadScheduler::scheduleSubresourceLoad(Frame* frame, CachedResource* resource, const ResourceRequest& request, const ResourceLoaderOptions& options) >+bool WebResourceLoadScheduler::scheduleSubresourceLoad(SubresourceLoader* loader) > { >- RefPtr<SubresourceLoader> loader = SubresourceLoader::create(frame, resource, request, options); > if (loader) >- scheduleLoad(loader.get(), resource, frame->document()->referrerPolicy() == ReferrerPolicyDefault); >- return loader.release(); >+ scheduleLoad(loader, loader->cachedResource(), loader->frame()->document()->referrerPolicy() == ReferrerPolicyDefault); >+ return loader; > } > > PassRefPtr<NetscapePlugInStreamLoader> WebResourceLoadScheduler::schedulePluginStreamLoad(Frame* frame, NetscapePlugInStreamLoaderClient* client, const ResourceRequest& request) >diff --git a/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h b/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h >index 4ecef3eb1739ff915cde91c78833a323c9102834..8e3aad7741e3810687a1bf8d58d87b453317e5aa 100644 >--- a/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h >+++ b/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.h >@@ -29,7 +29,7 @@ > #include "WebResourceLoader.h" > #include <WebCore/ResourceLoadPriority.h> > #include <WebCore/ResourceLoadScheduler.h> >-#include <WebCore/ResourceLoader.h> >+#include <WebCore/SubresourceLoader.h> > #include <wtf/RunLoop.h> > > #if ENABLE(NETWORK_PROCESS) >@@ -45,7 +45,7 @@ public: > WebResourceLoadScheduler(); > virtual ~WebResourceLoadScheduler(); > >- virtual PassRefPtr<WebCore::SubresourceLoader> scheduleSubresourceLoad(WebCore::Frame*, WebCore::CachedResource*, const WebCore::ResourceRequest&, const WebCore::ResourceLoaderOptions&) override; >+ virtual bool scheduleSubresourceLoad(WebCore::SubresourceLoader*); > virtual PassRefPtr<WebCore::NetscapePlugInStreamLoader> schedulePluginStreamLoad(WebCore::Frame*, WebCore::NetscapePlugInStreamLoaderClient*, const WebCore::ResourceRequest&) override; > > virtual void remove(WebCore::ResourceLoader*) override; >diff --git a/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp b/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp >index ee56978ff7a2abcabc5b95a7a7ebd7ee2eb979f8..2708f7e7c82af3a7f36b3c550d00a93f8de30c81 100644 >--- a/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp >+++ b/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp >@@ -275,11 +275,10 @@ void WebPlatformStrategies::loadResourceSynchronously(NetworkingContext* context > } > } > >+// FIXME: Remove this as BlobRegistry is no longer in NetworkProcess. > BlobRegistry* WebPlatformStrategies::createBlobRegistry() > { >- if (!WebProcess::shared().usesNetworkProcess()) >- return LoaderStrategy::createBlobRegistry(); >- return new BlobRegistryProxy; >+ return LoaderStrategy::createBlobRegistry(); > } > #endif >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 138835
:
241851
|
241938
|
241941
|
242187
|
242407