| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions are | |
| 6 * met: | |
| 7 * | |
| 8 * * Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * * Redistributions in binary form must reproduce the above | |
| 11 * copyright notice, this list of conditions and the following disclaimer | |
| 12 * in the documentation and/or other materials provided with the | |
| 13 * distribution. | |
| 14 * * Neither the name of Google Inc. nor the names of its | |
| 15 * contributors may be used to endorse or promote products derived from | |
| 16 * this software without specific prior written permission. | |
| 17 * | |
| 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 */ | |
| 30 #include "config.h" | |
| 31 | |
| 32 #include "FrameTestHelpers.h" | |
| 33 #include "URLTestHelpers.h" | |
| 34 #include "WebFrame.h" | |
| 35 #include "WebFrameClient.h" | |
| 36 #include "WebPageSerializer.h" | |
| 37 #include "WebPageSerializerClient.h" | |
| 38 #include "WebScriptSource.h" | |
| 39 #include "WebSettings.h" | |
| 40 #include "WebView.h" | |
| 41 #include <gtest/gtest.h> | |
| 42 #include "public/platform/Platform.h" | |
| 43 #include "public/platform/WebString.h" | |
| 44 #include "public/platform/WebThread.h" | |
| 45 #include "public/platform/WebURL.h" | |
| 46 #include "public/platform/WebURLRequest.h" | |
| 47 #include "public/platform/WebURLResponse.h" | |
| 48 #include "public/platform/WebUnitTestSupport.h" | |
| 49 | |
| 50 using namespace blink; | |
| 51 using blink::FrameTestHelpers::runPendingTasks; | |
| 52 using blink::URLTestHelpers::toKURL; | |
| 53 using blink::URLTestHelpers::registerMockedURLLoad; | |
| 54 | |
| 55 namespace { | |
| 56 | |
| 57 class LineReader { | |
| 58 public: | |
| 59 LineReader(const std::string& text) : m_text(text), m_index(0) { } | |
| 60 bool getNextLine(std::string* line) | |
| 61 { | |
| 62 line->clear(); | |
| 63 if (m_index >= m_text.length()) | |
| 64 return false; | |
| 65 | |
| 66 size_t endOfLineIndex = m_text.find("\r\n", m_index); | |
| 67 if (endOfLineIndex == std::string::npos) { | |
| 68 *line = m_text.substr(m_index); | |
| 69 m_index = m_text.length(); | |
| 70 } else { | |
| 71 *line = m_text.substr(m_index, endOfLineIndex - m_index); | |
| 72 m_index = endOfLineIndex + 2; | |
| 73 } | |
| 74 return true; | |
| 75 } | |
| 76 | |
| 77 private: | |
| 78 std::string m_text; | |
| 79 size_t m_index; | |
| 80 }; | |
| 81 | |
| 82 class TestWebFrameClient : public WebFrameClient { | |
| 83 public: | |
| 84 virtual ~TestWebFrameClient() { } | |
| 85 }; | |
| 86 | |
| 87 class LengthCountingWebPageSerializerClient : public WebPageSerializerClient { | |
| 88 public: | |
| 89 LengthCountingWebPageSerializerClient(size_t* counter) | |
| 90 : m_counter(counter) | |
| 91 { | |
| 92 } | |
| 93 | |
| 94 virtual void didSerializeDataForFrame(const WebURL& frameURL, const WebCStri
ng& data, PageSerializationStatus status) { | |
| 95 *m_counter += data.length(); | |
| 96 } | |
| 97 | |
| 98 private: | |
| 99 size_t* m_counter; | |
| 100 }; | |
| 101 | |
| 102 class WebPageNewSerializeTest : public testing::Test { | |
| 103 public: | |
| 104 WebPageNewSerializeTest() | |
| 105 : m_htmlMimeType(WebString::fromUTF8("text/html")) | |
| 106 , m_xhtmlMimeType(WebString::fromUTF8("application/xhtml+xml")) | |
| 107 , m_cssMimeType(WebString::fromUTF8("text/css")) | |
| 108 , m_pngMimeType(WebString::fromUTF8("image/png")) | |
| 109 , m_svgMimeType(WebString::fromUTF8("image/svg+xml")) | |
| 110 { | |
| 111 } | |
| 112 | |
| 113 protected: | |
| 114 virtual void SetUp() | |
| 115 { | |
| 116 // Create and initialize the WebView. | |
| 117 m_webView = WebView::create(0); | |
| 118 m_mainFrame = WebFrame::create(&m_webFrameClient); | |
| 119 | |
| 120 // We want the images to load and JavaScript to be on. | |
| 121 WebSettings* settings = m_webView->settings(); | |
| 122 settings->setImagesEnabled(true); | |
| 123 settings->setLoadsImagesAutomatically(true); | |
| 124 settings->setJavaScriptEnabled(true); | |
| 125 | |
| 126 m_webView->setMainFrame(m_mainFrame); | |
| 127 } | |
| 128 | |
| 129 virtual void TearDown() | |
| 130 { | |
| 131 Platform::current()->unitTestSupport()->unregisterAllMockedURLs(); | |
| 132 m_webView->close(); | |
| 133 m_mainFrame->close(); | |
| 134 } | |
| 135 | |
| 136 WebURL setUpCSSTestPage() | |
| 137 { | |
| 138 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 139 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("css_test_page.ht
ml"), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 140 registerMockedURLLoad(toKURL("http://www.test.com/link_styles.css"), Web
String::fromUTF8("link_styles.css"), WebString::fromUTF8("pageserializer/"), css
MimeType()); | |
| 141 registerMockedURLLoad(toKURL("http://www.test.com/import_style_from_link
.css"), WebString::fromUTF8("import_style_from_link.css"), WebString::fromUTF8("
pageserializer/"), cssMimeType()); | |
| 142 registerMockedURLLoad(toKURL("http://www.test.com/import_styles.css"), W
ebString::fromUTF8("import_styles.css"), WebString::fromUTF8("pageserializer/"),
cssMimeType()); | |
| 143 registerMockedURLLoad(toKURL("http://www.test.com/red_background.png"),
WebString::fromUTF8("red_background.png"), WebString::fromUTF8("pageserializer/"
), pngMimeType()); | |
| 144 registerMockedURLLoad(toKURL("http://www.test.com/orange_background.png"
), WebString::fromUTF8("orange_background.png"), WebString::fromUTF8("pageserial
izer/"), pngMimeType()); | |
| 145 registerMockedURLLoad(toKURL("http://www.test.com/yellow_background.png"
), WebString::fromUTF8("yellow_background.png"), WebString::fromUTF8("pageserial
izer/"), pngMimeType()); | |
| 146 registerMockedURLLoad(toKURL("http://www.test.com/green_background.png")
, WebString::fromUTF8("green_background.png"), WebString::fromUTF8("pageserializ
er/"), pngMimeType()); | |
| 147 registerMockedURLLoad(toKURL("http://www.test.com/blue_background.png"),
WebString::fromUTF8("blue_background.png"), WebString::fromUTF8("pageserializer
/"), pngMimeType()); | |
| 148 registerMockedURLLoad(toKURL("http://www.test.com/purple_background.png"
), WebString::fromUTF8("purple_background.png"), WebString::fromUTF8("pageserial
izer/"), pngMimeType()); | |
| 149 registerMockedURLLoad(toKURL("http://www.test.com/ul-dot.png"), WebStrin
g::fromUTF8("ul-dot.png"), WebString::fromUTF8("pageserializer/"), pngMimeType()
); | |
| 150 registerMockedURLLoad(toKURL("http://www.test.com/ol-dot.png"), WebStrin
g::fromUTF8("ol-dot.png"), WebString::fromUTF8("pageserializer/"), pngMimeType()
); | |
| 151 return topFrameURL; | |
| 152 } | |
| 153 | |
| 154 void loadURLInTopFrame(const WebURL& url) | |
| 155 { | |
| 156 WebURLRequest urlRequest; | |
| 157 urlRequest.initialize(); | |
| 158 urlRequest.setURL(url); | |
| 159 m_webView->mainFrame()->loadRequest(urlRequest); | |
| 160 // Make sure any pending request get served. | |
| 161 Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests(
); | |
| 162 // Some requests get delayed, run the timer. | |
| 163 runPendingTasks(); | |
| 164 // Server the delayed resources. | |
| 165 Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests(
); | |
| 166 } | |
| 167 | |
| 168 const WebString& htmlMimeType() const { return m_htmlMimeType; } | |
| 169 const WebString& xhtmlMimeType() const { return m_xhtmlMimeType; } | |
| 170 const WebString& cssMimeType() const { return m_cssMimeType; } | |
| 171 const WebString& pngMimeType() const { return m_pngMimeType; } | |
| 172 const WebString& svgMimeType() const { return m_svgMimeType; } | |
| 173 | |
| 174 static bool resourceVectorContains(const WebVector<WebPageSerializer::Resour
ce>& resources, const char* url, const char* mimeType) | |
| 175 { | |
| 176 WebURL webURL = WebURL(toKURL(url)); | |
| 177 for (size_t i = 0; i < resources.size(); ++i) { | |
| 178 const WebPageSerializer::Resource& resource = resources[i]; | |
| 179 if (resource.url == webURL && !resource.data.isEmpty() && !resource.
mimeType.compare(WebCString(mimeType))) | |
| 180 return true; | |
| 181 } | |
| 182 return false; | |
| 183 } | |
| 184 | |
| 185 WebView* m_webView; | |
| 186 | |
| 187 private: | |
| 188 WebString m_htmlMimeType; | |
| 189 WebString m_xhtmlMimeType; | |
| 190 WebString m_cssMimeType; | |
| 191 WebString m_pngMimeType; | |
| 192 WebString m_svgMimeType; | |
| 193 TestWebFrameClient m_webFrameClient; | |
| 194 WebFrame* m_mainFrame; | |
| 195 }; | |
| 196 | |
| 197 // Tests that a page with resources and sub-frame is reported with all its resou
rces. | |
| 198 TEST_F(WebPageNewSerializeTest, PageWithFrames) | |
| 199 { | |
| 200 // Register the mocked frames. | |
| 201 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 202 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("top_frame.html"), We
bString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 203 registerMockedURLLoad(toKURL("http://www.test.com/iframe.html"), WebString::
fromUTF8("iframe.html"), WebString::fromUTF8("pageserializer/"), htmlMimeType())
; | |
| 204 registerMockedURLLoad(toKURL("http://www.test.com/iframe2.html"), WebString:
:fromUTF8("iframe2.html"), WebString::fromUTF8("pageserializer/"), htmlMimeType(
)); | |
| 205 registerMockedURLLoad(toKURL("http://www.test.com/red_background.png"), WebS
tring::fromUTF8("red_background.png"), WebString::fromUTF8("pageserializer/"), p
ngMimeType()); | |
| 206 registerMockedURLLoad(toKURL("http://www.test.com/green_background.png"), We
bString::fromUTF8("green_background.png"), WebString::fromUTF8("pageserializer/"
), pngMimeType()); | |
| 207 registerMockedURLLoad(toKURL("http://www.test.com/blue_background.png"), Web
String::fromUTF8("blue_background.png"), WebString::fromUTF8("pageserializer/"),
pngMimeType()); | |
| 208 | |
| 209 loadURLInTopFrame(topFrameURL); | |
| 210 | |
| 211 WebVector<WebPageSerializer::Resource> resources; | |
| 212 WebPageSerializer::serialize(m_webView, &resources); | |
| 213 ASSERT_FALSE(resources.isEmpty()); | |
| 214 | |
| 215 // The first resource should be the main-frame. | |
| 216 const WebPageSerializer::Resource& resource = resources[0]; | |
| 217 EXPECT_TRUE(resource.url == WebURL(toKURL("http://www.test.com"))); | |
| 218 EXPECT_EQ(0, resource.mimeType.compare(WebCString("text/html"))); | |
| 219 EXPECT_FALSE(resource.data.isEmpty()); | |
| 220 | |
| 221 EXPECT_EQ(6U, resources.size()); // There should be no duplicates. | |
| 222 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/red_backg
round.png", "image/png")); | |
| 223 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/green_bac
kground.png", "image/png")); | |
| 224 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/blue_back
ground.png", "image/png")); | |
| 225 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/iframe.ht
ml", "text/html")); | |
| 226 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/iframe2.h
tml", "text/html")); | |
| 227 } | |
| 228 | |
| 229 // Test that when serializing a page, all CSS resources are reported, including
url()'s | |
| 230 // and imports and links. Note that we don't test the resources contents, we onl
y make sure | |
| 231 // they are all reported with the right mime type and that they contain some dat
a. | |
| 232 TEST_F(WebPageNewSerializeTest, FAILS_CSSResources) | |
| 233 { | |
| 234 // Register the mocked frame and load it. | |
| 235 WebURL topFrameURL = setUpCSSTestPage(); | |
| 236 loadURLInTopFrame(topFrameURL); | |
| 237 | |
| 238 WebVector<WebPageSerializer::Resource> resources; | |
| 239 WebPageSerializer::serialize(m_webView, &resources); | |
| 240 ASSERT_FALSE(resources.isEmpty()); | |
| 241 | |
| 242 // The first resource should be the main-frame. | |
| 243 const WebPageSerializer::Resource& resource = resources[0]; | |
| 244 EXPECT_TRUE(resource.url == WebURL(toKURL("http://www.test.com"))); | |
| 245 EXPECT_EQ(0, resource.mimeType.compare(WebCString("text/html"))); | |
| 246 EXPECT_FALSE(resource.data.isEmpty()); | |
| 247 | |
| 248 EXPECT_EQ(12U, resources.size()); // There should be no duplicates. | |
| 249 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/link_styl
es.css", "text/css")); | |
| 250 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/import_st
yles.css", "text/css")); | |
| 251 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/import_st
yle_from_link.css", "text/css")); | |
| 252 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/red_backg
round.png", "image/png")); | |
| 253 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/orange_ba
ckground.png", "image/png")); | |
| 254 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/yellow_ba
ckground.png", "image/png")); | |
| 255 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/green_bac
kground.png", "image/png")); | |
| 256 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/blue_back
ground.png", "image/png")); | |
| 257 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/purple_ba
ckground.png", "image/png")); | |
| 258 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/ul-dot.pn
g", "image/png")); | |
| 259 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/ol-dot.pn
g", "image/png")); | |
| 260 } | |
| 261 | |
| 262 // Tests that when serializing a page with blank frames these are reported with
their resources. | |
| 263 TEST_F(WebPageNewSerializeTest, BlankFrames) | |
| 264 { | |
| 265 // Register the mocked frame and load it. | |
| 266 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 267 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("blank_frames.html"),
WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 268 registerMockedURLLoad(toKURL("http://www.test.com/red_background.png"), WebS
tring::fromUTF8("red_background.png"), WebString::fromUTF8("pageserializer/"), p
ngMimeType()); | |
| 269 registerMockedURLLoad(toKURL("http://www.test.com/orange_background.png"), W
ebString::fromUTF8("orange_background.png"), WebString::fromUTF8("pageserializer
/"), pngMimeType()); | |
| 270 registerMockedURLLoad(toKURL("http://www.test.com/blue_background.png"), Web
String::fromUTF8("blue_background.png"), WebString::fromUTF8("pageserializer/"),
pngMimeType()); | |
| 271 | |
| 272 loadURLInTopFrame(topFrameURL); | |
| 273 | |
| 274 WebVector<WebPageSerializer::Resource> resources; | |
| 275 WebPageSerializer::serialize(m_webView, &resources); | |
| 276 ASSERT_FALSE(resources.isEmpty()); | |
| 277 | |
| 278 // The first resource should be the main-frame. | |
| 279 const WebPageSerializer::Resource& resource = resources[0]; | |
| 280 EXPECT_TRUE(resource.url == WebURL(toKURL("http://www.test.com"))); | |
| 281 EXPECT_EQ(0, resource.mimeType.compare(WebCString("text/html"))); | |
| 282 EXPECT_FALSE(resource.data.isEmpty()); | |
| 283 | |
| 284 EXPECT_EQ(7U, resources.size()); // There should be no duplicates. | |
| 285 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/red_backg
round.png", "image/png")); | |
| 286 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/orange_ba
ckground.png", "image/png")); | |
| 287 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/blue_back
ground.png", "image/png")); | |
| 288 // The blank frames should have got a magic URL. | |
| 289 EXPECT_TRUE(resourceVectorContains(resources, "wyciwyg://frame/0", "text/htm
l")); | |
| 290 EXPECT_TRUE(resourceVectorContains(resources, "wyciwyg://frame/1", "text/htm
l")); | |
| 291 EXPECT_TRUE(resourceVectorContains(resources, "wyciwyg://frame/2", "text/htm
l")); | |
| 292 } | |
| 293 | |
| 294 TEST_F(WebPageNewSerializeTest, SerializeXMLHasRightDeclaration) | |
| 295 { | |
| 296 WebURL topFrameURL = toKURL("http://www.test.com/simple.xhtml"); | |
| 297 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("simple.xhtml"), WebS
tring::fromUTF8("pageserializer/"), xhtmlMimeType()); | |
| 298 | |
| 299 loadURLInTopFrame(topFrameURL); | |
| 300 | |
| 301 WebVector<WebPageSerializer::Resource> resources; | |
| 302 WebPageSerializer::serialize(m_webView, &resources); | |
| 303 ASSERT_FALSE(resources.isEmpty()); | |
| 304 | |
| 305 // We expect only one resource, the XML. | |
| 306 ASSERT_EQ(1U, resources.size()); | |
| 307 std::string xml = std::string(resources[0].data.data()); | |
| 308 | |
| 309 // We should have one and only one instance of the XML declaration. | |
| 310 size_t pos = xml.find("<?xml version="); | |
| 311 ASSERT_TRUE(pos != std::string::npos); | |
| 312 | |
| 313 pos = xml.find("<?xml version=", pos + 1); | |
| 314 ASSERT_TRUE(pos == std::string::npos); | |
| 315 } | |
| 316 | |
| 317 TEST_F(WebPageNewSerializeTest, FAILS_TestMHTMLEncoding) | |
| 318 { | |
| 319 // Load a page with some CSS and some images. | |
| 320 WebURL topFrameURL = setUpCSSTestPage(); | |
| 321 loadURLInTopFrame(topFrameURL); | |
| 322 | |
| 323 WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView); | |
| 324 ASSERT_FALSE(mhtmlData.isEmpty()); | |
| 325 | |
| 326 // Read the MHTML data line per line and do some pseudo-parsing to make sure
the right encoding is used for the different sections. | |
| 327 LineReader lineReader(std::string(mhtmlData.data())); | |
| 328 int sectionCheckedCount = 0; | |
| 329 const char* expectedEncoding = 0; | |
| 330 std::string line; | |
| 331 while (lineReader.getNextLine(&line)) { | |
| 332 if (!line.find("Content-Type:")) { | |
| 333 ASSERT_FALSE(expectedEncoding); | |
| 334 if (line.find("multipart/related;") != std::string::npos) { | |
| 335 // Skip this one, it's part of the MHTML header. | |
| 336 continue; | |
| 337 } | |
| 338 if (line.find("text/") != std::string::npos) | |
| 339 expectedEncoding = "quoted-printable"; | |
| 340 else if (line.find("image/") != std::string::npos) | |
| 341 expectedEncoding = "base64"; | |
| 342 else | |
| 343 FAIL() << "Unexpected Content-Type: " << line; | |
| 344 continue; | |
| 345 } | |
| 346 if (!line.find("Content-Transfer-Encoding:")) { | |
| 347 ASSERT_TRUE(expectedEncoding); | |
| 348 EXPECT_TRUE(line.find(expectedEncoding) != std::string::npos); | |
| 349 expectedEncoding = 0; | |
| 350 sectionCheckedCount++; | |
| 351 } | |
| 352 } | |
| 353 EXPECT_EQ(12, sectionCheckedCount); | |
| 354 } | |
| 355 | |
| 356 // Test that we don't regress https://bugs.webkit.org/show_bug.cgi?id=99105 | |
| 357 TEST_F(WebPageNewSerializeTest, SVGImageDontCrash) | |
| 358 { | |
| 359 WebURL pageUrl = toKURL("http://www.test.com"); | |
| 360 WebURL imageUrl = toKURL("http://www.test.com/green_rectangle.svg"); | |
| 361 | |
| 362 registerMockedURLLoad(pageUrl, WebString::fromUTF8("page_with_svg_image.html
"), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 363 registerMockedURLLoad(imageUrl, WebString::fromUTF8("green_rectangle.svg"),
WebString::fromUTF8("pageserializer/"), svgMimeType()); | |
| 364 | |
| 365 loadURLInTopFrame(pageUrl); | |
| 366 | |
| 367 WebCString mhtml = WebPageSerializer::serializeToMHTML(m_webView); | |
| 368 // We expect some data to be generated. | |
| 369 EXPECT_GT(mhtml.length(), 50U); | |
| 370 } | |
| 371 | |
| 372 TEST_F(WebPageNewSerializeTest, NamespaceElementsDontCrash) | |
| 373 { | |
| 374 WebURL pageUrl = toKURL("http://www.test.com"); | |
| 375 registerMockedURLLoad(pageUrl, WebString::fromUTF8("namespace_element.html")
, WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 376 | |
| 377 loadURLInTopFrame(pageUrl); | |
| 378 | |
| 379 WebVector<WebURL> localLinks(static_cast<size_t>(1)); | |
| 380 WebVector<WebString> localPaths(static_cast<size_t>(1)); | |
| 381 localLinks[0] = pageUrl; | |
| 382 localPaths[0] = WebString("/"); | |
| 383 | |
| 384 size_t counter = 0; | |
| 385 LengthCountingWebPageSerializerClient client(&counter); | |
| 386 | |
| 387 // We just want to make sure nothing crazy happens, namely that no | |
| 388 // assertions are hit. As a sanity check, we also make sure that some data | |
| 389 // was returned. | |
| 390 WebPageSerializer::serialize(m_webView->mainFrame(), true, &client, localLin
ks, localPaths, WebString("")); | |
| 391 | |
| 392 EXPECT_GT(counter, 0U); | |
| 393 } | |
| 394 | |
| 395 } | |
| 396 | |
| 397 TEST_F(WebPageNewSerializeTest, TestMHTMLEncodingWithDataURL) | |
| 398 { | |
| 399 // Load a page with some data urls. | |
| 400 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 401 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("page_with_data.html"
), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 402 loadURLInTopFrame(topFrameURL); | |
| 403 | |
| 404 WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView); | |
| 405 ASSERT_FALSE(mhtmlData.isEmpty()); | |
| 406 | |
| 407 // Read the MHTML data line and check that the string data:image is found | |
| 408 // exactly one time. | |
| 409 size_t nbDataURLs = 0; | |
| 410 LineReader lineReader(std::string(mhtmlData.data())); | |
| 411 std::string line; | |
| 412 while (lineReader.getNextLine(&line)) { | |
| 413 if (line.find("data:image") != std::string::npos) | |
| 414 nbDataURLs++; | |
| 415 } | |
| 416 EXPECT_EQ(1u, nbDataURLs); | |
| 417 } | |
| 418 | |
| 419 | |
| 420 TEST_F(WebPageNewSerializeTest, TestMHTMLEncodingWithMorphingDataURL) | |
| 421 { | |
| 422 // Load a page with some data urls. | |
| 423 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 424 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("page_with_morphing_d
ata.html"), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 425 loadURLInTopFrame(topFrameURL); | |
| 426 | |
| 427 WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView); | |
| 428 ASSERT_FALSE(mhtmlData.isEmpty()); | |
| 429 | |
| 430 // Read the MHTML data line and check that the string data:image is found | |
| 431 // exactly two times. | |
| 432 size_t nbDataURLs = 0; | |
| 433 LineReader lineReader(std::string(mhtmlData.data())); | |
| 434 std::string line; | |
| 435 while (lineReader.getNextLine(&line)) { | |
| 436 if (line.find("data:text") != std::string::npos) | |
| 437 nbDataURLs++; | |
| 438 } | |
| 439 EXPECT_EQ(2u, nbDataURLs); | |
| 440 } | |
| OLD | NEW |