Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: test/WebRequest.cpp

Issue 29377825: Issue 4951 - Restrict request headers in XMLHttpRequest.Also test Accept-Encoding with th… (Closed) Base URL: https://hg.adblockplus.org/libadblockplus/
Left Patch Set: improve tests following feedback. Created March 3, 2017, 7:04 p.m.
Right Patch Set: Updated based on the feedback. Created March 8, 2017, 4:15 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « lib/compat.js ('k') | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2016 Eyeo GmbH 3 * Copyright (C) 2006-2016 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 #include <sstream> 18 #include <sstream>
19 #include "BaseJsTest.h" 19 #include "BaseJsTest.h"
20 #include "../src/Thread.h" 20 #include "../src/Thread.h"
21 21
22 namespace 22 namespace
23 { 23 {
24 class MockWebRequest : public AdblockPlus::WebRequest 24 class MockWebRequest : public AdblockPlus::WebRequest
25 { 25 {
26 public: 26 public:
27 AdblockPlus::ServerResponse GET(const std::string& url, const AdblockPlus::H eaderList& requestHeaders) const 27 AdblockPlus::ServerResponse GET(const std::string& url, const AdblockPlus::H eaderList& requestHeaders) const
28 { 28 {
29 AdblockPlus::Sleep(50);
30
31 AdblockPlus::ServerResponse result;
32 result.status = NS_OK;
33 result.responseStatus = 123;
34 result.responseHeaders.push_back(std::pair<std::string, std::string>("Foo" , "Bar"));
35 result.responseText = url + "\n" + requestHeaders[0].first + "\n" + reques tHeaders[0].second;
36 return result;
37 }
38 };
39
40 class XHRTestWebRequest : public AdblockPlus::WebRequest
Felix Dahlke 2017/03/06 16:51:07 IMHO it'd make more sense to add lastRequestHeader
hub 2017/03/06 17:26:05 I can do that too. I was trying to avoid side effe
41 {
42 public:
43 AdblockPlus::ServerResponse GET(const std::string& url, const AdblockPlus::H eaderList& requestHeaders) const
44 {
45 lastRequestHeaders.clear(); 29 lastRequestHeaders.clear();
sergei 2017/03/13 09:56:57 Sorry, I forgot to say it again when my comments h
sergei 2017/03/16 11:08:25 What about this point? Actually I find it very imp
46 for (auto header : requestHeaders) 30 for (auto header : requestHeaders)
47 { 31 {
48 lastRequestHeaders.insert(header.first); 32 lastRequestHeaders.insert(header.first);
49 } 33 }
50 34
35 AdblockPlus::Sleep(50);
36
51 AdblockPlus::ServerResponse result; 37 AdblockPlus::ServerResponse result;
52 result.status = NS_OK; 38 result.status = NS_OK;
53 result.responseStatus = 123; 39 result.responseStatus = 123;
54 result.responseHeaders.push_back(std::pair<std::string, std::string>("Foo" , "Bar")); 40 result.responseHeaders.push_back(std::pair<std::string, std::string>("Foo" , "Bar"));
41 result.responseText = url + "\n";
42 if (!requestHeaders.empty())
43 {
44 result.responseText += requestHeaders[0].first + "\n" + requestHeaders[0 ].second;
45 }
55 return result; 46 return result;
56 } 47 }
57 48
58 // mutable. Very Ugly. But we are testing. 49 // mutable. Very Ugly. But we are testing and need to change this in GET whi ch is const.
59 mutable std::set<std::string> lastRequestHeaders; 50 mutable std::set<std::string> lastRequestHeaders;
60 }; 51 };
61 52
62 template<class T> 53 template<class T>
63 class WebRequestTest : public BaseJsTest 54 class WebRequestTest : public BaseJsTest
64 { 55 {
65 protected: 56 protected:
66 void SetUp() 57 void SetUp()
67 { 58 {
68 BaseJsTest::SetUp(); 59 BaseJsTest::SetUp();
69 jsEngine->SetWebRequest(AdblockPlus::WebRequestPtr(new T)); 60 jsEngine->SetWebRequest(AdblockPlus::WebRequestPtr(new T));
70 jsEngine->SetFileSystem(AdblockPlus::FileSystemPtr(new LazyFileSystem)); 61 jsEngine->SetFileSystem(AdblockPlus::FileSystemPtr(new LazyFileSystem));
71 } 62 }
72 }; 63 };
73 64
74 typedef WebRequestTest<MockWebRequest> MockWebRequestTest; 65 typedef WebRequestTest<MockWebRequest> MockWebRequestTest;
75 typedef WebRequestTest<AdblockPlus::DefaultWebRequest> DefaultWebRequestTest; 66 typedef WebRequestTest<AdblockPlus::DefaultWebRequest> DefaultWebRequestTest;
76 typedef WebRequestTest<XHRTestWebRequest> XMLHttpRequestTest; 67 typedef WebRequestTest<MockWebRequest> XMLHttpRequestTest;
68
69 void
Felix Dahlke 2017/03/09 15:10:58 Nit: Why the new line? Not really consistent with
hub 2017/03/09 15:33:02 probably habit. I'll remove it when I send you the
sergei 2017/03/13 09:56:56 Just in case for future, I would rather prefer to
70 ResetTestXHR(const AdblockPlus::JsEnginePtr& jsEngine)
71 {
72 jsEngine->Evaluate("\
73 var result;\
74 var request = new XMLHttpRequest();\
75 request.open('GET', 'https://easylist-downloads.adblockplus.org/easylist.t xt');\
76 request.overrideMimeType('text/plain');\
77 request.addEventListener('load', function() {result = request.responseText ;}, false);\
78 request.addEventListener('error', function() {result = 'error';}, false);\
79 ");
80 }
81
82 void WaitForVariable(const std::string& variable, const AdblockPlus::JsEngineP tr& jsEngine)
83 {
84 do
85 {
86 AdblockPlus::Sleep(60);
sergei 2017/03/13 09:56:56 Since we touched it here I would say that I person
hub 2017/03/13 14:16:51 I'll file an issue for that.
hub 2017/03/13 14:29:32 filed https://issues.adblockplus.org/ticket/4983
87 } while (jsEngine->Evaluate(variable)->IsUndefined());
88 }
89
77 } 90 }
78 91
79 TEST_F(MockWebRequestTest, BadCall) 92 TEST_F(MockWebRequestTest, BadCall)
80 { 93 {
81 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET()")); 94 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET()"));
82 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('', {}, function(){})")); 95 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('', {}, function(){})"));
83 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET({toString: false}, {}, fu nction(){})")); 96 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET({toString: false}, {}, fu nction(){})"));
84 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('http://example.com/', nu ll, function(){})")); 97 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('http://example.com/', nu ll, function(){})"));
85 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('http://example.com/', {} , null)")); 98 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('http://example.com/', {} , null)"));
86 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('http://example.com/', {} , function(){}, 0)")); 99 ASSERT_ANY_THROW(jsEngine->Evaluate("_webRequest.GET('http://example.com/', {} , function(){}, 0)"));
87 } 100 }
88 101
89 TEST_F(MockWebRequestTest, SuccessfulRequest) 102 TEST_F(MockWebRequestTest, SuccessfulRequest)
90 { 103 {
91 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function( result) {foo = result;} )"); 104 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function( result) {foo = result;} )");
92 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); 105 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined());
93 AdblockPlus::Sleep(200); 106 AdblockPlus::Sleep(200);
94 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As Int()); 107 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As Int());
95 ASSERT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); 108 ASSERT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt());
96 ASSERT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")- >AsString()); 109 ASSERT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")- >AsString());
97 ASSERT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response Headers)")->AsString()); 110 ASSERT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response Headers)")->AsString());
98 } 111 }
99 112
100 #if defined(HAVE_CURL) || defined(_WIN32) 113 #if defined(HAVE_CURL) || defined(_WIN32)
101 TEST_F(DefaultWebRequestTest, RealWebRequest) 114 TEST_F(DefaultWebRequestTest, RealWebRequest)
102 { 115 {
103 // This URL should redirect to easylist-downloads.adblockplus.org and we 116 // This URL should redirect to easylist-downloads.adblockplus.org and we
104 // should get the actual filter list back. 117 // should get the actual filter list back.
105 jsEngine->Evaluate("_webRequest.GET('https://easylist-downloads.adblockplus.or g/easylist.txt', {}, function(result) {foo = result;} )"); 118 jsEngine->Evaluate("_webRequest.GET('https://easylist-downloads.adblockplus.or g/easylist.txt', {}, function(result) {foo = result;} )");
106 do 119 WaitForVariable("this.foo", jsEngine);
107 {
108 AdblockPlus::Sleep(200);
109 } while (jsEngine->Evaluate("this.foo")->IsUndefined());
110 ASSERT_EQ("text/plain", jsEngine->Evaluate("foo.responseHeaders['content-type' ].substr(0, 10)")->AsString()); 120 ASSERT_EQ("text/plain", jsEngine->Evaluate("foo.responseHeaders['content-type' ].substr(0, 10)")->AsString());
111 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As Int()); 121 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As Int());
112 ASSERT_EQ(200, jsEngine->Evaluate("foo.responseStatus")->AsInt()); 122 ASSERT_EQ(200, jsEngine->Evaluate("foo.responseStatus")->AsInt());
113 ASSERT_EQ("[Adblock Plus ", jsEngine->Evaluate("foo.responseText.substr(0, 14) ")->AsString()); 123 ASSERT_EQ("[Adblock Plus ", jsEngine->Evaluate("foo.responseText.substr(0, 14) ")->AsString());
114 ASSERT_EQ("text/plain", jsEngine->Evaluate("foo.responseHeaders['content-type' ].substr(0, 10)")->AsString()); 124 ASSERT_EQ("text/plain", jsEngine->Evaluate("foo.responseHeaders['content-type' ].substr(0, 10)")->AsString());
115 #if defined(HAVE_CURL) 125 #if defined(HAVE_CURL)
116 ASSERT_EQ("gzip", jsEngine->Evaluate("foo.responseHeaders['content-encoding']. substr(0, 4)")->AsString()); 126 ASSERT_EQ("gzip", jsEngine->Evaluate("foo.responseHeaders['content-encoding']. substr(0, 4)")->AsString());
117 #endif 127 #endif
118 ASSERT_TRUE(jsEngine->Evaluate("foo.responseHeaders['location']")->IsUndefined ()); 128 ASSERT_TRUE(jsEngine->Evaluate("foo.responseHeaders['location']")->IsUndefined ());
119 } 129 }
120 130
121 TEST_F(DefaultWebRequestTest, XMLHttpRequest) 131 TEST_F(DefaultWebRequestTest, XMLHttpRequest)
122 { 132 {
123 AdblockPlus::FilterEngine filterEngine(jsEngine); 133 AdblockPlus::FilterEngine filterEngine(jsEngine);
124 134
125 jsEngine->Evaluate("\ 135 ResetTestXHR(jsEngine);
126 var result;\ 136 jsEngine->Evaluate("\
127 var request = new XMLHttpRequest();\
128 request.open('GET', 'https://easylist-downloads.adblockplus.org/easylist.txt ');\
129 request.setRequestHeader('X', 'Y');\ 137 request.setRequestHeader('X', 'Y');\
130 request.setRequestHeader('X2', 'Y2');\ 138 request.setRequestHeader('X2', 'Y2');\
131 request.overrideMimeType('text/plain');\
132 request.addEventListener('load', function() {result = request.responseText;} , false);\
133 request.addEventListener('error', function() {result = 'error';}, false);\
134 request.send(null);"); 139 request.send(null);");
135 do 140 WaitForVariable("result", jsEngine);
136 {
137 AdblockPlus::Sleep(200);
138 } while (jsEngine->Evaluate("result")->IsUndefined());
139 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("request.channel. status")->AsInt()); 141 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("request.channel. status")->AsInt());
140 ASSERT_EQ(200, jsEngine->Evaluate("request.status")->AsInt()); 142 ASSERT_EQ(200, jsEngine->Evaluate("request.status")->AsInt());
141 ASSERT_EQ("[Adblock Plus ", jsEngine->Evaluate("result.substr(0, 14)")->AsStri ng()); 143 ASSERT_EQ("[Adblock Plus ", jsEngine->Evaluate("result.substr(0, 14)")->AsStri ng());
142 ASSERT_EQ("text/plain", jsEngine->Evaluate("request.getResponseHeader('Content -Type').substr(0, 10)")->AsString()); 144 ASSERT_EQ("text/plain", jsEngine->Evaluate("request.getResponseHeader('Content -Type').substr(0, 10)")->AsString());
143 #if defined(HAVE_CURL) 145 #if defined(HAVE_CURL)
sergei 2017/03/13 09:56:56 It seems, it should be in commit https://github.co
144 ASSERT_EQ("gzip", jsEngine->Evaluate("request.getResponseHeader('Content-Encod ing').substr(0, 4)")->AsString()); 146 ASSERT_EQ("gzip", jsEngine->Evaluate("request.getResponseHeader('Content-Encod ing').substr(0, 4)")->AsString());
145 #endif 147 #endif
146 ASSERT_TRUE(jsEngine->Evaluate("request.getResponseHeader('Location')")->IsNul l()); 148 ASSERT_TRUE(jsEngine->Evaluate("request.getResponseHeader('Location')")->IsNul l());
147 } 149 }
148 #else 150 #else
149 TEST_F(DefaultWebRequestTest, DummyWebRequest) 151 TEST_F(DefaultWebRequestTest, DummyWebRequest)
150 { 152 {
151 jsEngine->Evaluate("_webRequest.GET('https://easylist-downloads.adblockplus.or g/easylist.txt', {}, function(result) {foo = result;} )"); 153 jsEngine->Evaluate("_webRequest.GET('https://easylist-downloads.adblockplus.or g/easylist.txt', {}, function(result) {foo = result;} )");
152 do 154 WaitForVariable("this.foo", jsEngine);
153 {
154 AdblockPlus::Sleep(200);
155 } while (jsEngine->Evaluate("this.foo")->IsUndefined());
156 ASSERT_EQ(AdblockPlus::WebRequest::NS_ERROR_FAILURE, jsEngine->Evaluate("foo.s tatus")->AsInt()); 155 ASSERT_EQ(AdblockPlus::WebRequest::NS_ERROR_FAILURE, jsEngine->Evaluate("foo.s tatus")->AsInt());
157 ASSERT_EQ(0, jsEngine->Evaluate("foo.responseStatus")->AsInt()); 156 ASSERT_EQ(0, jsEngine->Evaluate("foo.responseStatus")->AsInt());
158 ASSERT_EQ("", jsEngine->Evaluate("foo.responseText")->AsString()); 157 ASSERT_EQ("", jsEngine->Evaluate("foo.responseText")->AsString());
159 ASSERT_EQ("{}", jsEngine->Evaluate("JSON.stringify(foo.responseHeaders)")->AsS tring()); 158 ASSERT_EQ("{}", jsEngine->Evaluate("JSON.stringify(foo.responseHeaders)")->AsS tring());
160 } 159 }
161 160
162 TEST_F(DefaultWebRequestTest, XMLHttpRequest) 161 TEST_F(DefaultWebRequestTest, XMLHttpRequest)
163 { 162 {
164 AdblockPlus::FilterEngine filterEngine(jsEngine); 163 AdblockPlus::FilterEngine filterEngine(jsEngine);
165 164
166 jsEngine->Evaluate("\ 165 ResetTestXHR(jsEngine);
167 var result;\ 166 jsEngine->Evaluate("\
168 var request = new XMLHttpRequest();\
169 request.open('GET', 'https://easylist-downloads.adblockplus.org/easylist.txt ');\
170 request.setRequestHeader('X', 'Y');\ 167 request.setRequestHeader('X', 'Y');\
171 request.overrideMimeType('text/plain');\
172 request.addEventListener('load', function() {result = request.responseText;} , false);\
173 request.addEventListener('error', function() {result = 'error';}, false);\
174 request.send(null);"); 168 request.send(null);");
175 do 169 WaitForVariable("result", jsEngine);
176 {
177 AdblockPlus::Sleep(200);
178 } while (jsEngine->Evaluate("result")->IsUndefined());
179 ASSERT_EQ(AdblockPlus::WebRequest::NS_ERROR_FAILURE, jsEngine->Evaluate("reque st.channel.status")->AsInt()); 170 ASSERT_EQ(AdblockPlus::WebRequest::NS_ERROR_FAILURE, jsEngine->Evaluate("reque st.channel.status")->AsInt());
180 ASSERT_EQ(0, jsEngine->Evaluate("request.status")->AsInt()); 171 ASSERT_EQ(0, jsEngine->Evaluate("request.status")->AsInt());
181 ASSERT_EQ("error", jsEngine->Evaluate("result")->AsString()); 172 ASSERT_EQ("error", jsEngine->Evaluate("result")->AsString());
182 ASSERT_TRUE(jsEngine->Evaluate("request.getResponseHeader('Content-Type')")->I sNull()); 173 ASSERT_TRUE(jsEngine->Evaluate("request.getResponseHeader('Content-Type')")->I sNull());
183 } 174 }
184 175
185 #endif 176 #endif
186 177
187 namespace 178 namespace
188 { 179 {
(...skipping 17 matching lines...) Expand all
206 } 197 }
207 198
208 void clear() 199 void clear()
209 { 200 {
210 lastLogLevel = AdblockPlus::LogSystem::LOG_LEVEL_TRACE; 201 lastLogLevel = AdblockPlus::LogSystem::LOG_LEVEL_TRACE;
211 lastMessage.clear(); 202 lastMessage.clear();
212 } 203 }
213 }; 204 };
214 205
215 typedef std::shared_ptr<CatchLogSystem> CatchLogSystemPtr; 206 typedef std::shared_ptr<CatchLogSystem> CatchLogSystemPtr;
216
217 void
218 ResetTestXHR(const AdblockPlus::JsEnginePtr & jsEngine, const CatchLogSystemPt r & logger)
Felix Dahlke 2017/03/06 16:51:07 Nit: `AdblockPlus::JsEnginePtr &` -> `AdblockPlus:
hub 2017/03/06 17:26:05 Acknowledged.
219 {
220 jsEngine->Evaluate("\
221 var result;\
222 var request = new XMLHttpRequest();\
223 request.open('GET', 'https://easylist-downloads.adblockplus.org/easylist.t xt');\
224 request.overrideMimeType('text/plain');\
225 request.addEventListener('load', function() {result = request.responseText ;}, false);\
226 request.addEventListener('error', function() {result = 'error';}, false);\
227 ");
228 logger->clear();
229 }
230 } 207 }
231 208
232 TEST_F(XMLHttpRequestTest, RequestHeaderValidation) 209 TEST_F(XMLHttpRequestTest, RequestHeaderValidation)
233 { 210 {
234 #define WAIT_FOR_XHR_RESULT do\
235 {\
236 AdblockPlus::Sleep(60);\
237 } while (jsEngine->Evaluate("result")->IsUndefined())
Felix Dahlke 2017/03/06 16:51:08 This is a bit of a footgun, wouldn't it work to ju
hub 2017/03/06 17:26:05 The only difference I see is that we'll check afte
Felix Dahlke 2017/03/07 07:44:22 Oh sorry, it seems I didn't get what I meant here
hub 2017/03/07 15:52:32 The other test have a similar loop. That's where I
Felix Dahlke 2017/03/07 17:03:42 Oh indeed, for some reason I missed that. Like I s
238
239 auto catchLogSystem = CatchLogSystemPtr(new CatchLogSystem); 211 auto catchLogSystem = CatchLogSystemPtr(new CatchLogSystem);
sergei 2017/03/13 09:56:56 Could we please always use either () or {} for con
sergei 2017/03/13 09:56:57 I would prefer to have std::make_shared<CatchLogSy
Felix Dahlke 2017/03/13 10:05:47 I definitely prefer omitting these when not necess
sergei 2017/03/13 10:31:02 It seems Mozilla's coding style does not mention i
Felix Dahlke 2017/03/13 11:05:42 We are talking a bout `new CatchLogSystem` vs `new
sergei 2017/03/13 11:39:16 Yes.
Felix Dahlke 2017/03/13 11:55:06 I see - rusty after all :P Looking at our existing
sergei 2017/03/13 12:19:58 On 2017/03/13 11:55:06, Felix Dahlke wrote: ...
hub 2017/03/13 14:16:51 I see two occurences, line 60 and 61 of this file.
hub 2017/03/13 14:16:51 I did submit a follow up patch to address these. I
240 jsEngine->SetLogSystem(catchLogSystem); 212 jsEngine->SetLogSystem(catchLogSystem);
241 213
242 AdblockPlus::FilterEngine filterEngine(jsEngine); 214 AdblockPlus::FilterEngine filterEngine(jsEngine);
243 auto webRequest = 215 auto webRequest =
244 std::static_pointer_cast<XHRTestWebRequest>(jsEngine->GetWebRequest()); 216 std::static_pointer_cast<MockWebRequest>(jsEngine->GetWebRequest());
sergei 2017/03/13 09:56:56 Although it's fine here, I would rather prefer to
245 217
246 ASSERT_TRUE(webRequest); 218 ASSERT_TRUE(webRequest);
247 219
248 const std::string msg = "Attempt to set a forbidden header was denied: "; 220 const std::string msg = "Attempt to set a forbidden header was denied: ";
249 221
250 // The test will check that console.warn has been called when the 222 // The test will check that console.warn has been called when the
251 // header is rejected. While this is an implementation detail, we 223 // header is rejected. While this is an implementation detail, we
252 // have no other way to check this 224 // have no other way to check this
253 225
254 // test 'Accept-Encoding' is rejected 226 // test 'Accept-Encoding' is rejected
255 ResetTestXHR(jsEngine, catchLogSystem); 227 catchLogSystem->clear();
228 ResetTestXHR(jsEngine);
256 jsEngine->Evaluate("\ 229 jsEngine->Evaluate("\
257 request.setRequestHeader('Accept-Encoding', 'gzip');\nrequest.send();"); 230 request.setRequestHeader('Accept-Encoding', 'gzip');\nrequest.send();");
258 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel ); 231 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel );
259 EXPECT_EQ(msg + "Accept-Encoding", catchLogSystem->lastMessage); 232 EXPECT_EQ(msg + "Accept-Encoding", catchLogSystem->lastMessage);
260 WAIT_FOR_XHR_RESULT; 233 WaitForVariable("result", jsEngine);
261 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() == 234 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() ==
262 webRequest->lastRequestHeaders.find("Accept-Encoding")); 235 webRequest->lastRequestHeaders.find("Accept-Encoding"));
263 236
264 // test 'DNT' is rejected 237 // test 'DNT' is rejected
265 ResetTestXHR(jsEngine, catchLogSystem); 238 catchLogSystem->clear();
239 ResetTestXHR(jsEngine);
266 jsEngine->Evaluate("\ 240 jsEngine->Evaluate("\
267 request.setRequestHeader('DNT', '1');\nrequest.send();"); 241 request.setRequestHeader('DNT', '1');\nrequest.send();");
268 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel ); 242 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel );
269 EXPECT_EQ(msg + "DNT", catchLogSystem->lastMessage); 243 EXPECT_EQ(msg + "DNT", catchLogSystem->lastMessage);
270 WAIT_FOR_XHR_RESULT; 244 WaitForVariable("result", jsEngine);
271 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() == 245 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() ==
272 webRequest->lastRequestHeaders.find("DNT")); 246 webRequest->lastRequestHeaders.find("DNT"));
273 247
274 // test random 'X' header is accepted 248 // test random 'X' header is accepted
275 ResetTestXHR(jsEngine, catchLogSystem); 249 catchLogSystem->clear();
250 ResetTestXHR(jsEngine);
276 jsEngine->Evaluate("\ 251 jsEngine->Evaluate("\
277 request.setRequestHeader('X', 'y');\nrequest.send();"); 252 request.setRequestHeader('X', 'y');\nrequest.send();");
278 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLeve l); 253 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLeve l);
279 EXPECT_EQ("", catchLogSystem->lastMessage); 254 EXPECT_EQ("", catchLogSystem->lastMessage);
280 WAIT_FOR_XHR_RESULT; 255 WaitForVariable("result", jsEngine);
281 EXPECT_FALSE(webRequest->lastRequestHeaders.cend() == 256 EXPECT_FALSE(webRequest->lastRequestHeaders.cend() ==
282 webRequest->lastRequestHeaders.find("X")); 257 webRequest->lastRequestHeaders.find("X"));
283 258
284 // test /^Proxy-/ is rejected. 259 // test /^Proxy-/ is rejected.
285 ResetTestXHR(jsEngine, catchLogSystem); 260 catchLogSystem->clear();
261 ResetTestXHR(jsEngine);
286 jsEngine->Evaluate("\ 262 jsEngine->Evaluate("\
287 request.setRequestHeader('Proxy-foo', 'bar');\nrequest.send();"); 263 request.setRequestHeader('Proxy-foo', 'bar');\nrequest.send();");
288 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel ); 264 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel );
289 EXPECT_EQ(msg + "Proxy-foo", catchLogSystem->lastMessage); 265 EXPECT_EQ(msg + "Proxy-foo", catchLogSystem->lastMessage);
290 WAIT_FOR_XHR_RESULT; 266 WaitForVariable("result", jsEngine);
291 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() == 267 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() ==
292 webRequest->lastRequestHeaders.find("Proxy-foo")); 268 webRequest->lastRequestHeaders.find("Proxy-foo"));
293 269
294 // test /^Sec-/ is rejected. 270 // test /^Sec-/ is rejected.
295 ResetTestXHR(jsEngine, catchLogSystem); 271 catchLogSystem->clear();
272 ResetTestXHR(jsEngine);
296 jsEngine->Evaluate("\ 273 jsEngine->Evaluate("\
297 request.setRequestHeader('Sec-foo', 'bar');\nrequest.send();"); 274 request.setRequestHeader('Sec-foo', 'bar');\nrequest.send();");
298 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel ); 275 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel );
299 EXPECT_EQ(msg + "Sec-foo", catchLogSystem->lastMessage); 276 EXPECT_EQ(msg + "Sec-foo", catchLogSystem->lastMessage);
300 WAIT_FOR_XHR_RESULT; 277 WaitForVariable("result", jsEngine);
301 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() == 278 EXPECT_TRUE(webRequest->lastRequestHeaders.cend() ==
302 webRequest->lastRequestHeaders.find("Sec-foo")); 279 webRequest->lastRequestHeaders.find("Sec-foo"));
303 280
304 // test 'Security' is accepted. 281 // test 'Security' is accepted.
305 ResetTestXHR(jsEngine, catchLogSystem); 282 catchLogSystem->clear();
283 ResetTestXHR(jsEngine);
306 jsEngine->Evaluate("\ 284 jsEngine->Evaluate("\
307 request.setRequestHeader('Security', 'theater');\nrequest.send();"); 285 request.setRequestHeader('Security', 'theater');\nrequest.send();");
308 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLeve l); 286 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLeve l);
309 EXPECT_EQ("", catchLogSystem->lastMessage); 287 EXPECT_EQ("", catchLogSystem->lastMessage);
310 WAIT_FOR_XHR_RESULT; 288 WaitForVariable("result", jsEngine);
311 EXPECT_FALSE(webRequest->lastRequestHeaders.cend() == 289 EXPECT_FALSE(webRequest->lastRequestHeaders.cend() ==
312 webRequest->lastRequestHeaders.find("Security")); 290 webRequest->lastRequestHeaders.find("Security"));
313 } 291 }
LEFTRIGHT

Powered by Google App Engine
This is Rietveld