| 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();
|
| }
|
|
|