| Index: third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp
|
| index e4e4606f31fec1ac9c406a9fcf1827353ee5e9c5..c6cc94d6beebf5cd55289146327c85b912e787d0 100644
|
| --- a/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp
|
| +++ b/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp
|
| @@ -1,5 +1,5 @@
|
| /*
|
| - * Copyright (C) 2011 Google Inc. All rights reserved.
|
| + * Copyright (C) 2017 Google Inc. All rights reserved.
|
| *
|
| * Redistribution and use in source and binary forms, with or without
|
| * modification, are permitted provided that the following conditions are
|
| @@ -31,16 +31,12 @@
|
| #include "public/web/WebFrameSerializer.h"
|
|
|
| #include "core/exported/WebViewBase.h"
|
| -#include "platform/mhtml/MHTMLArchive.h"
|
| -#include "platform/mhtml/MHTMLParser.h"
|
| -#include "platform/testing/HistogramTester.h"
|
| #include "platform/testing/URLTestHelpers.h"
|
| #include "platform/testing/UnitTestHelpers.h"
|
| #include "platform/weborigin/KURL.h"
|
| #include "platform/wtf/text/StringBuilder.h"
|
| #include "public/platform/Platform.h"
|
| #include "public/platform/WebCString.h"
|
| -#include "public/platform/WebCache.h"
|
| #include "public/platform/WebString.h"
|
| #include "public/platform/WebURL.h"
|
| #include "public/platform/WebURLLoaderMockFactory.h"
|
| @@ -52,6 +48,7 @@
|
| namespace blink {
|
|
|
| namespace {
|
| +
|
| class SimpleWebFrameSerializerClient final : public WebFrameSerializerClient {
|
| public:
|
| String ToString() { return builder_.ToString(); }
|
| @@ -65,44 +62,6 @@ class SimpleWebFrameSerializerClient final : public WebFrameSerializerClient {
|
| StringBuilder builder_;
|
| };
|
|
|
| -class SimpleMHTMLPartsGenerationDelegate
|
| - : public WebFrameSerializer::MHTMLPartsGenerationDelegate {
|
| - public:
|
| - SimpleMHTMLPartsGenerationDelegate() : remove_popup_overlay_(false) {}
|
| -
|
| - void SetRemovePopupOverlay(bool remove_popup_overlay) {
|
| - remove_popup_overlay_ = remove_popup_overlay;
|
| - }
|
| -
|
| - private:
|
| - bool ShouldSkipResource(const WebURL&) final { return false; }
|
| -
|
| - WebString GetContentID(WebFrame*) final { return WebString("<cid>"); }
|
| -
|
| - WebFrameSerializerCacheControlPolicy CacheControlPolicy() final {
|
| - return WebFrameSerializerCacheControlPolicy::kNone;
|
| - }
|
| -
|
| - bool UseBinaryEncoding() final { return false; }
|
| - bool RemovePopupOverlay() final { return remove_popup_overlay_; }
|
| -
|
| - bool remove_popup_overlay_;
|
| -};
|
| -
|
| -// Returns the count of match for substring |pattern| in string |str|.
|
| -int MatchSubstring(const String& str, const char* pattern, size_t size) {
|
| - int matches = 0;
|
| - size_t start = 0;
|
| - while (true) {
|
| - size_t pos = str.Find(pattern, start);
|
| - if (pos == WTF::kNotFound)
|
| - break;
|
| - matches++;
|
| - start = pos + size;
|
| - }
|
| - return matches;
|
| -}
|
| -
|
| } // namespace
|
|
|
| class WebFrameSerializerTest : public ::testing::Test {
|
| @@ -121,6 +80,7 @@ class WebFrameSerializerTest : public ::testing::Test {
|
| RegisterMockedFileURLLoad(URLTestHelpers::ToKURL(url.Utf8().data()),
|
| "frameserialization/awesome.png");
|
| }
|
| +
|
| void RegisterMockedFileURLLoad(const KURL& url,
|
| const String& file_path,
|
| const String& mime_type = "image/png") {
|
| @@ -164,8 +124,6 @@ class WebFrameSerializerTest : public ::testing::Test {
|
| return serializer_client.ToString();
|
| }
|
|
|
| - WebViewBase* WebView() { return helper_.WebView(); }
|
| -
|
| WebLocalFrameImpl* MainFrameImpl() {
|
| return helper_.WebView()->MainFrameImpl();
|
| }
|
| @@ -215,243 +173,4 @@ TEST_F(WebFrameSerializerTest, FromUrlWithMinusMinus) {
|
| actual_html.Substring(1, 60));
|
| }
|
|
|
| -class WebFrameSerializerSanitizationTest : public WebFrameSerializerTest {
|
| - protected:
|
| - WebFrameSerializerSanitizationTest() {}
|
| -
|
| - ~WebFrameSerializerSanitizationTest() override {}
|
| -
|
| - String GenerateMHTMLFromHtml(const String& url, const String& file_name) {
|
| - return GenerateMHTML(url, file_name, "text/html", false);
|
| - }
|
| -
|
| - String GenerateMHTMLPartsFromPng(const String& url, const String& file_name) {
|
| - return GenerateMHTML(url, file_name, "image/png", true);
|
| - }
|
| -
|
| - String GenerateMHTML(const String& url,
|
| - const String& file_name,
|
| - const String& mime_type,
|
| - const bool only_body_parts) {
|
| - KURL parsed_url(kParsedURLString, url);
|
| - String file_path("frameserialization/" + file_name);
|
| - RegisterMockedFileURLLoad(parsed_url, file_path, mime_type);
|
| - FrameTestHelpers::LoadFrame(MainFrameImpl(), url.Utf8().data());
|
| - // Boundaries are normally randomly generated but this one is predefined for
|
| - // simplicity and as good as any other. Plus it gets used in almost all the
|
| - // examples in the MHTML spec - RFC 2557.
|
| - const WebString boundary("boundary-example");
|
| - StringBuilder mhtml;
|
| - if (!only_body_parts) {
|
| - WebThreadSafeData header_result = WebFrameSerializer::GenerateMHTMLHeader(
|
| - boundary, MainFrameImpl(), &mhtml_delegate_);
|
| - mhtml.Append(header_result.Data(), header_result.size());
|
| - }
|
| -
|
| - WebThreadSafeData body_result = WebFrameSerializer::GenerateMHTMLParts(
|
| - boundary, MainFrameImpl(), &mhtml_delegate_);
|
| - mhtml.Append(body_result.Data(), body_result.size());
|
| -
|
| - if (!only_body_parts) {
|
| - RefPtr<RawData> footer_data = RawData::Create();
|
| - MHTMLArchive::GenerateMHTMLFooterForTesting(boundary,
|
| - *footer_data->MutableData());
|
| - mhtml.Append(footer_data->data(), footer_data->length());
|
| - }
|
| -
|
| - String mhtml_string = mhtml.ToString();
|
| - if (!only_body_parts) {
|
| - // Validate the generated MHTML.
|
| - MHTMLParser parser(SharedBuffer::Create(mhtml_string.Characters8(),
|
| - size_t(mhtml_string.length())));
|
| - EXPECT_FALSE(parser.ParseArchive().IsEmpty())
|
| - << "Generated MHTML is not well formed";
|
| - }
|
| - return mhtml_string;
|
| - }
|
| -
|
| - void SetRemovePopupOverlay(bool remove_popup_overlay) {
|
| - mhtml_delegate_.SetRemovePopupOverlay(remove_popup_overlay);
|
| - }
|
| -
|
| - protected:
|
| - HistogramTester histogram_tester_;
|
| -
|
| - private:
|
| - SimpleMHTMLPartsGenerationDelegate mhtml_delegate_;
|
| -};
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, RemoveInlineScriptInAttributes) {
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "script_in_attributes.html");
|
| -
|
| - // These scripting attributes should be removed.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("onload="));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("ONLOAD="));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("onclick="));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("href="));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("from="));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("to="));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("javascript:"));
|
| -
|
| - // These non-scripting attributes should remain intact.
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("class="));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("id="));
|
| -
|
| - // srcdoc attribute of frame element should be replaced with src attribute.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("srcdoc="));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("src="));
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, RemoveOtherAttributes) {
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "remove_attributes.html");
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("ping="));
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, DisableFormElements) {
|
| - String mhtml = GenerateMHTMLFromHtml("http://www.test.com", "form.html");
|
| -
|
| - const char kDisabledAttr[] = "disabled=3D\"\"";
|
| - int matches =
|
| - MatchSubstring(mhtml, kDisabledAttr, arraysize(kDisabledAttr) - 1);
|
| - EXPECT_EQ(21, matches);
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, RemoveHiddenElements) {
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "hidden_elements.html");
|
| -
|
| - // The element with hidden attribute should be removed.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("<p id=3D\"hidden_id\""));
|
| -
|
| - // The hidden form element should be removed.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("<input type=3D\"hidden\""));
|
| -
|
| - // All other hidden elements should not be removed.
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<html"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<head"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<style"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<title"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<h1"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<h2"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<datalist"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<option"));
|
| - // One for meta in head and another for meta in body.
|
| - EXPECT_EQ(2, MatchSubstring(mhtml, "<meta", 5));
|
| - // One for style in head and another for style in body.
|
| - EXPECT_EQ(2, MatchSubstring(mhtml, "<style", 6));
|
| - // One for link in head and another for link in body.
|
| - EXPECT_EQ(2, MatchSubstring(mhtml, "<link", 5));
|
| -
|
| - // These visible elements should remain intact.
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<p id=3D\"visible_id\""));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<form"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<input type=3D\"text\""));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<div"));
|
| -}
|
| -
|
| -// Regression test for crbug.com/678893, where in some cases serializing an
|
| -// image document could cause code to pick an element from an empty container.
|
| -TEST_F(WebFrameSerializerSanitizationTest, FromBrokenImageDocument) {
|
| - // This test only cares that the result of the parts generation is empty so it
|
| - // is simpler to not generate only that instead of the full MHTML.
|
| - String mhtml =
|
| - GenerateMHTMLPartsFromPng("http://www.test.com", "broken-image.png");
|
| - EXPECT_TRUE(mhtml.IsEmpty());
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, ImageLoadedFromSrcsetForHiDPI) {
|
| - RegisterMockedFileURLLoad(
|
| - KURL(kParsedURLString, "http://www.test.com/1x.png"),
|
| - "frameserialization/1x.png");
|
| - RegisterMockedFileURLLoad(
|
| - KURL(kParsedURLString, "http://www.test.com/2x.png"),
|
| - "frameserialization/2x.png");
|
| -
|
| - // Set high DPR in order to load image from srcset, instead of src.
|
| - WebView()->SetDeviceScaleFactor(2.0f);
|
| -
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "img_srcset.html");
|
| -
|
| - // srcset attribute should be skipped.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("srcset="));
|
| -
|
| - // Width and height attributes should be set when none is present in <img>.
|
| - EXPECT_NE(WTF::kNotFound,
|
| - mhtml.Find("id=3D\"i1\" width=3D\"6\" height=3D\"6\">"));
|
| -
|
| - // Height attribute should not be set if width attribute is already present in
|
| - // <img>
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("id=3D\"i2\" width=3D\"8\">"));
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, ImageLoadedFromSrcForNormalDPI) {
|
| - RegisterMockedFileURLLoad(
|
| - KURL(kParsedURLString, "http://www.test.com/1x.png"),
|
| - "frameserialization/1x.png");
|
| - RegisterMockedFileURLLoad(
|
| - KURL(kParsedURLString, "http://www.test.com/2x.png"),
|
| - "frameserialization/2x.png");
|
| -
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "img_srcset.html");
|
| -
|
| - // srcset attribute should be skipped.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("srcset="));
|
| -
|
| - // New width and height attributes should not be set.
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("id=3D\"i1\">"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("id=3D\"i2\" width=3D\"8\">"));
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, RemovePopupOverlayIfRequested) {
|
| - WebView()->Resize(WebSize(500, 500));
|
| - SetRemovePopupOverlay(true);
|
| - String mhtml = GenerateMHTMLFromHtml("http://www.test.com", "popup.html");
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("class=3D\"overlay"));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("class=3D\"modal"));
|
| - histogram_tester_.ExpectUniqueSample(
|
| - "PageSerialization.MhtmlGeneration.PopupOverlaySkipped", true, 1);
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, PopupOverlayNotFound) {
|
| - WebView()->Resize(WebSize(500, 500));
|
| - SetRemovePopupOverlay(true);
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "text_only_page.html");
|
| - histogram_tester_.ExpectUniqueSample(
|
| - "PageSerialization.MhtmlGeneration.PopupOverlaySkipped", false, 1);
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, KeepPopupOverlayIfNotRequested) {
|
| - WebView()->Resize(WebSize(500, 500));
|
| - SetRemovePopupOverlay(false);
|
| - String mhtml = GenerateMHTMLFromHtml("http://www.test.com", "popup.html");
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("class=3D\"overlay"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("class=3D\"modal"));
|
| - histogram_tester_.ExpectTotalCount(
|
| - "PageSerialization.MhtmlGeneration.PopupOverlaySkipped", 0);
|
| -}
|
| -
|
| -TEST_F(WebFrameSerializerSanitizationTest, RemoveElements) {
|
| - String mhtml =
|
| - GenerateMHTMLFromHtml("http://www.test.com", "remove_elements.html");
|
| -
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("<script"));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("<noscript"));
|
| -
|
| - // Only the meta element containing "Content-Security-Policy" is removed.
|
| - // Other meta elements should be preserved.
|
| - EXPECT_EQ(WTF::kNotFound,
|
| - mhtml.Find("<meta http-equiv=3D\"Content-Security-Policy"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<meta name=3D\"description"));
|
| - EXPECT_NE(WTF::kNotFound, mhtml.Find("<meta http-equiv=3D\"refresh"));
|
| -
|
| - // If an element is removed, its children should also be skipped.
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("<select"));
|
| - EXPECT_EQ(WTF::kNotFound, mhtml.Find("<option"));
|
| -}
|
| -
|
| } // namespace blink
|
|
|