summaryrefslogtreecommitdiff
path: root/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp')
-rw-r--r--Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp94
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);
}
}