Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Unified Diff: third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp

Issue 1965013002: Implement headers attributes in ForeignFetchResponse (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: using instead of typedef Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
diff --git a/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp b/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
index 43e8b9a48aa1b7f6128163984db7865a21ed7e67..9e10c5a881170f3ecf0e51facc82993311968eff 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
@@ -6,7 +6,6 @@
#include "bindings/core/v8/ScriptState.h"
#include "core/dom/DOMArrayBuffer.h"
-#include "core/fetch/CrossOriginAccessControl.h"
#include "core/fetch/FetchUtils.h"
#include "modules/fetch/BodyStreamBuffer.h"
#include "modules/fetch/DataConsumerHandleUtil.h"
@@ -43,6 +42,17 @@ WebServiceWorkerResponseType fetchTypeToWebType(FetchResponseData::Type fetchTyp
return webType;
}
+WebVector<WebString> headerSetToWebVector(const HTTPHeaderSet& headers)
+{
+ // Can't just pass *headers to the WebVector constructor because HashSet
+ // iterators are not stl iterator compatible.
+ WebVector<WebString> result(static_cast<size_t>(headers.size()));
+ int idx = 0;
+ for (const auto& header : headers)
+ result[idx++] = header;
+ return result;
+}
+
} // namespace
FetchResponseData* FetchResponseData::create()
@@ -90,6 +100,16 @@ FetchResponseData* FetchResponseData::createBasicFilteredResponse() const
FetchResponseData* FetchResponseData::createCORSFilteredResponse() const
{
DCHECK_EQ(m_type, DefaultType);
+ HTTPHeaderSet accessControlExposeHeaderSet;
+ String accessControlExposeHeaders;
+ if (m_headerList->get(HTTPNames::Access_Control_Expose_Headers, accessControlExposeHeaders))
+ parseAccessControlExposeHeadersAllowList(accessControlExposeHeaders, accessControlExposeHeaderSet);
+ return createCORSFilteredResponse(accessControlExposeHeaderSet);
+}
+
+FetchResponseData* FetchResponseData::createCORSFilteredResponse(const HTTPHeaderSet& exposedHeaders) const
+{
+ DCHECK_EQ(m_type, DefaultType);
// "A CORS filtered response is a filtered response whose type is |CORS|,
// header list excludes all headers in internal response's header list,
// except those whose name is either one of `Cache-Control`,
@@ -99,15 +119,15 @@ FetchResponseData* FetchResponseData::createCORSFilteredResponse() const
// list."
FetchResponseData* response = new FetchResponseData(CORSType, m_status, m_statusMessage);
response->m_url = m_url;
- HTTPHeaderSet accessControlExposeHeaderSet;
- String accessControlExposeHeaders;
- if (m_headerList->get("access-control-expose-headers", accessControlExposeHeaders))
- parseAccessControlExposeHeadersAllowList(accessControlExposeHeaders, accessControlExposeHeaderSet);
for (size_t i = 0; i < m_headerList->size(); ++i) {
const FetchHeaderList::Header* header = m_headerList->list()[i].get();
const String& name = header->first;
- if (isOnAccessControlResponseHeaderWhitelist(name) || (accessControlExposeHeaderSet.contains(name) && !FetchUtils::isForbiddenResponseHeaderName(name)))
+ const bool explicitlyExposed = exposedHeaders.contains(name);
+ if (isOnAccessControlResponseHeaderWhitelist(name) || (explicitlyExposed && !FetchUtils::isForbiddenResponseHeaderName(name))) {
+ if (explicitlyExposed)
+ response->m_corsExposedHeaderNames.add(name);
response->m_headerList->append(name, header->second);
+ }
}
response->m_buffer = m_buffer;
response->m_mimeType = m_mimeType;
@@ -179,6 +199,7 @@ FetchResponseData* FetchResponseData::clone(ScriptState* scriptState)
newResponse->m_mimeType = m_mimeType;
newResponse->m_responseTime = m_responseTime;
newResponse->m_cacheStorageCacheName = m_cacheStorageCacheName;
+ newResponse->m_corsExposedHeaderNames = m_corsExposedHeaderNames;
switch (m_type) {
case BasicType:
@@ -221,6 +242,7 @@ void FetchResponseData::populateWebServiceWorkerResponse(WebServiceWorkerRespons
if (m_internalResponse) {
m_internalResponse->populateWebServiceWorkerResponse(response);
response.setResponseType(fetchTypeToWebType(m_type));
+ response.setCorsExposedHeaderNames(headerSetToWebVector(m_corsExposedHeaderNames));
return;
}
@@ -230,6 +252,7 @@ void FetchResponseData::populateWebServiceWorkerResponse(WebServiceWorkerRespons
response.setResponseType(fetchTypeToWebType(m_type));
response.setResponseTime(responseTime());
response.setCacheStorageCacheName(cacheStorageCacheName());
+ response.setCorsExposedHeaderNames(headerSetToWebVector(m_corsExposedHeaderNames));
for (size_t i = 0; i < headerList()->size(); ++i) {
const FetchHeaderList::Header* header = headerList()->list()[i].get();
response.appendHeader(header->first, header->second);

Powered by Google App Engine
This is Rietveld 408576698