Index: third_party/WebKit/Source/core/fetch/Resource.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp |
index 48d35eb5c52429329d1e625ce723b156d05c3b94..9fbbd871a557e1a247b50e44f5491222e4a15ac6 100644 |
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp |
@@ -36,6 +36,7 @@ |
#include "platform/Logging.h" |
#include "platform/SharedBuffer.h" |
#include "platform/TraceEvent.h" |
+#include "platform/exported/WrappedResourceRequest.h" |
#include "platform/network/HTTPParsers.h" |
#include "platform/weborigin/KURL.h" |
#include "public/platform/Platform.h" |
@@ -208,6 +209,72 @@ DEFINE_TRACE(Resource) |
#endif |
} |
+void Resource::loadLocallyStaticData(const ResourceRequest& request, const ResourceLoaderOptions& options, const WebString& mimetype, const WebString& charset, PassRefPtr<SharedBuffer> data) |
+{ |
+ setOptions(options); |
+ |
+ const KURL& url = request.url(); |
+ ASSERT(data); |
+ |
+ ResourceResponse response(url, mimetype, data->size(), charset, String()); |
+ response.setHTTPStatusCode(200); |
+ response.setHTTPStatusText("OK"); |
+ setDataBufferingPolicy(BufferData); |
+ |
+ RefPtrWillBeRawPtr<Resource> protect(this); |
+ |
+ // FIXME: We should provide a body stream here. |
+ responseReceived(response, nullptr); |
+ if (data->size()) |
+ // setResourceBuffer(data); |
+ appendData(data->data(), data->size()); |
+ finish(); |
+ |
+ return; |
+} |
+ |
+void Resource::loadLocallySubstituteData(const ResourceRequest& request, const ResourceLoaderOptions& options, const SubstituteData& substituteData) |
+{ |
+ ASSERT(substituteData.isValid()); |
+ ASSERT(getType() == MainResource); |
+ |
+ setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad()); |
+ |
+ RefPtr<SharedBuffer> data = substituteData.content(); |
+ ASSERT(data); |
+ |
+ loadLocallyStaticData( |
+ request, |
+ options, |
+ substituteData.mimeType(), |
+ substituteData.textEncoding(), |
+ data.release()); |
+ |
+ return; |
+} |
+ |
+bool Resource::loadLocallyDataURL(const ResourceRequest& request, const ResourceLoaderOptions& options) |
+{ |
+ ASSERT(request.url().protocolIsData()); |
+ |
+ // TODO(japhet): We only send main resource data: urls through WebURLLoader for the benefit of |
+ // a service worker test (RenderViewImplTest.ServiceWorkerNetworkProviderSetup), which is at a |
+ // layer where it isn't easy to mock out a network load. It uses data: urls to emulate the |
+ // behavior it wants to test, which would otherwise be reserved for network loads. |
+ if (getType() == MainResource || getType() == Raw) |
+ return false; |
+ |
+ WrappedResourceRequest wrappedRequest(request); |
+ WebString mimetype; |
+ WebString charset; |
+ RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(Platform::current()->parseDataURL(request.url(), mimetype, charset)); |
+ if (!data) |
+ return false; |
+ |
+ loadLocallyStaticData(request, options, mimetype, charset, data.release()); |
+ return true; |
+} |
+ |
void Resource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options) |
{ |
m_options = options; |
@@ -232,6 +299,10 @@ void Resource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& optio |
m_loader->changeToSynchronous(); |
return; |
} |
+ |
+ if (request.url().protocolIsData() && loadLocallyDataURL(request, options)) |
+ return; |
+ |
m_loader = ResourceLoader::create(fetcher, this, request, options); |
m_loader->start(); |
} |