diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp')
-rw-r--r-- | Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp | 78 |
1 files changed, 38 insertions, 40 deletions
diff --git a/Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp b/Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp index d8760f9ed..b0414ebc9 100644 --- a/Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp +++ b/Source/WebCore/loader/archive/mhtml/MHTMLParser.cpp @@ -37,7 +37,6 @@ #include "MIMEHeader.h" #include "MIMETypeRegistry.h" #include "QuotedPrintable.h" -#include <wtf/HashMap.h> #include <wtf/text/Base64.h> namespace WebCore { @@ -57,17 +56,16 @@ MHTMLParser::MHTMLParser(SharedBuffer* data) { } -PassRefPtr<MHTMLArchive> MHTMLParser::parseArchive() +RefPtr<MHTMLArchive> MHTMLParser::parseArchive() { - RefPtr<MIMEHeader> header = MIMEHeader::parseHeader(&m_lineReader); - return parseArchiveWithHeader(header.get()); + return parseArchiveWithHeader(MIMEHeader::parseHeader(m_lineReader).get()); } -PassRefPtr<MHTMLArchive> MHTMLParser::parseArchiveWithHeader(MIMEHeader* header) +RefPtr<MHTMLArchive> MHTMLParser::parseArchiveWithHeader(MIMEHeader* header) { if (!header) { LOG_ERROR("Failed to parse MHTML part: no header."); - return 0; + return nullptr; } RefPtr<MHTMLArchive> archive = MHTMLArchive::create(); @@ -76,8 +74,8 @@ PassRefPtr<MHTMLArchive> MHTMLParser::parseArchiveWithHeader(MIMEHeader* header) bool endOfArchiveReached = false; RefPtr<ArchiveResource> resource = parseNextPart(*header, String(), String(), endOfArchiveReached); if (!resource) - return 0; - archive->setMainResource(resource); + return nullptr; + archive->setMainResource(resource.releaseNonNull()); return archive; } @@ -86,31 +84,31 @@ PassRefPtr<MHTMLArchive> MHTMLParser::parseArchiveWithHeader(MIMEHeader* header) bool endOfArchive = false; while (!endOfArchive) { - RefPtr<MIMEHeader> resourceHeader = MIMEHeader::parseHeader(&m_lineReader); + RefPtr<MIMEHeader> resourceHeader = MIMEHeader::parseHeader(m_lineReader); if (!resourceHeader) { LOG_ERROR("Failed to parse MHTML, invalid MIME header."); - return 0; + return nullptr; } if (resourceHeader->contentType() == "multipart/alternative") { // Ignore IE nesting which makes little sense (IE seems to nest only some of the frames). RefPtr<MHTMLArchive> subframeArchive = parseArchiveWithHeader(resourceHeader.get()); if (!subframeArchive) { LOG_ERROR("Failed to parse MHTML subframe."); - return 0; + return nullptr; } bool endOfPartReached = skipLinesUntilBoundaryFound(m_lineReader, header->endOfPartBoundary()); ASSERT_UNUSED(endOfPartReached, endOfPartReached); // The top-frame is the first frame found, regardless of the nesting level. if (subframeArchive->mainResource()) addResourceToArchive(subframeArchive->mainResource(), archive.get()); - archive->addSubframeArchive(subframeArchive); + archive->addSubframeArchive(subframeArchive.releaseNonNull()); continue; } RefPtr<ArchiveResource> resource = parseNextPart(*resourceHeader, header->endOfPartBoundary(), header->endOfDocumentBoundary(), endOfArchive); if (!resource) { LOG_ERROR("Failed to parse MHTML part."); - return 0; + return nullptr; } addResourceToArchive(resource.get(), archive.get()); } @@ -128,17 +126,17 @@ void MHTMLParser::addResourceToArchive(ArchiveResource* resource, MHTMLArchive* // The first document suitable resource is the main frame. if (!archive->mainResource()) { - archive->setMainResource(resource); + archive->setMainResource(*resource); m_frames.append(archive); return; } RefPtr<MHTMLArchive> subframe = MHTMLArchive::create(); - subframe->setMainResource(resource); + subframe->setMainResource(*resource); m_frames.append(subframe); } -PassRefPtr<ArchiveResource> MHTMLParser::parseNextPart(const MIMEHeader& mimeHeader, const String& endOfPartBoundary, const String& endOfDocumentBoundary, bool& endOfArchiveReached) +RefPtr<ArchiveResource> MHTMLParser::parseNextPart(const MIMEHeader& mimeHeader, const String& endOfPartBoundary, const String& endOfDocumentBoundary, bool& endOfArchiveReached) { ASSERT(endOfPartBoundary.isEmpty() == endOfDocumentBoundary.isEmpty()); @@ -148,31 +146,31 @@ PassRefPtr<ArchiveResource> MHTMLParser::parseNextPart(const MIMEHeader& mimeHea if (mimeHeader.contentTransferEncoding() == MIMEHeader::Binary) { if (!checkBoundary) { LOG_ERROR("Binary contents requires end of part"); - return 0; + return nullptr; } m_lineReader.setSeparator(endOfPartBoundary.utf8().data()); Vector<char> part; if (!m_lineReader.nextChunk(part)) { LOG_ERROR("Binary contents requires end of part"); - return 0; - } - content->append(part); - m_lineReader.setSeparator("\r\n"); - Vector<char> nextChars; - if (m_lineReader.peek(nextChars, 2) != 2) { - LOG_ERROR("Invalid seperator."); - return 0; - } - endOfPartReached = true; - ASSERT(nextChars.size() == 2); - endOfArchiveReached = (nextChars[0] == '-' && nextChars[1] == '-'); - if (!endOfArchiveReached) { - String line = m_lineReader.nextChunkAsUTF8StringWithLatin1Fallback(); - if (!line.isEmpty()) { - LOG_ERROR("No CRLF at end of binary section."); - return 0; - } - } + return nullptr; + } + content->append(part); + m_lineReader.setSeparator("\r\n"); + Vector<char> nextChars; + if (m_lineReader.peek(nextChars, 2) != 2) { + LOG_ERROR("Invalid seperator."); + return nullptr; + } + endOfPartReached = true; + ASSERT(nextChars.size() == 2); + endOfArchiveReached = (nextChars[0] == '-' && nextChars[1] == '-'); + if (!endOfArchiveReached) { + String line = m_lineReader.nextChunkAsUTF8StringWithLatin1Fallback(); + if (!line.isEmpty()) { + LOG_ERROR("No CRLF at end of binary section."); + return nullptr; + } + } } else { String line; while (!(line = m_lineReader.nextChunkAsUTF8StringWithLatin1Fallback()).isNull()) { @@ -191,7 +189,7 @@ PassRefPtr<ArchiveResource> MHTMLParser::parseNextPart(const MIMEHeader& mimeHea } if (!endOfPartReached && checkBoundary) { LOG_ERROR("No bounday found for MHTML part."); - return 0; + return nullptr; } Vector<char> data; @@ -199,7 +197,7 @@ PassRefPtr<ArchiveResource> MHTMLParser::parseNextPart(const MIMEHeader& mimeHea case MIMEHeader::Base64: if (!base64Decode(content->data(), content->size(), data)) { LOG_ERROR("Invalid base64 content for MHTML part."); - return 0; + return nullptr; } break; case MIMEHeader::QuotedPrintable: @@ -211,14 +209,14 @@ PassRefPtr<ArchiveResource> MHTMLParser::parseNextPart(const MIMEHeader& mimeHea break; default: LOG_ERROR("Invalid encoding for MHTML part."); - return 0; + return nullptr; } RefPtr<SharedBuffer> contentBuffer = SharedBuffer::adoptVector(data); // FIXME: the URL in the MIME header could be relative, we should resolve it if it is. // The specs mentions 5 ways to resolve a URL: http://tools.ietf.org/html/rfc2557#section-5 // IE and Firefox (UNMht) seem to generate only absolute URLs. URL location = URL(URL(), mimeHeader.contentLocation()); - return ArchiveResource::create(contentBuffer, location, mimeHeader.contentType(), mimeHeader.charset(), String()); + return ArchiveResource::create(WTFMove(contentBuffer), location, mimeHeader.contentType(), mimeHeader.charset(), String()); } size_t MHTMLParser::frameCount() const |