| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 FetcherDelegate::OnURLFetchComplete(response, data); | 117 FetcherDelegate::OnURLFetchComplete(response, data); |
| 118 | 118 |
| 119 // Destroy the ResourceFetcher here. We are testing that upon returning | 119 // Destroy the ResourceFetcher here. We are testing that upon returning |
| 120 // to the ResourceFetcher that it does not crash. This must be done after | 120 // to the ResourceFetcher that it does not crash. This must be done after |
| 121 // calling FetcherDelegate::OnURLFetchComplete, since deleting the fetcher | 121 // calling FetcherDelegate::OnURLFetchComplete, since deleting the fetcher |
| 122 // invalidates |response| and |data|. | 122 // invalidates |response| and |data|. |
| 123 fetcher_.reset(); | 123 fetcher_.reset(); |
| 124 } | 124 } |
| 125 | 125 |
| 126 private: | 126 private: |
| 127 scoped_ptr<ResourceFetcher> fetcher_; | 127 std::unique_ptr<ResourceFetcher> fetcher_; |
| 128 }; | 128 }; |
| 129 | 129 |
| 130 class ResourceFetcherTests : public ContentBrowserTest { | 130 class ResourceFetcherTests : public ContentBrowserTest { |
| 131 public: | 131 public: |
| 132 ResourceFetcherTests() : render_view_routing_id_(MSG_ROUTING_NONE) {} | 132 ResourceFetcherTests() : render_view_routing_id_(MSG_ROUTING_NONE) {} |
| 133 | 133 |
| 134 void SetUpCommandLine(base::CommandLine* command_line) override { | 134 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 135 command_line->AppendSwitch(switches::kSingleProcess); | 135 command_line->AppendSwitch(switches::kSingleProcess); |
| 136 #if defined(OS_WIN) | 136 #if defined(OS_WIN) |
| 137 // Don't want to try to create a GPU process. | 137 // Don't want to try to create a GPU process. |
| 138 command_line->AppendSwitch(switches::kDisableGpu); | 138 command_line->AppendSwitch(switches::kDisableGpu); |
| 139 #endif | 139 #endif |
| 140 } | 140 } |
| 141 | 141 |
| 142 void SetUpOnMainThread() override { | 142 void SetUpOnMainThread() override { |
| 143 render_view_routing_id_ = | 143 render_view_routing_id_ = |
| 144 shell()->web_contents()->GetRenderViewHost()->GetRoutingID(); | 144 shell()->web_contents()->GetRenderViewHost()->GetRoutingID(); |
| 145 } | 145 } |
| 146 | 146 |
| 147 RenderView* GetRenderView() { | 147 RenderView* GetRenderView() { |
| 148 return RenderView::FromRoutingID(render_view_routing_id_); | 148 return RenderView::FromRoutingID(render_view_routing_id_); |
| 149 } | 149 } |
| 150 | 150 |
| 151 void ResourceFetcherDownloadOnRenderer(const GURL& url) { | 151 void ResourceFetcherDownloadOnRenderer(const GURL& url) { |
| 152 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 152 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 153 | 153 |
| 154 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 154 std::unique_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 155 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 155 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 156 fetcher->Start(frame, | 156 fetcher->Start(frame, |
| 157 WebURLRequest::RequestContextInternal, | 157 WebURLRequest::RequestContextInternal, |
| 158 WebURLRequest::FrameTypeNone, | 158 WebURLRequest::FrameTypeNone, |
| 159 ResourceFetcher::PLATFORM_LOADER, | 159 ResourceFetcher::PLATFORM_LOADER, |
| 160 delegate->NewCallback()); | 160 delegate->NewCallback()); |
| 161 | 161 |
| 162 delegate->WaitForResponse(); | 162 delegate->WaitForResponse(); |
| 163 | 163 |
| 164 ASSERT_TRUE(delegate->completed()); | 164 ASSERT_TRUE(delegate->completed()); |
| 165 EXPECT_EQ(delegate->response().httpStatusCode(), 200); | 165 EXPECT_EQ(delegate->response().httpStatusCode(), 200); |
| 166 std::string text = delegate->data(); | 166 std::string text = delegate->data(); |
| 167 EXPECT_TRUE(text.find("Basic html test.") != std::string::npos); | 167 EXPECT_TRUE(text.find("Basic html test.") != std::string::npos); |
| 168 } | 168 } |
| 169 | 169 |
| 170 void ResourceFetcher404OnRenderer(const GURL& url) { | 170 void ResourceFetcher404OnRenderer(const GURL& url) { |
| 171 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 171 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 172 | 172 |
| 173 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 173 std::unique_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 174 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 174 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 175 fetcher->Start(frame, | 175 fetcher->Start(frame, |
| 176 WebURLRequest::RequestContextInternal, | 176 WebURLRequest::RequestContextInternal, |
| 177 WebURLRequest::FrameTypeNone, | 177 WebURLRequest::FrameTypeNone, |
| 178 ResourceFetcher::PLATFORM_LOADER, | 178 ResourceFetcher::PLATFORM_LOADER, |
| 179 delegate->NewCallback()); | 179 delegate->NewCallback()); |
| 180 | 180 |
| 181 delegate->WaitForResponse(); | 181 delegate->WaitForResponse(); |
| 182 | 182 |
| 183 ASSERT_TRUE(delegate->completed()); | 183 ASSERT_TRUE(delegate->completed()); |
| 184 EXPECT_EQ(delegate->response().httpStatusCode(), 404); | 184 EXPECT_EQ(delegate->response().httpStatusCode(), 404); |
| 185 } | 185 } |
| 186 | 186 |
| 187 void ResourceFetcherDidFailOnRenderer() { | 187 void ResourceFetcherDidFailOnRenderer() { |
| 188 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 188 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 189 | 189 |
| 190 // Try to fetch a page on a site that doesn't exist. | 190 // Try to fetch a page on a site that doesn't exist. |
| 191 GURL url("http://localhost:1339/doesnotexist"); | 191 GURL url("http://localhost:1339/doesnotexist"); |
| 192 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 192 std::unique_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 193 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 193 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 194 fetcher->Start(frame, | 194 fetcher->Start(frame, |
| 195 WebURLRequest::RequestContextInternal, | 195 WebURLRequest::RequestContextInternal, |
| 196 WebURLRequest::FrameTypeNone, | 196 WebURLRequest::FrameTypeNone, |
| 197 ResourceFetcher::PLATFORM_LOADER, | 197 ResourceFetcher::PLATFORM_LOADER, |
| 198 delegate->NewCallback()); | 198 delegate->NewCallback()); |
| 199 | 199 |
| 200 delegate->WaitForResponse(); | 200 delegate->WaitForResponse(); |
| 201 | 201 |
| 202 // When we fail, we still call the Delegate callback but we pass in empty | 202 // When we fail, we still call the Delegate callback but we pass in empty |
| 203 // values. | 203 // values. |
| 204 EXPECT_TRUE(delegate->completed()); | 204 EXPECT_TRUE(delegate->completed()); |
| 205 EXPECT_TRUE(delegate->response().isNull()); | 205 EXPECT_TRUE(delegate->response().isNull()); |
| 206 EXPECT_EQ(delegate->data(), std::string()); | 206 EXPECT_EQ(delegate->data(), std::string()); |
| 207 EXPECT_FALSE(delegate->timed_out()); | 207 EXPECT_FALSE(delegate->timed_out()); |
| 208 } | 208 } |
| 209 | 209 |
| 210 void ResourceFetcherTimeoutOnRenderer(const GURL& url) { | 210 void ResourceFetcherTimeoutOnRenderer(const GURL& url) { |
| 211 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 211 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 212 | 212 |
| 213 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 213 std::unique_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 214 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 214 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 215 fetcher->Start(frame, | 215 fetcher->Start(frame, |
| 216 WebURLRequest::RequestContextInternal, | 216 WebURLRequest::RequestContextInternal, |
| 217 WebURLRequest::FrameTypeNone, | 217 WebURLRequest::FrameTypeNone, |
| 218 ResourceFetcher::PLATFORM_LOADER, | 218 ResourceFetcher::PLATFORM_LOADER, |
| 219 delegate->NewCallback()); | 219 delegate->NewCallback()); |
| 220 fetcher->SetTimeout(base::TimeDelta()); | 220 fetcher->SetTimeout(base::TimeDelta()); |
| 221 | 221 |
| 222 delegate->WaitForResponse(); | 222 delegate->WaitForResponse(); |
| 223 | 223 |
| 224 // When we timeout, we still call the Delegate callback but we pass in empty | 224 // When we timeout, we still call the Delegate callback but we pass in empty |
| 225 // values. | 225 // values. |
| 226 EXPECT_TRUE(delegate->completed()); | 226 EXPECT_TRUE(delegate->completed()); |
| 227 EXPECT_TRUE(delegate->response().isNull()); | 227 EXPECT_TRUE(delegate->response().isNull()); |
| 228 EXPECT_EQ(delegate->data(), std::string()); | 228 EXPECT_EQ(delegate->data(), std::string()); |
| 229 EXPECT_FALSE(delegate->timed_out()); | 229 EXPECT_FALSE(delegate->timed_out()); |
| 230 } | 230 } |
| 231 | 231 |
| 232 void ResourceFetcherDeletedInCallbackOnRenderer(const GURL& url) { | 232 void ResourceFetcherDeletedInCallbackOnRenderer(const GURL& url) { |
| 233 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 233 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 234 | 234 |
| 235 scoped_ptr<EvilFetcherDelegate> delegate(new EvilFetcherDelegate); | 235 std::unique_ptr<EvilFetcherDelegate> delegate(new EvilFetcherDelegate); |
| 236 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 236 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 237 fetcher->Start(frame, | 237 fetcher->Start(frame, |
| 238 WebURLRequest::RequestContextInternal, | 238 WebURLRequest::RequestContextInternal, |
| 239 WebURLRequest::FrameTypeNone, | 239 WebURLRequest::FrameTypeNone, |
| 240 ResourceFetcher::PLATFORM_LOADER, | 240 ResourceFetcher::PLATFORM_LOADER, |
| 241 delegate->NewCallback()); | 241 delegate->NewCallback()); |
| 242 fetcher->SetTimeout(base::TimeDelta()); | 242 fetcher->SetTimeout(base::TimeDelta()); |
| 243 delegate->SetFetcher(fetcher.release()); | 243 delegate->SetFetcher(fetcher.release()); |
| 244 | 244 |
| 245 delegate->WaitForResponse(); | 245 delegate->WaitForResponse(); |
| 246 EXPECT_FALSE(delegate->timed_out()); | 246 EXPECT_FALSE(delegate->timed_out()); |
| 247 } | 247 } |
| 248 | 248 |
| 249 void ResourceFetcherPost(const GURL& url) { | 249 void ResourceFetcherPost(const GURL& url) { |
| 250 const char* kBody = "Really nifty POST body!"; | 250 const char* kBody = "Really nifty POST body!"; |
| 251 | 251 |
| 252 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 252 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 253 | 253 |
| 254 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 254 std::unique_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 255 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 255 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 256 fetcher->SetMethod("POST"); | 256 fetcher->SetMethod("POST"); |
| 257 fetcher->SetBody(kBody); | 257 fetcher->SetBody(kBody); |
| 258 fetcher->Start(frame, | 258 fetcher->Start(frame, |
| 259 WebURLRequest::RequestContextInternal, | 259 WebURLRequest::RequestContextInternal, |
| 260 WebURLRequest::FrameTypeNone, | 260 WebURLRequest::FrameTypeNone, |
| 261 ResourceFetcher::PLATFORM_LOADER, | 261 ResourceFetcher::PLATFORM_LOADER, |
| 262 delegate->NewCallback()); | 262 delegate->NewCallback()); |
| 263 | 263 |
| 264 delegate->WaitForResponse(); | 264 delegate->WaitForResponse(); |
| 265 ASSERT_TRUE(delegate->completed()); | 265 ASSERT_TRUE(delegate->completed()); |
| 266 EXPECT_EQ(delegate->response().httpStatusCode(), 200); | 266 EXPECT_EQ(delegate->response().httpStatusCode(), 200); |
| 267 EXPECT_EQ(kBody, delegate->data()); | 267 EXPECT_EQ(kBody, delegate->data()); |
| 268 } | 268 } |
| 269 | 269 |
| 270 void ResourceFetcherSetHeader(const GURL& url) { | 270 void ResourceFetcherSetHeader(const GURL& url) { |
| 271 const char* kHeader = "Rather boring header."; | 271 const char* kHeader = "Rather boring header."; |
| 272 | 272 |
| 273 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); | 273 WebFrame* frame = GetRenderView()->GetWebView()->mainFrame(); |
| 274 | 274 |
| 275 scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate); | 275 std::unique_ptr<FetcherDelegate> delegate(new FetcherDelegate); |
| 276 scoped_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); | 276 std::unique_ptr<ResourceFetcher> fetcher(ResourceFetcher::Create(url)); |
| 277 fetcher->SetHeader("header", kHeader); | 277 fetcher->SetHeader("header", kHeader); |
| 278 fetcher->Start(frame, | 278 fetcher->Start(frame, |
| 279 WebURLRequest::RequestContextInternal, | 279 WebURLRequest::RequestContextInternal, |
| 280 WebURLRequest::FrameTypeNone, | 280 WebURLRequest::FrameTypeNone, |
| 281 ResourceFetcher::PLATFORM_LOADER, | 281 ResourceFetcher::PLATFORM_LOADER, |
| 282 delegate->NewCallback()); | 282 delegate->NewCallback()); |
| 283 | 283 |
| 284 delegate->WaitForResponse(); | 284 delegate->WaitForResponse(); |
| 285 ASSERT_TRUE(delegate->completed()); | 285 ASSERT_TRUE(delegate->completed()); |
| 286 EXPECT_EQ(delegate->response().httpStatusCode(), 200); | 286 EXPECT_EQ(delegate->response().httpStatusCode(), 200); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 ASSERT_TRUE(embedded_test_server()->Start()); | 382 ASSERT_TRUE(embedded_test_server()->Start()); |
| 383 GURL url(embedded_test_server()->GetURL("/echoheader?header")); | 383 GURL url(embedded_test_server()->GetURL("/echoheader?header")); |
| 384 | 384 |
| 385 PostTaskToInProcessRendererAndWait( | 385 PostTaskToInProcessRendererAndWait( |
| 386 base::Bind( | 386 base::Bind( |
| 387 &ResourceFetcherTests::ResourceFetcherSetHeader, | 387 &ResourceFetcherTests::ResourceFetcherSetHeader, |
| 388 base::Unretained(this), url)); | 388 base::Unretained(this), url)); |
| 389 } | 389 } |
| 390 | 390 |
| 391 } // namespace content | 391 } // namespace content |
| OLD | NEW |