| 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 9d88d0191a75c2bba0f1e63d567acc4874e14f93..2f31ccdcf511baaefd669bfbc6c789223d69428f 100644
|
| --- a/third_party/WebKit/Source/core/fetch/Resource.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
|
| @@ -3,7 +3,8 @@
|
| Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
|
| Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
|
| Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
|
| - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
|
| + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
|
| + rights reserved.
|
|
|
| This library is free software; you can redistribute it and/or
|
| modify it under the terms of the GNU Library General Public
|
| @@ -134,9 +135,9 @@ void Resource::CachedMetadataHandlerImpl::setCachedMetadata(
|
| const char* data,
|
| size_t size,
|
| CachedMetadataHandler::CacheType cacheType) {
|
| - // Currently, only one type of cached metadata per resource is supported.
|
| - // If the need arises for multiple types of metadata per resource this could
|
| - // be enhanced to store types of metadata in a map.
|
| + // Currently, only one type of cached metadata per resource is supported. If
|
| + // the need arises for multiple types of metadata per resource this could be
|
| + // enhanced to store types of metadata in a map.
|
| DCHECK(!m_cachedMetadata);
|
| m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size);
|
| if (cacheType == CachedMetadataHandler::SendToPlatform)
|
| @@ -164,9 +165,9 @@ String Resource::CachedMetadataHandlerImpl::encoding() const {
|
| void Resource::CachedMetadataHandlerImpl::setSerializedCachedMetadata(
|
| const char* data,
|
| size_t size) {
|
| - // We only expect to receive cached metadata from the platform once.
|
| - // If this triggers, it indicates an efficiency problem which is most
|
| - // likely unexpected in code designed to improve performance.
|
| + // We only expect to receive cached metadata from the platform once. If this
|
| + // triggers, it indicates an efficiency problem which is most likely
|
| + // unexpected in code designed to improve performance.
|
| DCHECK(!m_cachedMetadata);
|
| m_cachedMetadata = CachedMetadata::createFromSerializedData(data, size);
|
| }
|
| @@ -215,10 +216,10 @@ DEFINE_TRACE(Resource::ServiceWorkerResponseCachedMetadataHandler) {
|
| }
|
|
|
| void Resource::ServiceWorkerResponseCachedMetadataHandler::sendToPlatform() {
|
| - // We don't support sending the metadata to the platform when the response
|
| - // was directly fetched via a ServiceWorker
|
| - // (eg: FetchEvent.respondWith(fetch(FetchEvent.request))) to prevent an
|
| - // attacker's Service Worker from poisoning the metadata cache of HTTPCache.
|
| + // We don't support sending the metadata to the platform when the response was
|
| + // directly fetched via a ServiceWorker (eg:
|
| + // FetchEvent.respondWith(fetch(FetchEvent.request))) to prevent an attacker's
|
| + // Service Worker from poisoning the metadata cache of HTTPCache.
|
| if (response().cacheStorageCacheName().isNull())
|
| return;
|
|
|
| @@ -316,10 +317,8 @@ Resource::Resource(const ResourceRequest& request,
|
| m_responseTimestamp(currentTime()),
|
| m_cancelTimer(this, &Resource::cancelTimerFired),
|
| m_resourceRequest(request) {
|
| - DCHECK_EQ(
|
| - m_type,
|
| - unsigned(
|
| - type)); // m_type is a bitfield, so this tests careless updates of the enum.
|
| + // m_type is a bitfield, so this tests careless updates of the enum.
|
| + DCHECK_EQ(m_type, unsigned(type));
|
| InstanceCounters::incrementCounter(InstanceCounters::ResourceCounter);
|
|
|
| // Currently we support the metadata caching only for HTTP family.
|
| @@ -494,7 +493,8 @@ static double freshnessLifetime(ResourceResponse& response,
|
| double lastModifiedValue = response.lastModified();
|
| if (std::isfinite(lastModifiedValue))
|
| return (creationTime - lastModifiedValue) * 0.1;
|
| - // If no cache headers are present, the specification leaves the decision to the UA. Other browsers seem to opt for 0.
|
| + // If no cache headers are present, the specification leaves the decision to
|
| + // the UA. Other browsers seem to opt for 0.
|
| return 0;
|
| }
|
|
|
| @@ -511,7 +511,8 @@ static bool canUseResponse(ResourceResponse& response,
|
| if (response.isNull())
|
| return false;
|
|
|
| - // FIXME: Why isn't must-revalidate considered a reason we can't use the response?
|
| + // FIXME: Why isn't must-revalidate considered a reason we can't use the
|
| + // response?
|
| if (response.cacheControlContainsNoCache() ||
|
| response.cacheControlContainsNoStore())
|
| return false;
|
| @@ -644,10 +645,10 @@ void Resource::didAddClient(ResourceClient* c) {
|
| }
|
|
|
| static bool shouldSendCachedDataSynchronouslyForType(Resource::Type type) {
|
| - // Some resources types default to return data synchronously.
|
| - // For most of these, it's because there are layout tests that
|
| - // expect data to return synchronously in case of cache hit. In
|
| - // the case of fonts, there was a performance regression.
|
| + // Some resources types default to return data synchronously. For most of
|
| + // these, it's because there are layout tests that expect data to return
|
| + // synchronously in case of cache hit. In the case of fonts, there was a
|
| + // performance regression.
|
| // FIXME: Get to the point where we don't need to special-case sync/async
|
| // behavior for different resource types.
|
| if (type == Resource::Image)
|
| @@ -693,7 +694,8 @@ void Resource::addClient(ResourceClient* client,
|
| return;
|
| }
|
|
|
| - // If we have existing data to send to the new client and the resource type supprts it, send it asynchronously.
|
| + // If we have existing data to send to the new client and the resource type
|
| + // supprts it, send it asynchronously.
|
| if (!m_response.isNull() &&
|
| !shouldSendCachedDataSynchronouslyForType(getType()) &&
|
| !m_needsSynchronousCacheHit) {
|
| @@ -731,9 +733,12 @@ void Resource::didRemoveClientOrObserver() {
|
| allClientsAndObserversRemoved();
|
|
|
| // RFC2616 14.9.2:
|
| - // "no-store: ... MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible"
|
| - // "... History buffers MAY store such responses as part of their normal operation."
|
| - // We allow non-secure content to be reused in history, but we do not allow secure content to be reused.
|
| + // "no-store: ... MUST make a best-effort attempt to remove the information
|
| + // from volatile storage as promptly as possible"
|
| + // "... History buffers MAY store such responses as part of their normal
|
| + // operation."
|
| + // We allow non-secure content to be reused in history, but we do not allow
|
| + // secure content to be reused.
|
| if (hasCacheControlNoStoreHeader() && url().protocolIs("https"))
|
| memoryCache()->remove(this);
|
| }
|
| @@ -777,15 +782,16 @@ void Resource::didAccessDecodedData() {
|
| }
|
|
|
| void Resource::finishPendingClients() {
|
| - // We're going to notify clients one by one. It is simple if the client does nothing.
|
| - // However there are a couple other things that can happen.
|
| + // We're going to notify clients one by one. It is simple if the client does
|
| + // nothing. However there are a couple other things that can happen.
|
| //
|
| // 1. Clients can be added during the loop. Make sure they are not processed.
|
| - // 2. Clients can be removed during the loop. Make sure they are always available to be
|
| - // removed. Also don't call removed clients or add them back.
|
| -
|
| - // Handle case (1) by saving a list of clients to notify. A separate list also ensure
|
| - // a client is either in m_clients or m_clientsAwaitingCallback.
|
| + // 2. Clients can be removed during the loop. Make sure they are always
|
| + // available to be removed. Also don't call removed clients or add them
|
| + // back.
|
| + //
|
| + // Handle case (1) by saving a list of clients to notify. A separate list also
|
| + // ensure a client is either in m_clients or m_clientsAwaitingCallback.
|
| HeapVector<Member<ResourceClient>> clientsToNotify;
|
| copyToVector(m_clientsAwaitingCallback, clientsToNotify);
|
|
|
| @@ -802,8 +808,8 @@ void Resource::finishPendingClients() {
|
| didAddClient(client);
|
| }
|
|
|
| - // It is still possible for the above loop to finish a new client synchronously.
|
| - // If there's no client waiting we should deschedule.
|
| + // It is still possible for the above loop to finish a new client
|
| + // synchronously. If there's no client waiting we should deschedule.
|
| bool scheduled = ResourceCallback::callbackHandler().isScheduled(this);
|
| if (scheduled && m_clientsAwaitingCallback.isEmpty())
|
| ResourceCallback::callbackHandler().cancel(this);
|
| @@ -914,10 +920,10 @@ void Resource::revalidationSucceeded(
|
| const HTTPHeaderMap& newHeaders = validatingResponse.httpHeaderFields();
|
| for (const auto& header : newHeaders) {
|
| // Entity headers should not be sent by servers when generating a 304
|
| - // response; misconfigured servers send them anyway. We shouldn't allow
|
| - // such headers to update the original request. We'll base this on the
|
| - // list defined by RFC2616 7.1, with a few additions for extension headers
|
| - // we care about.
|
| + // response; misconfigured servers send them anyway. We shouldn't allow such
|
| + // headers to update the original request. We'll base this on the list
|
| + // defined by RFC2616 7.1, with a few additions for extension headers we
|
| + // care about.
|
| if (!shouldUpdateHeaderAfterRevalidation(header.key))
|
| continue;
|
| m_response.setHTTPHeaderField(header.key, header.value);
|
|
|