| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/serviceworkers/ForeignFetchRespondWithObserver.h" | 5 #include "modules/serviceworkers/ForeignFetchRespondWithObserver.h" |
| 6 | 6 |
| 7 #include "modules/fetch/Response.h" | 7 #include "modules/fetch/Response.h" |
| 8 #include "modules/serviceworkers/ForeignFetchResponse.h" | 8 #include "modules/serviceworkers/ForeignFetchResponse.h" |
| 9 #include "platform/loader/fetch/CrossOriginAccessControl.h" | 9 #include "platform/loader/fetch/CrossOriginAccessControl.h" |
| 10 | 10 |
| 11 namespace blink { | 11 namespace blink { |
| 12 | 12 |
| 13 ForeignFetchRespondWithObserver* ForeignFetchRespondWithObserver::create( | 13 ForeignFetchRespondWithObserver* ForeignFetchRespondWithObserver::create( |
| 14 ExecutionContext* context, | 14 ExecutionContext* context, |
| 15 int eventID, | 15 int eventID, |
| 16 const KURL& requestURL, | 16 const KURL& requestURL, |
| 17 WebURLRequest::FetchRequestMode requestMode, | 17 WebURLRequest::FetchRequestMode requestMode, |
| 18 WebURLRequest::FetchRedirectMode redirectMode, | 18 WebURLRequest::FetchRedirectMode redirectMode, |
| 19 WebURLRequest::FrameType frameType, | 19 WebURLRequest::FrameType frameType, |
| 20 WebURLRequest::RequestContext requestContext, | 20 WebURLRequest::RequestContext requestContext, |
| 21 PassRefPtr<SecurityOrigin> requestOrigin, | 21 PassRefPtr<SecurityOrigin> requestOrigin, |
| 22 WaitUntilObserver* observer) { | 22 WaitUntilObserver* observer) { |
| 23 return new ForeignFetchRespondWithObserver( | 23 return new ForeignFetchRespondWithObserver( |
| 24 context, eventID, requestURL, requestMode, redirectMode, frameType, | 24 context, eventID, requestURL, requestMode, redirectMode, frameType, |
| 25 requestContext, std::move(requestOrigin), observer); | 25 requestContext, std::move(requestOrigin), observer); |
| 26 } | 26 } |
| 27 | 27 |
| 28 void ForeignFetchRespondWithObserver::responseWasFulfilled( | 28 void ForeignFetchRespondWithObserver::onResponseFulfilled( |
| 29 const ScriptValue& value) { | 29 const ScriptValue& value) { |
| 30 ASSERT(getExecutionContext()); | 30 ASSERT(getExecutionContext()); |
| 31 ExceptionState exceptionState(value.isolate(), ExceptionState::UnknownContext, | 31 ExceptionState exceptionState(value.isolate(), ExceptionState::UnknownContext, |
| 32 "ForeignFetchEvent", "respondWith"); | 32 "ForeignFetchEvent", "respondWith"); |
| 33 ForeignFetchResponse foreignFetchResponse = | 33 ForeignFetchResponse foreignFetchResponse = |
| 34 ScriptValue::to<ForeignFetchResponse>(toIsolate(getExecutionContext()), | 34 ScriptValue::to<ForeignFetchResponse>(toIsolate(getExecutionContext()), |
| 35 value, exceptionState); | 35 value, exceptionState); |
| 36 if (exceptionState.hadException()) { | 36 if (exceptionState.hadException()) { |
| 37 exceptionState.clearException(); | 37 exceptionState.clearException(); |
| 38 responseWasRejected(WebServiceWorkerResponseErrorNoForeignFetchResponse); | 38 onResponseRejected(WebServiceWorkerResponseErrorNoForeignFetchResponse); |
| 39 return; | 39 return; |
| 40 } | 40 } |
| 41 | 41 |
| 42 Response* response = foreignFetchResponse.response(); | 42 Response* response = foreignFetchResponse.response(); |
| 43 const FetchResponseData* internalResponse = response->response(); | 43 const FetchResponseData* internalResponse = response->response(); |
| 44 const bool isOpaque = | 44 const bool isOpaque = |
| 45 internalResponse->getType() == FetchResponseData::OpaqueType || | 45 internalResponse->getType() == FetchResponseData::OpaqueType || |
| 46 internalResponse->getType() == FetchResponseData::OpaqueRedirectType; | 46 internalResponse->getType() == FetchResponseData::OpaqueRedirectType; |
| 47 if (internalResponse->getType() != FetchResponseData::DefaultType) | 47 if (internalResponse->getType() != FetchResponseData::DefaultType) |
| 48 internalResponse = internalResponse->internalResponse(); | 48 internalResponse = internalResponse->internalResponse(); |
| 49 | 49 |
| 50 if (!foreignFetchResponse.hasOrigin()) { | 50 if (!foreignFetchResponse.hasOrigin()) { |
| 51 if (foreignFetchResponse.hasHeaders() && | 51 if (foreignFetchResponse.hasHeaders() && |
| 52 !foreignFetchResponse.headers().isEmpty()) { | 52 !foreignFetchResponse.headers().isEmpty()) { |
| 53 responseWasRejected( | 53 onResponseRejected( |
| 54 WebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin); | 54 WebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin); |
| 55 return; | 55 return; |
| 56 } | 56 } |
| 57 | 57 |
| 58 // If response isn't already opaque, make it opaque. | 58 // If response isn't already opaque, make it opaque. |
| 59 if (!isOpaque) { | 59 if (!isOpaque) { |
| 60 FetchResponseData* opaqueData = | 60 FetchResponseData* opaqueData = |
| 61 internalResponse->createOpaqueFilteredResponse(); | 61 internalResponse->createOpaqueFilteredResponse(); |
| 62 response = Response::create(getExecutionContext(), opaqueData); | 62 response = Response::create(getExecutionContext(), opaqueData); |
| 63 } | 63 } |
| 64 } else if (m_requestOrigin->toString() != foreignFetchResponse.origin()) { | 64 } else if (m_requestOrigin->toString() != foreignFetchResponse.origin()) { |
| 65 responseWasRejected( | 65 onResponseRejected( |
| 66 WebServiceWorkerResponseErrorForeignFetchMismatchedOrigin); | 66 WebServiceWorkerResponseErrorForeignFetchMismatchedOrigin); |
| 67 return; | 67 return; |
| 68 } else if (!isOpaque) { | 68 } else if (!isOpaque) { |
| 69 HTTPHeaderSet headers; | 69 HTTPHeaderSet headers; |
| 70 if (foreignFetchResponse.hasHeaders()) { | 70 if (foreignFetchResponse.hasHeaders()) { |
| 71 for (const String& header : foreignFetchResponse.headers()) | 71 for (const String& header : foreignFetchResponse.headers()) |
| 72 headers.insert(header); | 72 headers.insert(header); |
| 73 if (response->response()->getType() == FetchResponseData::CORSType) { | 73 if (response->response()->getType() == FetchResponseData::CORSType) { |
| 74 const HTTPHeaderSet& existingHeaders = | 74 const HTTPHeaderSet& existingHeaders = |
| 75 response->response()->corsExposedHeaderNames(); | 75 response->response()->corsExposedHeaderNames(); |
| 76 HTTPHeaderSet headersToRemove; | 76 HTTPHeaderSet headersToRemove; |
| 77 for (HTTPHeaderSet::iterator it = headers.begin(); it != headers.end(); | 77 for (HTTPHeaderSet::iterator it = headers.begin(); it != headers.end(); |
| 78 ++it) { | 78 ++it) { |
| 79 if (!existingHeaders.contains(*it)) | 79 if (!existingHeaders.contains(*it)) |
| 80 headersToRemove.insert(*it); | 80 headersToRemove.insert(*it); |
| 81 } | 81 } |
| 82 headers.removeAll(headersToRemove); | 82 headers.removeAll(headersToRemove); |
| 83 } | 83 } |
| 84 } | 84 } |
| 85 FetchResponseData* responseData = | 85 FetchResponseData* responseData = |
| 86 internalResponse->createCORSFilteredResponse(headers); | 86 internalResponse->createCORSFilteredResponse(headers); |
| 87 response = Response::create(getExecutionContext(), responseData); | 87 response = Response::create(getExecutionContext(), responseData); |
| 88 } | 88 } |
| 89 | 89 |
| 90 RespondWithObserver::responseWasFulfilled( | 90 FetchRespondWithObserver::onResponseFulfilled( |
| 91 ScriptValue::from(value.getScriptState(), response)); | 91 ScriptValue::from(value.getScriptState(), response)); |
| 92 } | 92 } |
| 93 | 93 |
| 94 ForeignFetchRespondWithObserver::ForeignFetchRespondWithObserver( | 94 ForeignFetchRespondWithObserver::ForeignFetchRespondWithObserver( |
| 95 ExecutionContext* context, | 95 ExecutionContext* context, |
| 96 int eventID, | 96 int eventID, |
| 97 const KURL& requestURL, | 97 const KURL& requestURL, |
| 98 WebURLRequest::FetchRequestMode requestMode, | 98 WebURLRequest::FetchRequestMode requestMode, |
| 99 WebURLRequest::FetchRedirectMode redirectMode, | 99 WebURLRequest::FetchRedirectMode redirectMode, |
| 100 WebURLRequest::FrameType frameType, | 100 WebURLRequest::FrameType frameType, |
| 101 WebURLRequest::RequestContext requestContext, | 101 WebURLRequest::RequestContext requestContext, |
| 102 PassRefPtr<SecurityOrigin> requestOrigin, | 102 PassRefPtr<SecurityOrigin> requestOrigin, |
| 103 WaitUntilObserver* observer) | 103 WaitUntilObserver* observer) |
| 104 : RespondWithObserver(context, | 104 : FetchRespondWithObserver(context, |
| 105 eventID, | 105 eventID, |
| 106 requestURL, | 106 requestURL, |
| 107 requestMode, | 107 requestMode, |
| 108 redirectMode, | 108 redirectMode, |
| 109 frameType, | 109 frameType, |
| 110 requestContext, | 110 requestContext, |
| 111 observer), | 111 observer), |
| 112 m_requestOrigin(requestOrigin) {} | 112 m_requestOrigin(requestOrigin) {} |
| 113 | 113 |
| 114 } // namespace blink | 114 } // namespace blink |
| OLD | NEW |