ScriptValue call(ScriptValue v) override { RefPtr<ReadingContext> readingContext(m_readingContext); if (!readingContext) return v; bool done; v8::Local<v8::Value> item = v.v8Value(); ASSERT(item->IsObject()); v8::Local<v8::Value> value = v8CallOrCrash(v8UnpackIteratorResult(v.getScriptState(), item.As<v8::Object>(), &done)); if (done) { readingContext->onReadDone(); return v; } if (!V8Uint8Array::hasInstance(value, v.isolate())) { readingContext->onRejected(); return ScriptValue(); } readingContext->onRead(V8Uint8Array::toImpl(value.As<v8::Object>())); return v; }
void ForeignFetchRespondWithObserver::responseWasFulfilled( const ScriptValue& value) { ASSERT(getExecutionContext()); ExceptionState exceptionState(value.isolate(), ExceptionState::UnknownContext, "ForeignFetchEvent", "respondWith"); ForeignFetchResponse foreignFetchResponse = ScriptValue::to<ForeignFetchResponse>(toIsolate(getExecutionContext()), value, exceptionState); if (exceptionState.hadException()) { exceptionState.clearException(); responseWasRejected(WebServiceWorkerResponseErrorNoForeignFetchResponse); return; } Response* response = foreignFetchResponse.response(); const FetchResponseData* internalResponse = response->response(); const bool isOpaque = internalResponse->getType() == FetchResponseData::OpaqueType || internalResponse->getType() == FetchResponseData::OpaqueRedirectType; if (internalResponse->getType() != FetchResponseData::DefaultType) internalResponse = internalResponse->internalResponse(); if (!foreignFetchResponse.hasOrigin()) { if (foreignFetchResponse.hasHeaders() && !foreignFetchResponse.headers().isEmpty()) { responseWasRejected( WebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin); return; } // If response isn't already opaque, make it opaque. if (!isOpaque) { FetchResponseData* opaqueData = internalResponse->createOpaqueFilteredResponse(); response = Response::create(getExecutionContext(), opaqueData); } } else if (m_requestOrigin->toString() != foreignFetchResponse.origin()) { responseWasRejected( WebServiceWorkerResponseErrorForeignFetchMismatchedOrigin); return; } else if (!isOpaque) { HTTPHeaderSet headers; if (foreignFetchResponse.hasHeaders()) { for (const String& header : foreignFetchResponse.headers()) headers.add(header); if (response->response()->getType() == FetchResponseData::CORSType) { const HTTPHeaderSet& existingHeaders = response->response()->corsExposedHeaderNames(); HTTPHeaderSet headersToRemove; for (HTTPHeaderSet::iterator it = headers.begin(); it != headers.end(); ++it) { if (!existingHeaders.contains(*it)) headersToRemove.add(*it); } headers.removeAll(headersToRemove); } } FetchResponseData* responseData = internalResponse->createCORSFilteredResponse(headers); response = Response::create(getExecutionContext(), responseData); } RespondWithObserver::responseWasFulfilled( ScriptValue::from(value.getScriptState(), response)); }