void ResourceLoader::loadDataURL() { auto url = m_request.url(); ASSERT(url.protocolIsData()); RefPtr<ResourceLoader> loader(this); DataURLDecoder::decode(url, [loader, url] (Optional<DataURLDecoder::Result> decodeResult) { if (loader->reachedTerminalState()) return; if (!decodeResult) { loader->didFail(ResourceError(errorDomainWebKitInternal, 0, url.string(), "Data URL decoding failed")); return; } auto& result = decodeResult.value(); auto dataSize = result.data->size(); ResourceResponse dataResponse { url, result.mimeType, dataSize, result.charset }; loader->didReceiveResponse(dataResponse); if (!loader->reachedTerminalState() && dataSize) loader->didReceiveBuffer(result.data.get(), dataSize, DataPayloadWholeResource); if (!loader->reachedTerminalState()) loader->didFinishLoading(currentTime()); }); }
void ResourceLoader::loadDataURL() { auto url = m_request.url(); ASSERT(url.protocolIsData()); RefPtr<ResourceLoader> protectedThis(this); DataURLDecoder::ScheduleContext scheduleContext; #if HAVE(RUNLOOP_TIMER) if (auto* scheduledPairs = m_frame->page()->scheduledRunLoopPairs()) scheduleContext.scheduledPairs = *scheduledPairs; #endif DataURLDecoder::decode(url, scheduleContext, [protectedThis, url](auto decodeResult) { if (protectedThis->reachedTerminalState()) return; if (!decodeResult) { protectedThis->didFail(ResourceError(errorDomainWebKitInternal, 0, url, "Data URL decoding failed")); return; } if (protectedThis->wasCancelled()) return; auto& result = decodeResult.value(); auto dataSize = result.data ? result.data->size() : 0; ResourceResponse dataResponse { url, result.mimeType, dataSize, result.charset }; protectedThis->didReceiveResponse(dataResponse); if (!protectedThis->reachedTerminalState() && dataSize) protectedThis->didReceiveBuffer(result.data.releaseNonNull(), dataSize, DataPayloadWholeResource); if (!protectedThis->reachedTerminalState()) protectedThis->didFinishLoading(currentTime()); }); }