void LinkImport::process() { if (m_child) return; if (!m_owner) return; if (!shouldLoadResource()) return; if (!m_owner->document().import()) { ASSERT(m_owner->document().frame()); // The document should be the master. HTMLImportsController::provideTo(m_owner->document()); } LinkRequestBuilder builder(m_owner); if (!builder.isValid()) { didFinish(); return; } HTMLImport* parent = m_owner->document().import(); HTMLImportsController* controller = parent->controller(); m_child = controller->load(parent, this, builder.build(true)); if (!m_child) { didFinish(); return; } }
void LinkImport::process() { if (m_loader) return; if (!m_owner) return; if (!m_owner->document()->frame() && !m_owner->document()->import()) return; if (!m_owner->document()->import()) { ASSERT(m_owner->document()->frame()); // The document should be the master. HTMLImportsController::provideTo(m_owner->document()); } LinkRequestBuilder builder(m_owner); if (!builder.isValid()) { didFinish(); return; } HTMLImport* parent = m_owner->document()->import(); HTMLImportsController* controller = parent->controller(); m_loader = controller->createLoader(parent, builder.build(true)); if (!m_loader) { didFinish(); return; } m_loader->addClient(this); }
void HTMLImportChild::stateDidChange() { HTMLImport::stateDidChange(); if (state().isReady()) didFinish(); }
void HTMLImportChild::stateDidChange() { HTMLImport::stateDidChange(); // Once all preceding imports are loaded, // HTMLImportChild can decide whether it should load the import by itself // or it can share existing one. if (!state().shouldBlockDocumentCreation()) ensureLoader(); if (state().isReady()) didFinish(); }
void HTMLImportLoader::setState(State state) { if (m_state == state) return; m_state = state; if (m_state == StateReady || m_state == StateError || m_state == StateWritten) { if (RefPtr<DocumentWriter> writer = m_writer.release()) writer->end(); } // Since DocumentWriter::end() can let setState() reenter, we shouldn't refer to m_state here. if (state == StateReady || state == StateError) didFinish(); }
void NetworkDataTaskBlob::read() { ASSERT(isMainThread()); // If there is no more remaining data to read, we are done. if (!m_totalRemainingSize || m_readItemCount >= m_blobData->items().size()) { didFinish(); return; } const BlobDataItem& item = m_blobData->items().at(m_readItemCount); if (item.type() == BlobDataItem::Type::Data) readData(item); else if (item.type() == BlobDataItem::Type::File) readFile(item); else ASSERT_NOT_REACHED(); }
void NetworkDataTaskBlob::didReceiveResponse(Error errorCode) { LOG(NetworkSession, "%p - NetworkDataTaskBlob::didReceiveResponse(%u)", this, static_cast<unsigned>(errorCode)); Ref<NetworkDataTaskBlob> protectedThis(*this); ResourceResponse response(m_firstRequest.url(), errorCode != Error::NoError ? "text/plain" : m_blobData->contentType(), errorCode != Error::NoError ? 0 : m_totalRemainingSize, String()); switch (errorCode) { case Error::NoError: { bool isRangeRequest = m_rangeOffset != kPositionNotSpecified; response.setHTTPStatusCode(isRangeRequest ? httpPartialContent : httpOK); response.setHTTPStatusText(isRangeRequest ? httpPartialContentText : httpOKText); response.setHTTPHeaderField(HTTPHeaderName::ContentType, m_blobData->contentType()); response.setHTTPHeaderField(HTTPHeaderName::ContentLength, String::number(m_totalRemainingSize)); if (isRangeRequest) response.setHTTPHeaderField(HTTPHeaderName::ContentRange, ParsedContentRange(m_rangeOffset, m_rangeEnd, m_totalSize).headerValue()); // FIXME: If a resource identified with a blob: URL is a File object, user agents must use that file's name attribute, // as if the response had a Content-Disposition header with the filename parameter set to the File's name attribute. // Notably, this will affect a name suggested in "File Save As". break; } case Error::RangeError: response.setHTTPStatusCode(httpRequestedRangeNotSatisfiable); response.setHTTPStatusText(httpRequestedRangeNotSatisfiableText); break; case Error::SecurityError: response.setHTTPStatusCode(httpNotAllowed); response.setHTTPStatusText(httpNotAllowedText); break; default: response.setHTTPStatusCode(httpInternalError); response.setHTTPStatusText(httpInternalErrorText); break; } m_client->didReceiveResponseNetworkSession(WTFMove(response), [this, protectedThis = WTFMove(protectedThis), errorCode](PolicyAction policyAction) { LOG(NetworkSession, "%p - NetworkDataTaskBlob::didReceiveResponse completionHandler (%u)", this, static_cast<unsigned>(policyAction)); if (m_state == State::Canceling || m_state == State::Completed) { clearStream(); return; } if (errorCode != Error::NoError) { didFinish(); return; } switch (policyAction) { case PolicyAction::PolicyUse: m_buffer.resize(bufferSize); read(); break; case PolicyAction::PolicyIgnore: break; case PolicyAction::PolicyDownload: download(); break; } }); }