OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/public/renderer/resource_fetcher.h" | 5 #include "content/public/renderer/resource_fetcher.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 RenderView* GetRenderView() { | 142 RenderView* GetRenderView() { |
143 // We could have the test on the UI thread get the WebContent's routing ID, | 143 // We could have the test on the UI thread get the WebContent's routing ID, |
144 // but we know this will be the first RV so skip that and just hardcode it. | 144 // but we know this will be the first RV so skip that and just hardcode it. |
145 return RenderView::FromRoutingID(kRenderViewRoutingId); | 145 return RenderView::FromRoutingID(kRenderViewRoutingId); |
146 } | 146 } |
147 | 147 |
148 void ResourceFetcherDownloadOnRenderer(const GURL& url) { | 148 void ResourceFetcherDownloadOnRenderer(const GURL& url) { |
149 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 149 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
150 | 150 |
151 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 151 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
152 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create( | 152 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
153 url, frame, WebURLRequest::TargetIsMainFrame, delegate->NewCallback())); | 153 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
| 154 delegate->NewCallback()); |
154 | 155 |
155 delegate->WaitForResponse(); | 156 delegate->WaitForResponse(); |
156 | 157 |
157 ASSERT_TRUE(delegate->completed()); | 158 ASSERT_TRUE(delegate->completed()); |
158 EXPECT_EQ(delegate->response().httpStatusCode(), 200); | 159 EXPECT_EQ(delegate->response().httpStatusCode(), 200); |
159 std::string text = delegate->data(); | 160 std::string text = delegate->data(); |
160 EXPECT_TRUE(text.find("Basic html test.") != std::string::npos); | 161 EXPECT_TRUE(text.find("Basic html test.") != std::string::npos); |
161 } | 162 } |
162 | 163 |
163 void ResourceFetcher404OnRenderer(const GURL& url) { | 164 void ResourceFetcher404OnRenderer(const GURL& url) { |
164 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 165 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
165 | 166 |
166 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 167 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
167 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create( | 168 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
168 url, frame, WebURLRequest::TargetIsMainFrame, delegate->NewCallback())); | 169 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
| 170 delegate->NewCallback()); |
169 | 171 |
170 delegate->WaitForResponse(); | 172 delegate->WaitForResponse(); |
171 | 173 |
172 ASSERT_TRUE(delegate->completed()); | 174 ASSERT_TRUE(delegate->completed()); |
173 EXPECT_EQ(delegate->response().httpStatusCode(), 404); | 175 EXPECT_EQ(delegate->response().httpStatusCode(), 404); |
174 EXPECT_TRUE(delegate->data().find("Not Found.") != std::string::npos); | 176 EXPECT_TRUE(delegate->data().find("Not Found.") != std::string::npos); |
175 } | 177 } |
176 | 178 |
177 void ResourceFetcherDidFailOnRenderer() { | 179 void ResourceFetcherDidFailOnRenderer() { |
178 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 180 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
179 | 181 |
180 // Try to fetch a page on a site that doesn't exist. | 182 // Try to fetch a page on a site that doesn't exist. |
181 GURL url("http://localhost:1339/doesnotexist"); | 183 GURL url("http://localhost:1339/doesnotexist"); |
182 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 184 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
183 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create( | 185 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
184 url, frame, WebURLRequest::TargetIsMainFrame, delegate->NewCallback())); | 186 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
| 187 delegate->NewCallback()); |
185 | 188 |
186 delegate->WaitForResponse(); | 189 delegate->WaitForResponse(); |
187 | 190 |
188 // When we fail, we still call the Delegate callback but we pass in empty | 191 // When we fail, we still call the Delegate callback but we pass in empty |
189 // values. | 192 // values. |
190 EXPECT_TRUE(delegate->completed()); | 193 EXPECT_TRUE(delegate->completed()); |
191 EXPECT_TRUE(delegate->response().isNull()); | 194 EXPECT_TRUE(delegate->response().isNull()); |
192 EXPECT_EQ(delegate->data(), std::string()); | 195 EXPECT_EQ(delegate->data(), std::string()); |
193 EXPECT_FALSE(delegate->timed_out()); | 196 EXPECT_FALSE(delegate->timed_out()); |
194 } | 197 } |
195 | 198 |
196 void ResourceFetcherTimeoutOnRenderer(const GURL& url) { | 199 void ResourceFetcherTimeoutOnRenderer(const GURL& url) { |
197 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 200 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
198 | 201 |
199 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 202 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
200 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create( | 203 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
201 url, frame, WebURLRequest::TargetIsMainFrame, | 204 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
202 delegate->NewCallback())); | 205 delegate->NewCallback()); |
203 fetcher->SetTimeout(base::TimeDelta()); | 206 fetcher->SetTimeout(base::TimeDelta()); |
204 | 207 |
205 delegate->WaitForResponse(); | 208 delegate->WaitForResponse(); |
206 | 209 |
207 // When we timeout, we still call the Delegate callback but we pass in empty | 210 // When we timeout, we still call the Delegate callback but we pass in empty |
208 // values. | 211 // values. |
209 EXPECT_TRUE(delegate->completed()); | 212 EXPECT_TRUE(delegate->completed()); |
210 EXPECT_TRUE(delegate->response().isNull()); | 213 EXPECT_TRUE(delegate->response().isNull()); |
211 EXPECT_EQ(delegate->data(), std::string()); | 214 EXPECT_EQ(delegate->data(), std::string()); |
212 EXPECT_FALSE(delegate->timed_out()); | 215 EXPECT_FALSE(delegate->timed_out()); |
213 } | 216 } |
214 | 217 |
215 void ResourceFetcherDeletedInCallbackOnRenderer(const GURL& url) { | 218 void ResourceFetcherDeletedInCallbackOnRenderer(const GURL& url) { |
216 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 219 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
217 | 220 |
218 scoped_ptr<EvilFetcherDelegate> delegate(new EvilFetcherDelegate); | 221 scoped_ptr<EvilFetcherDelegate> delegate(new EvilFetcherDelegate); |
219 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create( | 222 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
220 url, frame, WebURLRequest::TargetIsMainFrame, | 223 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
221 delegate->NewCallback())); | 224 delegate->NewCallback()); |
222 fetcher->SetTimeout(base::TimeDelta()); | 225 fetcher->SetTimeout(base::TimeDelta()); |
223 delegate->SetFetcher(fetcher.release()); | 226 delegate->SetFetcher(fetcher.release()); |
224 | 227 |
225 delegate->WaitForResponse(); | 228 delegate->WaitForResponse(); |
226 EXPECT_FALSE(delegate->timed_out()); | 229 EXPECT_FALSE(delegate->timed_out()); |
227 } | 230 } |
| 231 |
| 232 void ResourceFetcherPost(const GURL& url) { |
| 233 const char* kBody = "Really nifty POST body!"; |
| 234 |
| 235 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 236 |
| 237 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 238 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 239 fetcher->SetMethod("POST"); |
| 240 fetcher->SetBody(kBody); |
| 241 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
| 242 delegate->NewCallback()); |
| 243 |
| 244 delegate->WaitForResponse(); |
| 245 ASSERT_TRUE(delegate->completed()); |
| 246 EXPECT_EQ(delegate->response().httpStatusCode(), 200); |
| 247 EXPECT_EQ(kBody, delegate->data()); |
| 248 } |
| 249 |
| 250 void ResourceFetcherSetHeader(const GURL& url) { |
| 251 const char* kHeader = "Rather boring header."; |
| 252 |
| 253 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 254 |
| 255 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 256 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 257 fetcher->SetHeader("header", kHeader); |
| 258 fetcher->Start(frame, WebURLRequest::TargetIsMainFrame, |
| 259 delegate->NewCallback()); |
| 260 |
| 261 delegate->WaitForResponse(); |
| 262 ASSERT_TRUE(delegate->completed()); |
| 263 EXPECT_EQ(delegate->response().httpStatusCode(), 200); |
| 264 EXPECT_EQ(kHeader, delegate->data()); |
| 265 } |
228 }; | 266 }; |
229 | 267 |
230 // Test a fetch from the test server. | 268 // Test a fetch from the test server. |
231 // If this flakes, use http://crbug.com/51622. | 269 // If this flakes, use http://crbug.com/51622. |
232 IN_PROC_BROWSER_TEST_F(ResourceFetcherTests, ResourceFetcherDownload) { | 270 IN_PROC_BROWSER_TEST_F(ResourceFetcherTests, ResourceFetcherDownload) { |
233 // Need to spin up the renderer. | 271 // Need to spin up the renderer. |
234 NavigateToURL(shell(), GURL(kAboutBlankURL)); | 272 NavigateToURL(shell(), GURL(kAboutBlankURL)); |
235 | 273 |
236 ASSERT_TRUE(test_server()->Start()); | 274 ASSERT_TRUE(test_server()->Start()); |
237 GURL url(test_server()->GetURL("files/simple_page.html")); | 275 GURL url(test_server()->GetURL("files/simple_page.html")); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 // timeout in 0 sec. | 324 // timeout in 0 sec. |
287 ASSERT_TRUE(test_server()->Start()); | 325 ASSERT_TRUE(test_server()->Start()); |
288 GURL url(test_server()->GetURL("slow?1")); | 326 GURL url(test_server()->GetURL("slow?1")); |
289 | 327 |
290 PostTaskToInProcessRendererAndWait( | 328 PostTaskToInProcessRendererAndWait( |
291 base::Bind( | 329 base::Bind( |
292 &ResourceFetcherTests::ResourceFetcherDeletedInCallbackOnRenderer, | 330 &ResourceFetcherTests::ResourceFetcherDeletedInCallbackOnRenderer, |
293 base::Unretained(this), url)); | 331 base::Unretained(this), url)); |
294 } | 332 } |
295 | 333 |
| 334 // Test that ResourceFetchers can handle POSTs. |
| 335 IN_PROC_BROWSER_TEST_F(ResourceFetcherTests, ResourceFetcherPost) { |
| 336 // Need to spin up the renderer. |
| 337 NavigateToURL(shell(), GURL(kAboutBlankURL)); |
| 338 |
| 339 // Grab a page that echos the POST body. |
| 340 ASSERT_TRUE(test_server()->Start()); |
| 341 GURL url(test_server()->GetURL("echo")); |
| 342 |
| 343 PostTaskToInProcessRendererAndWait( |
| 344 base::Bind( |
| 345 &ResourceFetcherTests::ResourceFetcherPost, |
| 346 base::Unretained(this), url)); |
| 347 } |
| 348 |
| 349 // Test that ResourceFetchers can set headers. |
| 350 IN_PROC_BROWSER_TEST_F(ResourceFetcherTests, ResourceFetcherSetHeader) { |
| 351 // Need to spin up the renderer. |
| 352 NavigateToURL(shell(), GURL(kAboutBlankURL)); |
| 353 |
| 354 // Grab a page that echos the POST body. |
| 355 ASSERT_TRUE(test_server()->Start()); |
| 356 GURL url(test_server()->GetURL("echoheader?header")); |
| 357 |
| 358 PostTaskToInProcessRendererAndWait( |
| 359 base::Bind( |
| 360 &ResourceFetcherTests::ResourceFetcherSetHeader, |
| 361 base::Unretained(this), url)); |
| 362 } |
| 363 |
296 } // namespace content | 364 } // namespace content |
OLD | NEW |