| 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 |