| 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 "core/dom/Document.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 #include "public/web/WebDocument.h" | |
| 50 #include <gtest/gtest.h> | |
| 51 | |
| 52 using namespace blink; | |
| 53 using WebCore::Document; | |
| 54 using blink::FrameTestHelpers::runPendingTasks; | |
| 55 using blink::URLTestHelpers::toKURL; | |
| 56 using blink::URLTestHelpers::registerMockedURLLoad; | |
| 57 | |
| 58 namespace { | |
| 59 | |
| 60 class LineReader { | |
| 61 public: | |
| 62 LineReader(const std::string& text) : m_text(text), m_index(0) { } | |
| 63 bool getNextLine(std::string* line) | |
| 64 { | |
| 65 line->clear(); | |
| 66 if (m_index >= m_text.length()) | |
| 67 return false; | |
| 68 | |
| 69 size_t endOfLineIndex = m_text.find("\r\n", m_index); | |
| 70 if (endOfLineIndex == std::string::npos) { | |
| 71 *line = m_text.substr(m_index); | |
| 72 m_index = m_text.length(); | |
| 73 } else { | |
| 74 *line = m_text.substr(m_index, endOfLineIndex - m_index); | |
| 75 m_index = endOfLineIndex + 2; | |
| 76 } | |
| 77 return true; | |
| 78 } | |
| 79 | |
| 80 private: | |
| 81 std::string m_text; | |
| 82 size_t m_index; | |
| 83 }; | |
| 84 | |
| 85 class TestWebFrameClient : public WebFrameClient { | |
| 86 public: | |
| 87 virtual ~TestWebFrameClient() { } | |
| 88 }; | |
| 89 | |
| 90 class LengthCountingWebPageSerializerClient : public WebPageSerializerClient { | |
| 91 public: | |
| 92 LengthCountingWebPageSerializerClient(size_t* counter) | |
| 93 : m_counter(counter) | |
| 94 { | |
| 95 } | |
| 96 | |
| 97 virtual void didSerializeDataForFrame(const WebURL& frameURL, const WebCStri
ng& data, PageSerializationStatus status) { | |
| 98 *m_counter += data.length(); | |
| 99 } | |
| 100 | |
| 101 private: | |
| 102 size_t* m_counter; | |
| 103 }; | |
| 104 | |
| 105 class WebPageNewSerializeTest : public testing::Test { | |
| 106 public: | |
| 107 WebPageNewSerializeTest() | |
| 108 : m_htmlMimeType(WebString::fromUTF8("text/html")) | |
| 109 , m_xhtmlMimeType(WebString::fromUTF8("application/xhtml+xml")) | |
| 110 , m_cssMimeType(WebString::fromUTF8("text/css")) | |
| 111 , m_pngMimeType(WebString::fromUTF8("image/png")) | |
| 112 , m_svgMimeType(WebString::fromUTF8("image/svg+xml")) | |
| 113 { | |
| 114 } | |
| 115 | |
| 116 protected: | |
| 117 virtual void SetUp() | |
| 118 { | |
| 119 // Create and initialize the WebView. | |
| 120 m_webView = WebView::create(0); | |
| 121 m_mainFrame = WebFrame::create(&m_webFrameClient); | |
| 122 | |
| 123 // We want the images to load and JavaScript to be on. | |
| 124 WebSettings* settings = m_webView->settings(); | |
| 125 settings->setImagesEnabled(true); | |
| 126 settings->setLoadsImagesAutomatically(true); | |
| 127 settings->setJavaScriptEnabled(true); | |
| 128 | |
| 129 m_webView->setMainFrame(m_mainFrame); | |
| 130 } | |
| 131 | |
| 132 virtual void TearDown() | |
| 133 { | |
| 134 Platform::current()->unitTestSupport()->unregisterAllMockedURLs(); | |
| 135 m_webView->close(); | |
| 136 m_mainFrame->close(); | |
| 137 } | |
| 138 | |
| 139 WebURL setUpCSSTestPage() | |
| 140 { | |
| 141 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 142 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("css_test_page.ht
ml"), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 143 registerMockedURLLoad(toKURL("http://www.test.com/link_styles.css"), Web
String::fromUTF8("link_styles.css"), WebString::fromUTF8("pageserializer/"), css
MimeType()); | |
| 144 registerMockedURLLoad(toKURL("http://www.test.com/import_style_from_link
.css"), WebString::fromUTF8("import_style_from_link.css"), WebString::fromUTF8("
pageserializer/"), cssMimeType()); | |
| 145 registerMockedURLLoad(toKURL("http://www.test.com/import_styles.css"), W
ebString::fromUTF8("import_styles.css"), WebString::fromUTF8("pageserializer/"),
cssMimeType()); | |
| 146 registerMockedURLLoad(toKURL("http://www.test.com/red_background.png"),
WebString::fromUTF8("red_background.png"), WebString::fromUTF8("pageserializer/"
), pngMimeType()); | |
| 147 registerMockedURLLoad(toKURL("http://www.test.com/orange_background.png"
), WebString::fromUTF8("orange_background.png"), WebString::fromUTF8("pageserial
izer/"), pngMimeType()); | |
| 148 registerMockedURLLoad(toKURL("http://www.test.com/yellow_background.png"
), WebString::fromUTF8("yellow_background.png"), WebString::fromUTF8("pageserial
izer/"), pngMimeType()); | |
| 149 registerMockedURLLoad(toKURL("http://www.test.com/green_background.png")
, WebString::fromUTF8("green_background.png"), WebString::fromUTF8("pageserializ
er/"), pngMimeType()); | |
| 150 registerMockedURLLoad(toKURL("http://www.test.com/blue_background.png"),
WebString::fromUTF8("blue_background.png"), WebString::fromUTF8("pageserializer
/"), pngMimeType()); | |
| 151 registerMockedURLLoad(toKURL("http://www.test.com/purple_background.png"
), WebString::fromUTF8("purple_background.png"), WebString::fromUTF8("pageserial
izer/"), pngMimeType()); | |
| 152 registerMockedURLLoad(toKURL("http://www.test.com/ul-dot.png"), WebStrin
g::fromUTF8("ul-dot.png"), WebString::fromUTF8("pageserializer/"), pngMimeType()
); | |
| 153 registerMockedURLLoad(toKURL("http://www.test.com/ol-dot.png"), WebStrin
g::fromUTF8("ol-dot.png"), WebString::fromUTF8("pageserializer/"), pngMimeType()
); | |
| 154 return topFrameURL; | |
| 155 } | |
| 156 | |
| 157 void loadURLInTopFrame(const WebURL& url) | |
| 158 { | |
| 159 WebURLRequest urlRequest; | |
| 160 urlRequest.initialize(); | |
| 161 urlRequest.setURL(url); | |
| 162 m_webView->mainFrame()->loadRequest(urlRequest); | |
| 163 // Make sure any pending request get served. | |
| 164 Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests(
); | |
| 165 // Some requests get delayed, run the timer. | |
| 166 runPendingTasks(); | |
| 167 // Server the delayed resources. | |
| 168 Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests(
); | |
| 169 } | |
| 170 | |
| 171 const WebString& htmlMimeType() const { return m_htmlMimeType; } | |
| 172 const WebString& xhtmlMimeType() const { return m_xhtmlMimeType; } | |
| 173 const WebString& cssMimeType() const { return m_cssMimeType; } | |
| 174 const WebString& pngMimeType() const { return m_pngMimeType; } | |
| 175 const WebString& svgMimeType() const { return m_svgMimeType; } | |
| 176 | |
| 177 static bool resourceVectorContains(const WebVector<WebPageSerializer::Resour
ce>& resources, const char* url, const char* mimeType) | |
| 178 { | |
| 179 WebURL webURL = WebURL(toKURL(url)); | |
| 180 for (size_t i = 0; i < resources.size(); ++i) { | |
| 181 const WebPageSerializer::Resource& resource = resources[i]; | |
| 182 if (resource.url == webURL && !resource.data.isEmpty() && !resource.
mimeType.compare(WebCString(mimeType))) | |
| 183 return true; | |
| 184 } | |
| 185 return false; | |
| 186 } | |
| 187 | |
| 188 WebView* m_webView; | |
| 189 | |
| 190 private: | |
| 191 WebString m_htmlMimeType; | |
| 192 WebString m_xhtmlMimeType; | |
| 193 WebString m_cssMimeType; | |
| 194 WebString m_pngMimeType; | |
| 195 WebString m_svgMimeType; | |
| 196 TestWebFrameClient m_webFrameClient; | |
| 197 WebFrame* m_mainFrame; | |
| 198 }; | |
| 199 | |
| 200 // Tests that a page with resources and sub-frame is reported with all its resou
rces. | |
| 201 TEST_F(WebPageNewSerializeTest, PageWithFrames) | |
| 202 { | |
| 203 // Register the mocked frames. | |
| 204 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 205 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("top_frame.html"), We
bString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 206 registerMockedURLLoad(toKURL("http://www.test.com/iframe.html"), WebString::
fromUTF8("iframe.html"), WebString::fromUTF8("pageserializer/"), htmlMimeType())
; | |
| 207 registerMockedURLLoad(toKURL("http://www.test.com/iframe2.html"), WebString:
:fromUTF8("iframe2.html"), WebString::fromUTF8("pageserializer/"), htmlMimeType(
)); | |
| 208 registerMockedURLLoad(toKURL("http://www.test.com/red_background.png"), WebS
tring::fromUTF8("red_background.png"), WebString::fromUTF8("pageserializer/"), p
ngMimeType()); | |
| 209 registerMockedURLLoad(toKURL("http://www.test.com/green_background.png"), We
bString::fromUTF8("green_background.png"), WebString::fromUTF8("pageserializer/"
), pngMimeType()); | |
| 210 registerMockedURLLoad(toKURL("http://www.test.com/blue_background.png"), Web
String::fromUTF8("blue_background.png"), WebString::fromUTF8("pageserializer/"),
pngMimeType()); | |
| 211 | |
| 212 loadURLInTopFrame(topFrameURL); | |
| 213 // OBJECT/EMBED have some delay to start to load their content. The first | |
| 214 // serveAsynchronousMockedRequests call in loadURLInTopFrame() finishes | |
| 215 // before the start. | |
| 216 RefPtr<Document> document = static_cast<PassRefPtr<Document> >(m_webView->ma
inFrame()->document()); | |
| 217 document->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasksS
ynchronously); | |
| 218 Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests(); | |
| 219 | |
| 220 WebVector<WebPageSerializer::Resource> resources; | |
| 221 WebPageSerializer::serialize(m_webView, &resources); | |
| 222 ASSERT_FALSE(resources.isEmpty()); | |
| 223 | |
| 224 // The first resource should be the main-frame. | |
| 225 const WebPageSerializer::Resource& resource = resources[0]; | |
| 226 EXPECT_TRUE(resource.url == WebURL(toKURL("http://www.test.com"))); | |
| 227 EXPECT_EQ(0, resource.mimeType.compare(WebCString("text/html"))); | |
| 228 EXPECT_FALSE(resource.data.isEmpty()); | |
| 229 | |
| 230 EXPECT_EQ(6U, resources.size()); // There should be no duplicates. | |
| 231 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/red_backg
round.png", "image/png")); | |
| 232 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/green_bac
kground.png", "image/png")); | |
| 233 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/blue_back
ground.png", "image/png")); | |
| 234 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/iframe.ht
ml", "text/html")); | |
| 235 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/iframe2.h
tml", "text/html")); | |
| 236 } | |
| 237 | |
| 238 // Test that when serializing a page, all CSS resources are reported, including
url()'s | |
| 239 // and imports and links. Note that we don't test the resources contents, we onl
y make sure | |
| 240 // they are all reported with the right mime type and that they contain some dat
a. | |
| 241 TEST_F(WebPageNewSerializeTest, FAILS_CSSResources) | |
| 242 { | |
| 243 // Register the mocked frame and load it. | |
| 244 WebURL topFrameURL = setUpCSSTestPage(); | |
| 245 loadURLInTopFrame(topFrameURL); | |
| 246 | |
| 247 WebVector<WebPageSerializer::Resource> resources; | |
| 248 WebPageSerializer::serialize(m_webView, &resources); | |
| 249 ASSERT_FALSE(resources.isEmpty()); | |
| 250 | |
| 251 // The first resource should be the main-frame. | |
| 252 const WebPageSerializer::Resource& resource = resources[0]; | |
| 253 EXPECT_TRUE(resource.url == WebURL(toKURL("http://www.test.com"))); | |
| 254 EXPECT_EQ(0, resource.mimeType.compare(WebCString("text/html"))); | |
| 255 EXPECT_FALSE(resource.data.isEmpty()); | |
| 256 | |
| 257 EXPECT_EQ(12U, resources.size()); // There should be no duplicates. | |
| 258 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/link_styl
es.css", "text/css")); | |
| 259 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/import_st
yles.css", "text/css")); | |
| 260 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/import_st
yle_from_link.css", "text/css")); | |
| 261 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/red_backg
round.png", "image/png")); | |
| 262 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/orange_ba
ckground.png", "image/png")); | |
| 263 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/yellow_ba
ckground.png", "image/png")); | |
| 264 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/green_bac
kground.png", "image/png")); | |
| 265 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/blue_back
ground.png", "image/png")); | |
| 266 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/purple_ba
ckground.png", "image/png")); | |
| 267 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/ul-dot.pn
g", "image/png")); | |
| 268 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/ol-dot.pn
g", "image/png")); | |
| 269 } | |
| 270 | |
| 271 // Tests that when serializing a page with blank frames these are reported with
their resources. | |
| 272 TEST_F(WebPageNewSerializeTest, BlankFrames) | |
| 273 { | |
| 274 // Register the mocked frame and load it. | |
| 275 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 276 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("blank_frames.html"),
WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 277 registerMockedURLLoad(toKURL("http://www.test.com/red_background.png"), WebS
tring::fromUTF8("red_background.png"), WebString::fromUTF8("pageserializer/"), p
ngMimeType()); | |
| 278 registerMockedURLLoad(toKURL("http://www.test.com/orange_background.png"), W
ebString::fromUTF8("orange_background.png"), WebString::fromUTF8("pageserializer
/"), pngMimeType()); | |
| 279 registerMockedURLLoad(toKURL("http://www.test.com/blue_background.png"), Web
String::fromUTF8("blue_background.png"), WebString::fromUTF8("pageserializer/"),
pngMimeType()); | |
| 280 | |
| 281 loadURLInTopFrame(topFrameURL); | |
| 282 | |
| 283 WebVector<WebPageSerializer::Resource> resources; | |
| 284 WebPageSerializer::serialize(m_webView, &resources); | |
| 285 ASSERT_FALSE(resources.isEmpty()); | |
| 286 | |
| 287 // The first resource should be the main-frame. | |
| 288 const WebPageSerializer::Resource& resource = resources[0]; | |
| 289 EXPECT_TRUE(resource.url == WebURL(toKURL("http://www.test.com"))); | |
| 290 EXPECT_EQ(0, resource.mimeType.compare(WebCString("text/html"))); | |
| 291 EXPECT_FALSE(resource.data.isEmpty()); | |
| 292 | |
| 293 EXPECT_EQ(7U, resources.size()); // There should be no duplicates. | |
| 294 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/red_backg
round.png", "image/png")); | |
| 295 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/orange_ba
ckground.png", "image/png")); | |
| 296 EXPECT_TRUE(resourceVectorContains(resources, "http://www.test.com/blue_back
ground.png", "image/png")); | |
| 297 // The blank frames should have got a magic URL. | |
| 298 EXPECT_TRUE(resourceVectorContains(resources, "wyciwyg://frame/0", "text/htm
l")); | |
| 299 EXPECT_TRUE(resourceVectorContains(resources, "wyciwyg://frame/1", "text/htm
l")); | |
| 300 EXPECT_TRUE(resourceVectorContains(resources, "wyciwyg://frame/2", "text/htm
l")); | |
| 301 } | |
| 302 | |
| 303 TEST_F(WebPageNewSerializeTest, SerializeXMLHasRightDeclaration) | |
| 304 { | |
| 305 WebURL topFrameURL = toKURL("http://www.test.com/simple.xhtml"); | |
| 306 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("simple.xhtml"), WebS
tring::fromUTF8("pageserializer/"), xhtmlMimeType()); | |
| 307 | |
| 308 loadURLInTopFrame(topFrameURL); | |
| 309 | |
| 310 WebVector<WebPageSerializer::Resource> resources; | |
| 311 WebPageSerializer::serialize(m_webView, &resources); | |
| 312 ASSERT_FALSE(resources.isEmpty()); | |
| 313 | |
| 314 // We expect only one resource, the XML. | |
| 315 ASSERT_EQ(1U, resources.size()); | |
| 316 std::string xml = std::string(resources[0].data.data()); | |
| 317 | |
| 318 // We should have one and only one instance of the XML declaration. | |
| 319 size_t pos = xml.find("<?xml version="); | |
| 320 ASSERT_TRUE(pos != std::string::npos); | |
| 321 | |
| 322 pos = xml.find("<?xml version=", pos + 1); | |
| 323 ASSERT_TRUE(pos == std::string::npos); | |
| 324 } | |
| 325 | |
| 326 TEST_F(WebPageNewSerializeTest, FAILS_TestMHTMLEncoding) | |
| 327 { | |
| 328 // Load a page with some CSS and some images. | |
| 329 WebURL topFrameURL = setUpCSSTestPage(); | |
| 330 loadURLInTopFrame(topFrameURL); | |
| 331 | |
| 332 WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView); | |
| 333 ASSERT_FALSE(mhtmlData.isEmpty()); | |
| 334 | |
| 335 // Read the MHTML data line per line and do some pseudo-parsing to make sure
the right encoding is used for the different sections. | |
| 336 LineReader lineReader(std::string(mhtmlData.data())); | |
| 337 int sectionCheckedCount = 0; | |
| 338 const char* expectedEncoding = 0; | |
| 339 std::string line; | |
| 340 while (lineReader.getNextLine(&line)) { | |
| 341 if (!line.find("Content-Type:")) { | |
| 342 ASSERT_FALSE(expectedEncoding); | |
| 343 if (line.find("multipart/related;") != std::string::npos) { | |
| 344 // Skip this one, it's part of the MHTML header. | |
| 345 continue; | |
| 346 } | |
| 347 if (line.find("text/") != std::string::npos) | |
| 348 expectedEncoding = "quoted-printable"; | |
| 349 else if (line.find("image/") != std::string::npos) | |
| 350 expectedEncoding = "base64"; | |
| 351 else | |
| 352 FAIL() << "Unexpected Content-Type: " << line; | |
| 353 continue; | |
| 354 } | |
| 355 if (!line.find("Content-Transfer-Encoding:")) { | |
| 356 ASSERT_TRUE(expectedEncoding); | |
| 357 EXPECT_TRUE(line.find(expectedEncoding) != std::string::npos); | |
| 358 expectedEncoding = 0; | |
| 359 sectionCheckedCount++; | |
| 360 } | |
| 361 } | |
| 362 EXPECT_EQ(12, sectionCheckedCount); | |
| 363 } | |
| 364 | |
| 365 // Test that we don't regress https://bugs.webkit.org/show_bug.cgi?id=99105 | |
| 366 TEST_F(WebPageNewSerializeTest, SVGImageDontCrash) | |
| 367 { | |
| 368 WebURL pageUrl = toKURL("http://www.test.com"); | |
| 369 WebURL imageUrl = toKURL("http://www.test.com/green_rectangle.svg"); | |
| 370 | |
| 371 registerMockedURLLoad(pageUrl, WebString::fromUTF8("page_with_svg_image.html
"), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 372 registerMockedURLLoad(imageUrl, WebString::fromUTF8("green_rectangle.svg"),
WebString::fromUTF8("pageserializer/"), svgMimeType()); | |
| 373 | |
| 374 loadURLInTopFrame(pageUrl); | |
| 375 | |
| 376 WebCString mhtml = WebPageSerializer::serializeToMHTML(m_webView); | |
| 377 // We expect some data to be generated. | |
| 378 EXPECT_GT(mhtml.length(), 50U); | |
| 379 } | |
| 380 | |
| 381 TEST_F(WebPageNewSerializeTest, NamespaceElementsDontCrash) | |
| 382 { | |
| 383 WebURL pageUrl = toKURL("http://www.test.com"); | |
| 384 registerMockedURLLoad(pageUrl, WebString::fromUTF8("namespace_element.html")
, WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 385 | |
| 386 loadURLInTopFrame(pageUrl); | |
| 387 | |
| 388 WebVector<WebURL> localLinks(static_cast<size_t>(1)); | |
| 389 WebVector<WebString> localPaths(static_cast<size_t>(1)); | |
| 390 localLinks[0] = pageUrl; | |
| 391 localPaths[0] = WebString("/"); | |
| 392 | |
| 393 size_t counter = 0; | |
| 394 LengthCountingWebPageSerializerClient client(&counter); | |
| 395 | |
| 396 // We just want to make sure nothing crazy happens, namely that no | |
| 397 // assertions are hit. As a sanity check, we also make sure that some data | |
| 398 // was returned. | |
| 399 WebPageSerializer::serialize(m_webView->mainFrame(), true, &client, localLin
ks, localPaths, WebString("")); | |
| 400 | |
| 401 EXPECT_GT(counter, 0U); | |
| 402 } | |
| 403 | |
| 404 } | |
| 405 | |
| 406 TEST_F(WebPageNewSerializeTest, TestMHTMLEncodingWithDataURL) | |
| 407 { | |
| 408 // Load a page with some data urls. | |
| 409 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 410 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("page_with_data.html"
), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 411 loadURLInTopFrame(topFrameURL); | |
| 412 | |
| 413 WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView); | |
| 414 ASSERT_FALSE(mhtmlData.isEmpty()); | |
| 415 | |
| 416 // Read the MHTML data line and check that the string data:image is found | |
| 417 // exactly one time. | |
| 418 size_t nbDataURLs = 0; | |
| 419 LineReader lineReader(std::string(mhtmlData.data())); | |
| 420 std::string line; | |
| 421 while (lineReader.getNextLine(&line)) { | |
| 422 if (line.find("data:image") != std::string::npos) | |
| 423 nbDataURLs++; | |
| 424 } | |
| 425 EXPECT_EQ(1u, nbDataURLs); | |
| 426 } | |
| 427 | |
| 428 | |
| 429 TEST_F(WebPageNewSerializeTest, TestMHTMLEncodingWithMorphingDataURL) | |
| 430 { | |
| 431 // Load a page with some data urls. | |
| 432 WebURL topFrameURL = toKURL("http://www.test.com"); | |
| 433 registerMockedURLLoad(topFrameURL, WebString::fromUTF8("page_with_morphing_d
ata.html"), WebString::fromUTF8("pageserializer/"), htmlMimeType()); | |
| 434 loadURLInTopFrame(topFrameURL); | |
| 435 | |
| 436 WebCString mhtmlData = WebPageSerializer::serializeToMHTML(m_webView); | |
| 437 ASSERT_FALSE(mhtmlData.isEmpty()); | |
| 438 | |
| 439 // Read the MHTML data line and check that the string data:image is found | |
| 440 // exactly two times. | |
| 441 size_t nbDataURLs = 0; | |
| 442 LineReader lineReader(std::string(mhtmlData.data())); | |
| 443 std::string line; | |
| 444 while (lineReader.getNextLine(&line)) { | |
| 445 if (line.find("data:text") != std::string::npos) | |
| 446 nbDataURLs++; | |
| 447 } | |
| 448 EXPECT_EQ(2u, nbDataURLs); | |
| 449 } | |
| OLD | NEW |