Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Unified Diff: third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp

Issue 2858873007: Split WebFrameSerializerSanitizationTest into its own file. (Closed)
Patch Set: Rebase. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/web/tests/WebFrameSerializerSanitizationTest.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « third_party/WebKit/Source/web/tests/WebFrameSerializerSanitizationTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698