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 |