Title: [99766] trunk/Source
Revision
99766
Author
[email protected]
Date
2011-11-09 15:13:59 -0800 (Wed, 09 Nov 2011)

Log Message

Fix MHTML generation to use the QuotedPrintable encoding for text resources.
This was regressed when we added binary encoding support.
https://bugs.webkit.org/show_bug.cgi?id=71857

Reviewed by Adam Barth.

Source/WebCore:

* loader/archive/mhtml/MHTMLArchive.cpp:
(WebCore::MHTMLArchive::generateMHTMLData):

Source/WebKit/chromium:

* tests/WebPageNewSerializerTest.cpp:
(WebKit::LineReader::LineReader):
(WebKit::LineReader::getNextLine):
(WebKit::WebPageNewSerializeTest::setUpCSSTestPage):
(WebKit::TEST_F):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (99765 => 99766)


--- trunk/Source/WebCore/ChangeLog	2011-11-09 23:05:03 UTC (rev 99765)
+++ trunk/Source/WebCore/ChangeLog	2011-11-09 23:13:59 UTC (rev 99766)
@@ -1,3 +1,14 @@
+2011-11-09  Jay Civelli  <[email protected]>
+
+        Fix MHTML generation to use the QuotedPrintable encoding for text resources.
+        This was regressed when we added binary encoding support.
+        https://bugs.webkit.org/show_bug.cgi?id=71857
+
+        Reviewed by Adam Barth.
+
+        * loader/archive/mhtml/MHTMLArchive.cpp:
+        (WebCore::MHTMLArchive::generateMHTMLData):
+
 2011-11-09  Kentaro Hara  <[email protected]>
 
         Replace [CanBeConstructed] IDL with [Constructor] IDL

Modified: trunk/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp (99765 => 99766)


--- trunk/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp	2011-11-09 23:05:03 UTC (rev 99765)
+++ trunk/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp	2011-11-09 23:13:59 UTC (rev 99766)
@@ -178,7 +178,14 @@
         stringBuilder.append("Content-Type: ");
         stringBuilder.append(resource.mimeType);
 
-        const char* contentEncoding = useBinaryEncoding ? binary : base64;
+        const char* contentEncoding = 0;
+        if (useBinaryEncoding)
+            contentEncoding = binary;
+        else if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(resource.mimeType) || MIMETypeRegistry::isSupportedNonImageMIMEType(resource.mimeType))
+            contentEncoding = quotedPrintable;
+        else
+            contentEncoding = base64;
+
         stringBuilder.append("\r\nContent-Transfer-Encoding: ");
         stringBuilder.append(contentEncoding);
         stringBuilder.append("\r\nContent-Location: ");

Modified: trunk/Source/WebKit/chromium/ChangeLog (99765 => 99766)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-11-09 23:05:03 UTC (rev 99765)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-11-09 23:13:59 UTC (rev 99766)
@@ -1,3 +1,17 @@
+2011-11-09  Jay Civelli  <[email protected]>
+
+        Fix MHTML generation to use the QuotedPrintable encoding for text resources.
+        This was regressed when we added binary encoding support.
+        https://bugs.webkit.org/show_bug.cgi?id=71857
+
+        Reviewed by Adam Barth.
+
+        * tests/WebPageNewSerializerTest.cpp:
+        (WebKit::LineReader::LineReader):
+        (WebKit::LineReader::getNextLine):
+        (WebKit::WebPageNewSerializeTest::setUpCSSTestPage):
+        (WebKit::TEST_F):
+
 2011-11-09  Henrik Grunell  <[email protected]>
 
         Adding missing implementation of WebMediaStreamDescriptor::label().

Modified: trunk/Source/WebKit/chromium/tests/WebPageNewSerializerTest.cpp (99765 => 99766)


