bool DocumentLoader::maybeCreateArchive() { // Only the top-frame can load MHTML. if (m_frame->tree().parent()) return false; // Give the archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. if (!isArchiveMIMEType(m_response.mimeType())) return false; ASSERT(m_mainResource); m_archive = MHTMLArchive::create(m_response.url(), m_mainResource->resourceBuffer()); // Invalid MHTML. if (!m_archive || !m_archive->mainResource()) { m_archive.clear(); return false; } addAllArchiveResources(m_archive.get()); ArchiveResource* mainResource = m_archive->mainResource(); // The origin is the MHTML file, we need to set the base URL to the document encoded in the MHTML so // relative URLs are resolved properly. ensureWriter(mainResource->mimeType(), m_archive->mainResource()->url()); // The Document has now been created. document()->enforceSandboxFlags(SandboxAll); commitData(mainResource->data()->data(), mainResource->data()->size()); return true; }
ArchiveResource* DocumentLoader::archiveResourceForURL(const KURL& url) const { if (!m_archiveResourceCollection) return 0; ArchiveResource* resource = m_archiveResourceCollection->archiveResourceForURL(url); return resource && !resource->shouldIgnoreWhenUnarchiving() ? resource : 0; }
// FIXME: Adding a resource directly to a DocumentLoader/ArchiveResourceCollection seems like bad design, but is API some apps rely on. // Can we change the design in a manner that will let us deprecate that API without reducing functionality of those apps? void ArchiveResourceCollection::addResource(ArchiveResource& resource) { const KURL& url = resource.url(); m_subresources.set(url, &resource); KURL cidURI = MHTMLParser::convertContentIDToURI(resource.contentID()); if (cidURI.isValid()) m_subresources.set(cidURI, &resource); }
bool DocumentLoader::maybeCreateArchive() { // Give the archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. if (!isArchiveMIMEType(m_response.mimeType())) return false; m_archive = MHTMLArchive::create(m_response.url(), mainResourceData().get()); ASSERT(m_archive); addAllArchiveResources(m_archive.get()); ArchiveResource* mainResource = m_archive->mainResource(); m_writer.setMIMEType(mainResource->mimeType()); ASSERT(m_frame->document()); commitData(mainResource->data()->data(), mainResource->data()->size()); return true; }
void DocumentLoader::prepareSubframeArchiveLoadIfNeeded() { if (!m_frame->tree().parent() || !m_frame->tree().parent()->isLocalFrame()) return; ArchiveResourceCollection* parentCollection = toLocalFrame(m_frame->tree().parent())->loader().documentLoader()->m_archiveResourceCollection.get(); if (!parentCollection) return; m_archive = parentCollection->popSubframeArchive(m_frame->tree().uniqueName(), m_request.url()); if (!m_archive) return; addAllArchiveResources(m_archive.get()); ArchiveResource* mainResource = m_archive->mainResource(); m_substituteData = SubstituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL()); }
bool DocumentLoader::scheduleArchiveLoad(Resource* cachedResource, const ResourceRequest& request) { if (!m_archive) return false; ASSERT(m_archiveResourceCollection); ArchiveResource* archiveResource = m_archiveResourceCollection->archiveResourceForURL(request.url()); if (!archiveResource) { cachedResource->error(Resource::LoadError); return true; } cachedResource->setLoading(true); cachedResource->responseReceived(archiveResource->response(), nullptr); SharedBuffer* data = archiveResource->data(); if (data) cachedResource->appendData(data->data(), data->size()); cachedResource->finish(); return true; }
bool DocumentLoader::maybeCreateArchive() { // Give the archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. if (!isArchiveMIMEType(m_response.mimeType())) return false; ASSERT(m_mainResource); ArchiveResource* mainResource = m_fetcher->createArchive(m_mainResource.get()); if (!mainResource) return false; // The origin is the MHTML file, we need to set the base URL to the document encoded in the MHTML so // relative URLs are resolved properly. ensureWriter(mainResource->mimeType(), mainResource->url()); // The Document has now been created. m_frame->document()->enforceSandboxFlags(SandboxAll); commitData(mainResource->data()->data(), mainResource->data()->size()); return true; }
bool DocumentLoader::maybeCreateArchive() { #if !ENABLE(WEB_ARCHIVE) && !ENABLE(MHTML) return false; #else // Give the archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. m_archive = ArchiveFactory::create(m_response.url(), mainResourceData().get(), m_response.mimeType()); if (!m_archive) return false; addAllArchiveResources(m_archive.get()); ArchiveResource* mainResource = m_archive->mainResource(); m_parsedArchiveData = mainResource->data(); m_writer.setMIMEType(mainResource->mimeType()); ASSERT(m_frame->document()); commitData(mainResource->data()->data(), mainResource->data()->size()); return true; #endif // !ENABLE(WEB_ARCHIVE) && !ENABLE(MHTML) }