| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/loader/LinkHeader.h" | 6 #include "core/loader/LinkHeader.h" |
| 7 | 7 |
| 8 #include <base/macros.h> | 8 #include <base/macros.h> |
| 9 #include <gtest/gtest.h> | 9 #include <gtest/gtest.h> |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 {"< /images/cat.jpg>", "/images/cat.jpg", "", true}, | 50 {"< /images/cat.jpg>", "/images/cat.jpg", "", true}, |
| 51 {"</images/cat.jpg>; rel =", "/images/cat.jpg", "", false}, | 51 {"</images/cat.jpg>; rel =", "/images/cat.jpg", "", false}, |
| 52 {"</images/cat.jpg>; wut=sup; rel =prefetch", "/images/cat.jpg", "prefet
ch", true}, | 52 {"</images/cat.jpg>; wut=sup; rel =prefetch", "/images/cat.jpg", "prefet
ch", true}, |
| 53 {"</images/cat.jpg>; wut=sup ; rel =prefetch", "/images/cat.jpg", "prefe
tch", true}, | 53 {"</images/cat.jpg>; wut=sup ; rel =prefetch", "/images/cat.jpg", "prefe
tch", true}, |
| 54 {"</images/cat.jpg>; wut=sup ; rel =prefetch \t ;", "/images/cat.jpg",
"prefetch", true}, | 54 {"</images/cat.jpg>; wut=sup ; rel =prefetch \t ;", "/images/cat.jpg",
"prefetch", true}, |
| 55 {"</images/cat.jpg> wut=sup ; rel =prefetch \t ;", "/images/cat.jpg",
"", false}, | 55 {"</images/cat.jpg> wut=sup ; rel =prefetch \t ;", "/images/cat.jpg",
"", false}, |
| 56 {"< /images/cat.jpg", "", "", false}, | 56 {"< /images/cat.jpg", "", "", false}, |
| 57 {"< http://wut.com/ sdfsdf ?sd>; rel=dns-prefetch", "http://wut.com/"
, "dns-prefetch", true}, | 57 {"< http://wut.com/ sdfsdf ?sd>; rel=dns-prefetch", "http://wut.com/"
, "dns-prefetch", true}, |
| 58 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=dns-prefetch", "http://wut
.com/%20%20%3dsdfsdf?sd", "dns-prefetch", true}, | 58 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=dns-prefetch", "http://wut
.com/%20%20%3dsdfsdf?sd", "dns-prefetch", true}, |
| 59 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>; rel=prefetch", "http://wut.
com/dfsdf?sdf=ghj&wer=rty", "prefetch", true}, | 59 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>; rel=prefetch", "http://wut.
com/dfsdf?sdf=ghj&wer=rty", "prefetch", true}, |
| 60 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>;;;;; rel=prefetch", "http://
wut.com/dfsdf?sdf=ghj&wer=rty", "", false}, | 60 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>;;;;; rel=prefetch", "http://
wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", true}, |
| 61 {"</images/cat.jpg>; anchor=foo; rel=prefetch;", "/images/cat.jpg", "",
false}, | 61 {"</images/cat.jpg>; anchor=foo; rel=prefetch;", "/images/cat.jpg", "",
false}, |
| 62 {"</images/cat.jpg>; rel=prefetch;anchor=foo ", "/images/cat.jpg", "pref
etch", false}, | 62 {"</images/cat.jpg>; rel=prefetch;anchor=foo ", "/images/cat.jpg", "pref
etch", false}, |
| 63 {"</images/cat.jpg>; anchor='foo'; rel=prefetch;", "/images/cat.jpg", ""
, false}, | 63 {"</images/cat.jpg>; anchor='foo'; rel=prefetch;", "/images/cat.jpg", ""
, false}, |
| 64 {"</images/cat.jpg>; rel=prefetch;anchor='foo' ", "/images/cat.jpg", "pr
efetch", false}, | 64 {"</images/cat.jpg>; rel=prefetch;anchor='foo' ", "/images/cat.jpg", "pr
efetch", false}, |
| 65 {"</images/cat.jpg>; rel=prefetch;anchor='' ", "/images/cat.jpg", "prefe
tch", false}, | 65 {"</images/cat.jpg>; rel=prefetch;anchor='' ", "/images/cat.jpg", "prefe
tch", false}, |
| 66 {"</images/cat.jpg>; rel=prefetch;", "/images/cat.jpg", "prefetch", true
}, | 66 {"</images/cat.jpg>; rel=prefetch;", "/images/cat.jpg", "prefetch", true
}, |
| 67 {"</images/cat.jpg>; rel=prefetch ;", "/images/cat.jpg", "prefetch",
true}, | 67 {"</images/cat.jpg>; rel=prefetch ;", "/images/cat.jpg", "prefetch",
true}, |
| 68 {"</images/ca,t.jpg>; rel=prefetch ;", "/images/ca,t.jpg", "prefetch"
, true}, | 68 {"</images/ca,t.jpg>; rel=prefetch ;", "/images/ca,t.jpg", "prefetch"
, true}, |
| 69 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE and backslas
h\"", "simple.css", "stylesheet", true}, | 69 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE and backslas
h\"", "simple.css", "stylesheet", true}, |
| 70 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE \\\" and bac
kslash: \\\"", "simple.css", "stylesheet", false}, | 70 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE \\\" and bac
kslash: \\\"", "simple.css", "stylesheet", false}, |
| 71 {"<simple.css>; title=\"title with a DQUOTE \\\" and backslash: \"; rel=
stylesheet; ", "simple.css", "stylesheet", true}, | 71 {"<simple.css>; title=\"title with a DQUOTE \\\" and backslash: \"; rel=
stylesheet; ", "simple.css", "stylesheet", true}, |
| 72 {"<simple.css>; title=\'title with a DQUOTE \\\' and backslash: \'; rel=
stylesheet; ", "simple.css", "stylesheet", true}, | 72 {"<simple.css>; title=\'title with a DQUOTE \\\' and backslash: \'; rel=
stylesheet; ", "simple.css", "stylesheet", true}, |
| 73 {"<simple.css>; title=\"title with a DQUOTE \\\" and ;backslash,: \"; re
l=stylesheet; ", "simple.css", "stylesheet", true}, | 73 {"<simple.css>; title=\"title with a DQUOTE \\\" and ;backslash,: \"; re
l=stylesheet; ", "simple.css", "stylesheet", true}, |
| 74 {"<simple.css>; title=\"title with a DQUOTE \' and ;backslash,: \"; rel=
stylesheet; ", "simple.css", "stylesheet", true}, | 74 {"<simple.css>; title=\"title with a DQUOTE \' and ;backslash,: \"; rel=
stylesheet; ", "simple.css", "stylesheet", true}, |
| 75 {"<simple.css>; title=\"\"; rel=stylesheet; ", "simple.css", "stylesheet
", true}, | 75 {"<simple.css>; title=\"\"; rel=stylesheet; ", "simple.css", "stylesheet
", true}, |
| 76 {"<simple.css>; title=\"\"; rel=\"stylesheet\"; ", "simple.css", "styles
heet", true}, | 76 {"<simple.css>; title=\"\"; rel=\"stylesheet\"; ", "simple.css", "styles
heet", true}, |
| 77 {"<simple.css>; rel=stylesheet; title=\"", "simple.css", "stylesheet", f
alse}, | 77 {"<simple.css>; rel=stylesheet; title=\"", "simple.css", "stylesheet", f
alse}, |
| 78 {"<simple.css>; rel=stylesheet; title=\"\"", "simple.css", "stylesheet",
true}, | 78 {"<simple.css>; rel=stylesheet; title=\"\"", "simple.css", "stylesheet",
true}, |
| 79 {"<simple.css>; rel=\"stylesheet\"; title=\"", "simple.css", "stylesheet
", false}, | 79 {"<simple.css>; rel=\"stylesheet\"; title=\"", "simple.css", "stylesheet
", false}, |
| 80 {"<simple.css>; rel=\";style,sheet\"; title=\"", "simple.css", ";style,s
heet", false}, | 80 {"<simple.css>; rel=\";style,sheet\"; title=\"", "simple.css", ";style,s
heet", false}, |
| 81 {"<simple.css>; rel=\"bla'sdf\"; title=\"", "simple.css", "bla'sdf", fal
se}, | 81 {"<simple.css>; rel=\"bla'sdf\"; title=\"", "simple.css", "bla'sdf", fal
se}, |
| 82 {"<simple.css>; rel=\"\"; title=\"\"", "simple.css", "", true}, | 82 {"<simple.css>; rel=\"\"; title=\"\"", "simple.css", "", true}, |
| 83 {"<simple.css>; rel=''; title=\"\"", "simple.css", "", true}, | 83 {"<simple.css>; rel=''; title=\"\"", "simple.css", "", true}, |
| 84 {"<simple.css>; rel=''; title=", "simple.css", "", false}, |
| 85 {"<simple.css>; rel=''; title", "simple.css", "", false}, |
| 86 {"<simple.css>; rel=''; media", "simple.css", "", false}, |
| 87 {"<simple.css>; rel=''; hreflang", "simple.css", "", false}, |
| 88 {"<simple.css>; rel=''; type", "simple.css", "", false}, |
| 89 {"<simple.css>; rel=''; rev", "simple.css", "", false}, |
| 90 {"<simple.css>; rel=''; bla", "simple.css", "", true}, |
| 84 {"<simple.css>; rel='prefetch", "simple.css", "", false}, | 91 {"<simple.css>; rel='prefetch", "simple.css", "", false}, |
| 85 {"<simple.css>; rel=\"prefetch", "simple.css", "", false}, | 92 {"<simple.css>; rel=\"prefetch", "simple.css", "", false}, |
| 86 {"<simple.css>; rel=\"", "simple.css", "", false}, | 93 {"<simple.css>; rel=\"", "simple.css", "", false}, |
| 87 }; | 94 }; |
| 88 | 95 |
| 89 | 96 |
| 90 // Test the cases with a single header | 97 // Test the cases with a single header |
| 91 for (auto& testCase : cases) { | 98 for (auto& testCase : cases) { |
| 92 LinkHeaderSet headerSet(testCase.headerValue); | 99 LinkHeaderSet headerSet(testCase.headerValue); |
| 93 LinkHeader& header = headerSet[0]; | 100 LinkHeader& header = headerSet[0]; |
| 94 ASSERT_STREQ(testCase.url, header.url().ascii().data()); | 101 ASSERT_STREQ(testCase.url, header.url().ascii().data()); |
| 95 ASSERT_STREQ(testCase.rel, header.rel().ascii().data()); | 102 ASSERT_STREQ(testCase.rel, header.rel().ascii().data()); |
| 96 ASSERT_EQ(testCase.valid, header.valid()); | 103 ASSERT_EQ(testCase.valid, header.valid()); |
| 97 } | 104 } |
| 98 } | 105 } |
| 99 | 106 |
| 100 TEST(LinkHeaderTest, Double) | 107 TEST(LinkHeaderTest, Double) |
| 101 { | 108 { |
| 102 struct DoubleTestCase { | 109 struct DoubleTestCase { |
| 103 const char* headerValue; | 110 const char* headerValue; |
| 104 const char* url; | 111 const char* url; |
| 105 const char* rel; | 112 const char* rel; |
| 106 bool valid; | 113 bool valid; |
| 107 const char* url2; | 114 const char* url2; |
| 108 const char* rel2; | 115 const char* rel2; |
| 109 bool valid2; | 116 bool valid2; |
| 110 } cases[] = { | 117 } cases[] = { |
| 111 {"<ybg.css>; rel=stylesheet, <simple.css>; rel=stylesheet", "ybg.css", "
stylesheet", true, "simple.css", "stylesheet", true}, | 118 {"<ybg.css>; rel=stylesheet, <simple.css>; rel=stylesheet", "ybg.css", "
stylesheet", true, "simple.css", "stylesheet", true}, |
| 119 {"<ybg.css>; rel=stylesheet,<simple.css>; rel=stylesheet", "ybg.css", "s
tylesheet", true, "simple.css", "stylesheet", true}, |
| 120 {"<ybg.css>; rel=stylesheet;crossorigin,<simple.css>; rel=stylesheet", "
ybg.css", "stylesheet", true, "simple.css", "stylesheet", true}, |
| 112 }; | 121 }; |
| 113 | 122 |
| 114 for (auto& testCase : cases) { | 123 for (auto& testCase : cases) { |
| 115 LinkHeaderSet headerSet(testCase.headerValue); | 124 LinkHeaderSet headerSet(testCase.headerValue); |
| 116 LinkHeader& header1 = headerSet[0]; | 125 LinkHeader& header1 = headerSet[0]; |
| 117 LinkHeader& header2 = headerSet[1]; | 126 LinkHeader& header2 = headerSet[1]; |
| 118 ASSERT_STREQ(testCase.url, header1.url().ascii().data()); | 127 ASSERT_STREQ(testCase.url, header1.url().ascii().data()); |
| 119 ASSERT_STREQ(testCase.rel, header1.rel().ascii().data()); | 128 ASSERT_STREQ(testCase.rel, header1.rel().ascii().data()); |
| 120 ASSERT_EQ(testCase.valid, header1.valid()); | 129 ASSERT_EQ(testCase.valid, header1.valid()); |
| 121 ASSERT_STREQ(testCase.url2, header2.url().ascii().data()); | 130 ASSERT_STREQ(testCase.url2, header2.url().ascii().data()); |
| 122 ASSERT_STREQ(testCase.rel2, header2.rel().ascii().data()); | 131 ASSERT_STREQ(testCase.rel2, header2.rel().ascii().data()); |
| 123 ASSERT_EQ(testCase.valid2, header2.valid()); | 132 ASSERT_EQ(testCase.valid2, header2.valid()); |
| 124 } | 133 } |
| 125 } | 134 } |
| 126 | 135 |
| 127 TEST(LinkHeaderTest, CrossOrigin) | 136 TEST(LinkHeaderTest, CrossOrigin) |
| 128 { | 137 { |
| 129 struct TestCase { | 138 struct TestCase { |
| 130 const char* headerValue; | 139 const char* headerValue; |
| 131 const char* url; | 140 const char* url; |
| 132 const char* rel; | 141 const char* rel; |
| 133 const CrossOriginAttributeValue crossorigin; | 142 const CrossOriginAttributeValue crossorigin; |
| 134 bool valid; | 143 bool valid; |
| 135 } cases[] = { | 144 } cases[] = { |
| 136 {"<http://whatever.com>; rel=preconnect", "http://whatever.com", "precon
nect", CrossOriginAttributeNotSet, true}, | 145 {"<http://whatever.com>; rel=preconnect", "http://whatever.com", "precon
nect", CrossOriginAttributeNotSet, true}, |
| 137 {"<http://whatever.com>; rel=preconnect; crossorigin=", "http://whatever
.com", "preconnect", CrossOriginAttributeAnonymous, true}, | 146 {"<http://whatever.com>; rel=preconnect; crossorigin=", "http://whatever
.com", "preconnect", CrossOriginAttributeAnonymous, true}, |
| 138 {"<http://whatever.com>; rel=preconnect; crossorigin", "http://whatever.
com", "preconnect", CrossOriginAttributeAnonymous, true}, | 147 {"<http://whatever.com>; rel=preconnect; crossorigin", "http://whatever.
com", "preconnect", CrossOriginAttributeAnonymous, true}, |
| 148 {"<http://whatever.com>; rel=preconnect; crossorigin;", "http://whatever
.com", "preconnect", CrossOriginAttributeAnonymous, true}, |
| 149 {"<http://whatever.com>; rel=preconnect; crossorigin, <http://whatever2.
com>; rel=preconnect", "http://whatever.com", "preconnect", CrossOriginAttribute
Anonymous, true}, |
| 150 {"<http://whatever.com>; rel=preconnect; crossorigin,<http://whatever2.c
om>; rel=preconnect", "http://whatever.com", "preconnect", CrossOriginAttributeA
nonymous, true}, |
| 139 {"<http://whatever.com>; rel=preconnect; crossorigin=anonymous", "http:/
/whatever.com", "preconnect", CrossOriginAttributeAnonymous, true}, | 151 {"<http://whatever.com>; rel=preconnect; crossorigin=anonymous", "http:/
/whatever.com", "preconnect", CrossOriginAttributeAnonymous, true}, |
| 140 {"<http://whatever.com>; rel=preconnect; crossorigin=use-credentials", "
http://whatever.com", "preconnect", CrossOriginAttributeUseCredentials, true}, | 152 {"<http://whatever.com>; rel=preconnect; crossorigin=use-credentials", "
http://whatever.com", "preconnect", CrossOriginAttributeUseCredentials, true}, |
| 141 {"<http://whatever.com>; rel=preconnect; crossorigin=whatever", "http://
whatever.com", "preconnect", CrossOriginAttributeAnonymous, true}, | 153 {"<http://whatever.com>; rel=preconnect; crossorigin=whatever", "http://
whatever.com", "preconnect", CrossOriginAttributeAnonymous, true}, |
| 154 {"<http://whatever.com>; rel=preconnect; crossorig|in=whatever", "http:/
/whatever.com", "preconnect", CrossOriginAttributeNotSet, true}, |
| 155 {"<http://whatever.com>; rel=preconnect; crossorigin|=whatever", "http:/
/whatever.com", "preconnect", CrossOriginAttributeNotSet, true}, |
| 156 {"<http://whatever.com>; rel=preconnect; valid!", "http://whatever.com",
"preconnect", CrossOriginAttributeNotSet, true}, |
| 157 {"<http://whatever.com>; rel=preconnect; valid$", "http://whatever.com",
"preconnect", CrossOriginAttributeNotSet, true}, |
| 158 {"<http://whatever.com>; rel=preconnect; invalid@", "http://whatever.com
", "preconnect", CrossOriginAttributeNotSet, false}, |
| 159 {"<http://whatever.com>; rel=preconnect; invalid*", "http://whatever.com
", "preconnect", CrossOriginAttributeNotSet, false}, |
| 142 }; | 160 }; |
| 143 | 161 |
| 144 | 162 |
| 145 // Test the cases with a single header | 163 // Test the cases with a single header |
| 146 for (auto& testCase : cases) { | 164 for (auto& testCase : cases) { |
| 147 LinkHeaderSet headerSet(testCase.headerValue); | 165 LinkHeaderSet headerSet(testCase.headerValue); |
| 148 LinkHeader& header = headerSet[0]; | 166 LinkHeader& header = headerSet[0]; |
| 149 ASSERT_STREQ(testCase.url, header.url().ascii().data()); | 167 ASSERT_STREQ(testCase.url, header.url().ascii().data()); |
| 150 ASSERT_STREQ(testCase.rel, header.rel().ascii().data()); | 168 ASSERT_STREQ(testCase.rel, header.rel().ascii().data()); |
| 151 ASSERT_EQ(testCase.crossorigin, header.crossOrigin()); | 169 ASSERT_EQ(testCase.crossorigin, header.crossOrigin()); |
| 152 ASSERT_EQ(testCase.valid, header.valid()); | 170 ASSERT_EQ(testCase.valid, header.valid()); |
| 153 } | 171 } |
| 154 } | 172 } |
| 155 } // namespace blink | 173 } // namespace blink |
| OLD | NEW |