1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef URL_GURL_ABSTRACT_TESTS_H_
6*6777b538SAndroid Build Coastguard Worker #define URL_GURL_ABSTRACT_TESTS_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker // Test suite for tests that cover both url::Url and blink::SecurityUrl.
9*6777b538SAndroid Build Coastguard Worker //
10*6777b538SAndroid Build Coastguard Worker // AbstractUrlTest below abstracts away differences between GURL and blink::KURL
11*6777b538SAndroid Build Coastguard Worker // by parametrizing the tests with a class that has to expose the following
12*6777b538SAndroid Build Coastguard Worker // members:
13*6777b538SAndroid Build Coastguard Worker // using UrlType = ...;
14*6777b538SAndroid Build Coastguard Worker // static UrlType CreateUrlFromString(std::string_view s);
15*6777b538SAndroid Build Coastguard Worker // static bool IsAboutBlank(const UrlType& url);
16*6777b538SAndroid Build Coastguard Worker // static bool IsAboutSrcdoc(const UrlType& url);
17*6777b538SAndroid Build Coastguard Worker template <typename TUrlTraits>
18*6777b538SAndroid Build Coastguard Worker class AbstractUrlTest : public testing::Test {
19*6777b538SAndroid Build Coastguard Worker protected:
20*6777b538SAndroid Build Coastguard Worker // Wrappers that help ellide away TUrlTraits.
21*6777b538SAndroid Build Coastguard Worker //
22*6777b538SAndroid Build Coastguard Worker // Note that calling the wrappers needs to be prefixed with `this->...` to
23*6777b538SAndroid Build Coastguard Worker // avoid hitting: explicit qualification required to use member 'IsAboutBlank'
24*6777b538SAndroid Build Coastguard Worker // from dependent base class.
25*6777b538SAndroid Build Coastguard Worker using UrlType = typename TUrlTraits::UrlType;
CreateUrlFromString(std::string_view s)26*6777b538SAndroid Build Coastguard Worker UrlType CreateUrlFromString(std::string_view s) {
27*6777b538SAndroid Build Coastguard Worker return TUrlTraits::CreateUrlFromString(s);
28*6777b538SAndroid Build Coastguard Worker }
IsAboutBlank(const UrlType & url)29*6777b538SAndroid Build Coastguard Worker bool IsAboutBlank(const UrlType& url) {
30*6777b538SAndroid Build Coastguard Worker return TUrlTraits::IsAboutBlank(url);
31*6777b538SAndroid Build Coastguard Worker }
IsAboutSrcdoc(const UrlType & url)32*6777b538SAndroid Build Coastguard Worker bool IsAboutSrcdoc(const UrlType& url) {
33*6777b538SAndroid Build Coastguard Worker return TUrlTraits::IsAboutSrcdoc(url);
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker };
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AbstractUrlTest);
38*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(AbstractUrlTest,IsAboutBlankTest)39*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(AbstractUrlTest, IsAboutBlankTest) {
40*6777b538SAndroid Build Coastguard Worker // See https://tools.ietf.org/html/rfc6694 which explicitly allows
41*6777b538SAndroid Build Coastguard Worker // `about-query` and `about-fragment` parts in about: URLs.
42*6777b538SAndroid Build Coastguard Worker const std::string kAboutBlankUrls[] = {"about:blank", "about:blank?foo",
43*6777b538SAndroid Build Coastguard Worker "about:blank/#foo",
44*6777b538SAndroid Build Coastguard Worker "about:blank?foo#foo"};
45*6777b538SAndroid Build Coastguard Worker for (const auto& input : kAboutBlankUrls) {
46*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "Test input: " << input);
47*6777b538SAndroid Build Coastguard Worker auto url = this->CreateUrlFromString(input);
48*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(this->IsAboutBlank(url));
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker const std::string kNotAboutBlankUrls[] = {"",
52*6777b538SAndroid Build Coastguard Worker "about",
53*6777b538SAndroid Build Coastguard Worker "about:",
54*6777b538SAndroid Build Coastguard Worker "about:blanky",
55*6777b538SAndroid Build Coastguard Worker "about:blan",
56*6777b538SAndroid Build Coastguard Worker "about:about:blank:",
57*6777b538SAndroid Build Coastguard Worker "data:blank",
58*6777b538SAndroid Build Coastguard Worker "http:blank",
59*6777b538SAndroid Build Coastguard Worker "about://blank",
60*6777b538SAndroid Build Coastguard Worker "about:blank/foo",
61*6777b538SAndroid Build Coastguard Worker "about://:8000/blank",
62*6777b538SAndroid Build Coastguard Worker "about://foo:foo@/blank",
63*6777b538SAndroid Build Coastguard Worker "foo@about:blank",
64*6777b538SAndroid Build Coastguard Worker "foo:bar@about:blank",
65*6777b538SAndroid Build Coastguard Worker "about:blank:8000",
66*6777b538SAndroid Build Coastguard Worker "about:blANk"};
67*6777b538SAndroid Build Coastguard Worker for (const auto& input : kNotAboutBlankUrls) {
68*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "Test input: " << input);
69*6777b538SAndroid Build Coastguard Worker auto url = this->CreateUrlFromString(input);
70*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(this->IsAboutBlank(url));
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(AbstractUrlTest,IsAboutSrcdocTest)74*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(AbstractUrlTest, IsAboutSrcdocTest) {
75*6777b538SAndroid Build Coastguard Worker // See https://tools.ietf.org/html/rfc6694 which explicitly allows
76*6777b538SAndroid Build Coastguard Worker // `about-query` and `about-fragment` parts in about: URLs.
77*6777b538SAndroid Build Coastguard Worker //
78*6777b538SAndroid Build Coastguard Worker // `about:srcdoc` is defined in
79*6777b538SAndroid Build Coastguard Worker // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#about:srcdoc
80*6777b538SAndroid Build Coastguard Worker // which refers to rfc6694 for details.
81*6777b538SAndroid Build Coastguard Worker const std::string kAboutSrcdocUrls[] = {
82*6777b538SAndroid Build Coastguard Worker "about:srcdoc", "about:srcdoc/", "about:srcdoc?foo", "about:srcdoc/#foo",
83*6777b538SAndroid Build Coastguard Worker "about:srcdoc?foo#foo"};
84*6777b538SAndroid Build Coastguard Worker for (const auto& input : kAboutSrcdocUrls) {
85*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "Test input: " << input);
86*6777b538SAndroid Build Coastguard Worker auto url = this->CreateUrlFromString(input);
87*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(this->IsAboutSrcdoc(url));
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker const std::string kNotAboutSrcdocUrls[] = {"",
91*6777b538SAndroid Build Coastguard Worker "about",
92*6777b538SAndroid Build Coastguard Worker "about:",
93*6777b538SAndroid Build Coastguard Worker "about:srcdocx",
94*6777b538SAndroid Build Coastguard Worker "about:srcdo",
95*6777b538SAndroid Build Coastguard Worker "about:about:srcdoc:",
96*6777b538SAndroid Build Coastguard Worker "data:srcdoc",
97*6777b538SAndroid Build Coastguard Worker "http:srcdoc",
98*6777b538SAndroid Build Coastguard Worker "about:srcdo",
99*6777b538SAndroid Build Coastguard Worker "about://srcdoc",
100*6777b538SAndroid Build Coastguard Worker "about://srcdoc\\",
101*6777b538SAndroid Build Coastguard Worker "about:srcdoc/foo",
102*6777b538SAndroid Build Coastguard Worker "about://:8000/srcdoc",
103*6777b538SAndroid Build Coastguard Worker "about://foo:foo@/srcdoc",
104*6777b538SAndroid Build Coastguard Worker "foo@about:srcdoc",
105*6777b538SAndroid Build Coastguard Worker "foo:bar@about:srcdoc",
106*6777b538SAndroid Build Coastguard Worker "about:srcdoc:8000",
107*6777b538SAndroid Build Coastguard Worker "about:srCDOc"};
108*6777b538SAndroid Build Coastguard Worker for (const auto& input : kNotAboutSrcdocUrls) {
109*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "Test input: " << input);
110*6777b538SAndroid Build Coastguard Worker auto url = this->CreateUrlFromString(input);
111*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(this->IsAboutSrcdoc(url));
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker
115*6777b538SAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AbstractUrlTest,
116*6777b538SAndroid Build Coastguard Worker IsAboutBlankTest,
117*6777b538SAndroid Build Coastguard Worker IsAboutSrcdocTest);
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker #endif // URL_GURL_ABSTRACT_TESTS_H_
120