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/MHTMLArchive.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/MHTMLArchive.cpp')
-rw-r--r-- | Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp | 94 |
1 files changed, 35 insertions, 59 deletions
diff --git a/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp b/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp index 4708bf11e..2ca67e27b 100644 --- a/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp +++ b/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp @@ -59,7 +59,6 @@ namespace WebCore { const char* const quotedPrintable = "quoted-printable"; const char* const base64 = "base64"; -const char* const binary = "binary"; static String generateRandomBoundary() { @@ -102,50 +101,40 @@ MHTMLArchive::~MHTMLArchive() clearAllSubframeArchives(); } -PassRefPtr<MHTMLArchive> MHTMLArchive::create() +Ref<MHTMLArchive> MHTMLArchive::create() { - return adoptRef(new MHTMLArchive); + return adoptRef(*new MHTMLArchive); } -PassRefPtr<MHTMLArchive> MHTMLArchive::create(const URL& url, SharedBuffer* data) +RefPtr<MHTMLArchive> MHTMLArchive::create(const URL& url, SharedBuffer& data) { // For security reasons we only load MHTML pages from local URLs. - if (!SchemeRegistry::shouldTreatURLSchemeAsLocal(url.protocol())) - return 0; + if (!SchemeRegistry::shouldTreatURLSchemeAsLocal(url.protocol().toString())) + return nullptr; - MHTMLParser parser(data); + MHTMLParser parser(&data); RefPtr<MHTMLArchive> mainArchive = parser.parseArchive(); if (!mainArchive) - return 0; // Invalid MHTML file. + return nullptr; // Invalid MHTML file. // Since MHTML is a flat format, we need to make all frames aware of all resources. for (size_t i = 0; i < parser.frameCount(); ++i) { RefPtr<MHTMLArchive> archive = parser.frameAt(i); for (size_t j = 1; j < parser.frameCount(); ++j) { if (i != j) - archive->addSubframeArchive(parser.frameAt(j)); + archive->addSubframeArchive(*parser.frameAt(j)); } for (size_t j = 0; j < parser.subResourceCount(); ++j) - archive->addSubresource(parser.subResourceAt(j)); + archive->addSubresource(*parser.subResourceAt(j)); } - return mainArchive.release(); + return mainArchive; } -PassRefPtr<SharedBuffer> MHTMLArchive::generateMHTMLData(Page* page) -{ - return generateMHTMLData(page, false); -} - -PassRefPtr<SharedBuffer> MHTMLArchive::generateMHTMLDataUsingBinaryEncoding(Page* page) -{ - return generateMHTMLData(page, true); -} - -PassRefPtr<SharedBuffer> MHTMLArchive::generateMHTMLData(Page* page, bool useBinaryEncoding) +RefPtr<SharedBuffer> MHTMLArchive::generateMHTMLData(Page* page) { Vector<PageSerializer::Resource> resources; - PageSerializer pageSerializer(&resources); - pageSerializer.serialize(page); + PageSerializer pageSerializer(resources); + pageSerializer.serialize(*page); String boundary = generateRandomBoundary(); String endOfResourceBoundary = makeString("--", boundary, "\r\n"); @@ -176,18 +165,14 @@ PassRefPtr<SharedBuffer> MHTMLArchive::generateMHTMLData(Page* page, bool useBin RefPtr<SharedBuffer> mhtmlData = SharedBuffer::create(); mhtmlData->append(asciiString.data(), asciiString.length()); - for (size_t i = 0; i < resources.size(); ++i) { - const PageSerializer::Resource& resource = resources[i]; - + for (auto& resource : resources) { stringBuilder.clear(); stringBuilder.append(endOfResourceBoundary); stringBuilder.append("Content-Type: "); stringBuilder.append(resource.mimeType); - const char* contentEncoding = 0; - if (useBinaryEncoding) - contentEncoding = binary; - else if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(resource.mimeType) || MIMETypeRegistry::isSupportedNonImageMIMEType(resource.mimeType)) + const char* contentEncoding = nullptr; + if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(resource.mimeType) || MIMETypeRegistry::isSupportedNonImageMIMEType(resource.mimeType)) contentEncoding = quotedPrintable; else contentEncoding = base64; @@ -201,36 +186,27 @@ PassRefPtr<SharedBuffer> MHTMLArchive::generateMHTMLData(Page* page, bool useBin asciiString = stringBuilder.toString().utf8(); mhtmlData->append(asciiString.data(), asciiString.length()); - if (!strcmp(contentEncoding, binary)) { - const char* data; - size_t position = 0; - while (size_t length = resource.data->getSomeData(data, position)) { - mhtmlData->append(data, length); - position += length; - } + // FIXME: ideally we would encode the content as a stream without having to fetch it all. + const char* data = resource.data->data(); + size_t dataLength = resource.data->size(); + Vector<char> encodedData; + if (!strcmp(contentEncoding, quotedPrintable)) { + quotedPrintableEncode(data, dataLength, encodedData); + mhtmlData->append(encodedData.data(), encodedData.size()); + mhtmlData->append("\r\n", 2); } else { - // FIXME: ideally we would encode the content as a stream without having to fetch it all. - const char* data = resource.data->data(); - size_t dataLength = resource.data->size(); - Vector<char> encodedData; - if (!strcmp(contentEncoding, quotedPrintable)) { - quotedPrintableEncode(data, dataLength, encodedData); - mhtmlData->append(encodedData.data(), encodedData.size()); + ASSERT(!strcmp(contentEncoding, base64)); + // We are not specifying insertLFs = true below as it would cut the lines with LFs and MHTML requires CRLFs. + base64Encode(data, dataLength, encodedData); + const size_t maximumLineLength = 76; + size_t index = 0; + size_t encodedDataLength = encodedData.size(); + do { + size_t lineLength = std::min(encodedDataLength - index, maximumLineLength); + mhtmlData->append(encodedData.data() + index, lineLength); mhtmlData->append("\r\n", 2); - } else { - ASSERT(!strcmp(contentEncoding, base64)); - // We are not specifying insertLFs = true below as it would cut the lines with LFs and MHTML requires CRLFs. - base64Encode(data, dataLength, encodedData); - const size_t maximumLineLength = 76; - size_t index = 0; - size_t encodedDataLength = encodedData.size(); - do { - size_t lineLength = std::min(encodedDataLength - index, maximumLineLength); - mhtmlData->append(encodedData.data() + index, lineLength); - mhtmlData->append("\r\n", 2); - index += maximumLineLength; - } while (index < encodedDataLength); - } + index += maximumLineLength; + } while (index < encodedDataLength); } } |