--- trunk/Source/WebKit/chromium/tests/WebPageNewSerializerTest.cpp	2011-11-09 23:05:03 UTC (rev 99765)
+++ trunk/Source/WebKit/chromium/tests/WebPageNewSerializerTest.cpp	2011-11-09 23:13:59 UTC (rev 99766)
@@ -49,6 +49,31 @@
 
 namespace {
 
+class LineReader {
+public:
+    LineReader(const std::string& text) : m_text(text), m_index(0) { }
+    bool getNextLine(std::string* line)
+    {
+        line->clear();
+        if (m_index >= m_text.length())
+            return false;
+
+        size_t endOfLineIndex = m_text.find("\r\n", m_index);
+        if (endOfLineIndex == std::string::npos) {
+            *line = m_text.substr(m_index);
+            m_index = m_text.length();
+        } else {
+            *line = m_text.substr(m_index, endOfLineIndex - m_index);
+            m_index = endOfLineIndex + 2;
+        }
+        return true;
+    }
+
+private:
+    std::string m_text;
+    size_t m_index;
+};
+
 class TestWebFrameClient : public WebFrameClient {
 public:
     virtual ~TestWebFrameClient() { }
@@ -97,6 +122,24 @@
         webkit_support::RegisterMockedURL(url, response, WebString::fromUTF8(filePath));
     }
 
+    WebURL setUpCSSTestPage()
+    {
+        WebURL topFrameURL = GURL("http://www.test.com");
+        registerMockedURLLoad(topFrameURL, WebString::fromUTF8("css_test_page.html"), htmlMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/link_styles.css"), WebString::fromUTF8("link_styles.css"), cssMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/import_style_from_link.css"), WebString::fromUTF8("import_style_from_link.css"), cssMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/import_styles.css"), WebString::fromUTF8("import_styles.css"), cssMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/red_background.png"), WebString::fromUTF8("red_background.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/orange_background.png"), WebString::fromUTF8("orange_background.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/yellow_background.png"), WebString::fromUTF8("yellow_background.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/green_background.png"), WebString::fromUTF8("green_background.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/blue_background.png"), WebString::fromUTF8("blue_background.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/purple_background.png"), WebString::fromUTF8("purple_background.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/ul-dot.png"), WebString::fromUTF8("ul-dot.png"), pngMimeType());
+        registerMockedURLLoad(GURL("http://www.test.com/ol-dot.png"), WebString::fromUTF8("ol-dot.png"), pngMimeType());
+        return topFrameURL;
+    }
+
     void loadURLInTopFrame(const GURL& url)
     {
         WebURLRequest urlRequest;
@@ -175,20 +218,7 @@
 TEST_F(WebPageNewSerializeTest, CSSResources)
 {
     // Register the mocked frame and load it.
-    WebURL topFrameURL = GURL("http://www.test.com");
-    registerMockedURLLoad(topFrameURL, WebString::fromUTF8("css_test_page.html"), htmlMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/link_styles.css"), WebString::fromUTF8("link_styles.css"), cssMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/import_style_from_link.css"), WebString::fromUTF8("import_style_from_link.css"), cssMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/import_styles.css"), WebString::fromUTF8("import_styles.css"), cssMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/red_background.png"), WebString::fromUTF8("red_background.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/orange_background.png"), WebString::fromUTF8("orange_background.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/yellow_background.png"), WebString::fromUTF8("yellow_background.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/green_background.png"), WebString::fromUTF8("green_background.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/blue_background.png"), WebString::fromUTF8("blue_background.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/purple_background.png"), WebString::fromUTF8("purple_background.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/ul-dot.png"), WebString::fromUTF8("ul-dot.png"), pngMimeType());
-    registerMockedURLLoad(GURL("http://www.test.com/ol-dot.png"), WebString::fromUTF8("ol-dot.png"), pngMimeType());
-
+    WebURL topFrameURL = setUpCSSTestPage();
     loadURLInTopFrame(topFrameURL);
 
     WebVector<WebPageSerializer::Resource> resources;
@@ -270,4 +300,43 @@
     ASSERT_TRUE(pos == std::string::npos);
 }
 
+TEST_F(WebPageNewSerializeTest, TestMHTMLEncoding)
+{
+    // Load a page with some CSS and some images.
+    WebURL topFrameURL = setUpCSSTestPage();
+    loadURLInTopFrame(topFrameURL);
+
+    WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView);
+    ASSERT_FALSE(mhtmlData.isEmpty());
+
+    // Read the MHTML data line per line and do some pseudo-parsing to make sure the right encoding is used for the different sections.
+    LineReader lineReader(mhtmlData);
+    int sectionCheckedCount = 0;
+    const char* expectedEncoding = 0;
+    std::string line;
+    while (lineReader.getNextLine(&line)) {
+        if (!line.find("Content-Type:")) {
+            ASSERT_FALSE(expectedEncoding);
+            if (line.find("multipart/related;") != std::string::npos) {
+                // Skip this one, it's part of the MHTML header.
+                continue;
+            }
+            if (line.find("text/") != std::string::npos)
+                expectedEncoding = "quoted-printable";
+            else if (line.find("image/") != std::string::npos)
+                expectedEncoding = "base64";
+            else
+                FAIL() << "Unexpected Content-Type: " << line;
+            continue;
+        }
+        if (!line.find("Content-Transfer-Encoding:")) {
+           ASSERT_TRUE(expectedEncoding);
+           EXPECT_TRUE(line.find(expectedEncoding) != std::string::npos);
+           expectedEncoding = 0;
+           sectionCheckedCount++;
+        }
+    }
+    EXPECT_EQ(12, sectionCheckedCount);
 }
+
+}
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to