| Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| index ab362a158edda8b392aea025ec23b8338021bae3..08a9a95f8a62f28c87595e12216fb03823227f3c 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| @@ -322,57 +322,6 @@ static PassOwnPtr<TracedValue> urlForTraceEvent(const KURL& url)
|
| return value.release();
|
| }
|
|
|
| -PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::resourceForStaticData(const FetchRequest& request, const ResourceFactory& factory, const SubstituteData& substituteData)
|
| -{
|
| - const KURL& url = request.resourceRequest().url();
|
| - ASSERT(url.protocolIsData() || substituteData.isValid());
|
| -
|
| - // 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 ((factory.type() == Resource::MainResource && !substituteData.isValid()) || factory.type() == Resource::Raw)
|
| - return nullptr;
|
| -
|
| - const String cacheIdentifier = getCacheIdentifier();
|
| - if (Resource* oldResource = memoryCache()->resourceForURL(url, cacheIdentifier)) {
|
| - // There's no reason to re-parse if we saved the data from the previous parse.
|
| - if (request.options().dataBufferingPolicy != DoNotBufferData)
|
| - return oldResource;
|
| - memoryCache()->remove(oldResource);
|
| - }
|
| -
|
| - WebString mimetype;
|
| - WebString charset;
|
| - RefPtr<SharedBuffer> data;
|
| - if (substituteData.isValid()) {
|
| - mimetype = substituteData.mimeType();
|
| - charset = substituteData.textEncoding();
|
| - data = substituteData.content();
|
| - } else {
|
| - data = PassRefPtr<SharedBuffer>(Platform::current()->parseDataURL(url, mimetype, charset));
|
| - if (!data)
|
| - return nullptr;
|
| - }
|
| - ResourceResponse response(url, mimetype, data->size(), charset, String());
|
| - response.setHTTPStatusCode(200);
|
| - response.setHTTPStatusText("OK");
|
| -
|
| - RefPtrWillBeRawPtr<Resource> resource = factory.create(request.resourceRequest(), request.charset());
|
| - resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad());
|
| - resource->setOptions(request.options());
|
| - // FIXME: We should provide a body stream here.
|
| - resource->responseReceived(response, nullptr);
|
| - resource->setDataBufferingPolicy(BufferData);
|
| - if (data->size())
|
| - resource->setResourceBuffer(data);
|
| - resource->setIdentifier(createUniqueIdentifier());
|
| - resource->setCacheIdentifier(cacheIdentifier);
|
| - resource->finish();
|
| - memoryCache()->add(resource.get());
|
| - return resource.release();
|
| -}
|
| -
|
| void ResourceFetcher::moveCachedNonBlockingResourceToBlocking(Resource* resource, const FetchRequest& request)
|
| {
|
| // TODO(yoav): Test that non-blocking resources (video/audio/track) continue to not-block even after being preloaded and discovered.
|
| @@ -422,17 +371,23 @@ PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::requestResource(FetchRequest&
|
| }
|
| }
|
|
|
| - bool isStaticData = request.resourceRequest().url().protocolIsData() || substituteData.isValid();
|
| + const bool isSubstituteData = substituteData.isValid();
|
| + const bool isStaticData = isSubstituteData || request.resourceRequest().url().protocolIsData();
|
| RefPtrWillBeRawPtr<Resource> resource(nullptr);
|
| - if (isStaticData)
|
| - resource = resourceForStaticData(request, factory, substituteData);
|
| - if (!resource)
|
| + if (isSubstituteData) {
|
| + resource = factory.create(request.resourceRequest(), request.charset());
|
| + resource->setCacheIdentifier(getCacheIdentifier());
|
| + resource->setIdentifier(createUniqueIdentifier());
|
| + resource->loadLocallySubstituteData(request.resourceRequest(), request.options(), substituteData);
|
| + }
|
| + if (!resource) {
|
| resource = memoryCache()->resourceForURL(url, getCacheIdentifier());
|
| + }
|
|
|
| // See if we can use an existing resource from the cache. If so, we need to move it to be load blocking.
|
| moveCachedNonBlockingResourceToBlocking(resource.get(), request);
|
|
|
| - const RevalidationPolicy policy = determineRevalidationPolicy(factory.type(), request, resource.get(), isStaticData);
|
| + const RevalidationPolicy policy = determineRevalidationPolicy(factory.type(), request, resource.get(), isSubstituteData);
|
|
|
| if (request.forPreload()) {
|
| DEFINE_RESOURCE_HISTOGRAM("Preload.");
|
| @@ -515,7 +470,7 @@ PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::requestResource(FetchRequest&
|
| // use.
|
| // Remove main resource from cache to prevent reuse.
|
| if (factory.type() == Resource::MainResource) {
|
| - ASSERT(policy != Use || isStaticData);
|
| + ASSERT(policy != Use || isSubstituteData);
|
| ASSERT(policy != Revalidate);
|
| memoryCache()->remove(resource.get());
|
| }
|
| @@ -626,7 +581,7 @@ void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
|
| m_resourceTimingInfoMap.add(resource, info.release());
|
| }
|
|
|
| -ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResource, bool isStaticData) const
|
| +ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResource, bool isSubstituteData) const
|
| {
|
| const ResourceRequest& request = fetchRequest.resourceRequest();
|
|
|
| @@ -684,8 +639,8 @@ ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
|
| if (request.downloadToFile() || request.useStreamOnResponse())
|
| return Reload;
|
|
|
| - // If resource was populated from a SubstituteData load or data: url, use it.
|
| - if (isStaticData)
|
| + // If resource was populated from a SubstituteData load, use it.
|
| + if (isSubstituteData)
|
| return Use;
|
|
|
| if (!existingResource->canReuse(request))
|
|
|