| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <memory> |
| 7 #include <string> | 8 #include <string> |
| 8 | 9 |
| 9 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| 10 #include "base/macros.h" | 11 #include "base/macros.h" |
| 11 #include "base/memory/scoped_ptr.h" | |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 15 #include "base/values.h" | 15 #include "base/values.h" |
| 16 #include "chrome/common/chrome_paths.h" | 16 #include "chrome/common/chrome_paths.h" |
| 17 #include "content/public/browser/resource_request_info.h" | 17 #include "content/public/browser/resource_request_info.h" |
| 18 #include "content/public/test/mock_resource_context.h" | 18 #include "content/public/test/mock_resource_context.h" |
| 19 #include "content/public/test/test_browser_thread_bundle.h" | 19 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "extensions/browser/extension_protocols.h" | 20 #include "extensions/browser/extension_protocols.h" |
| 21 #include "extensions/browser/info_map.h" | 21 #include "extensions/browser/info_map.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 // the result. If |extension| hasn't already been added to | 153 // the result. If |extension| hasn't already been added to |
| 154 // |extension_info_map_|, this will add it. | 154 // |extension_info_map_|, this will add it. |
| 155 net::URLRequestStatus::Status DoRequest(const Extension& extension, | 155 net::URLRequestStatus::Status DoRequest(const Extension& extension, |
| 156 const std::string& relative_path) { | 156 const std::string& relative_path) { |
| 157 if (!extension_info_map_->extensions().Contains(extension.id())) { | 157 if (!extension_info_map_->extensions().Contains(extension.id())) { |
| 158 extension_info_map_->AddExtension(&extension, | 158 extension_info_map_->AddExtension(&extension, |
| 159 base::Time::Now(), | 159 base::Time::Now(), |
| 160 false, // incognito_enabled | 160 false, // incognito_enabled |
| 161 false); // notifications_disabled | 161 false); // notifications_disabled |
| 162 } | 162 } |
| 163 scoped_ptr<net::URLRequest> request( | 163 std::unique_ptr<net::URLRequest> request( |
| 164 resource_context_.GetRequestContext()->CreateRequest( | 164 resource_context_.GetRequestContext()->CreateRequest( |
| 165 extension.GetResourceURL(relative_path), | 165 extension.GetResourceURL(relative_path), net::DEFAULT_PRIORITY, |
| 166 net::DEFAULT_PRIORITY, | |
| 167 &test_delegate_)); | 166 &test_delegate_)); |
| 168 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); | 167 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 169 return request->status().status(); | 168 return request->status().status(); |
| 170 } | 169 } |
| 171 | 170 |
| 172 protected: | 171 protected: |
| 173 content::TestBrowserThreadBundle thread_bundle_; | 172 content::TestBrowserThreadBundle thread_bundle_; |
| 174 scoped_refptr<InfoMap> extension_info_map_; | 173 scoped_refptr<InfoMap> extension_info_map_; |
| 175 net::URLRequestJobFactoryImpl job_factory_; | 174 net::URLRequestJobFactoryImpl job_factory_; |
| 176 const net::URLRequestJobFactory* old_factory_; | 175 const net::URLRequestJobFactory* old_factory_; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 207 scoped_refptr<Extension> extension = | 206 scoped_refptr<Extension> extension = |
| 208 CreateTestExtension(cases[i].name, cases[i].incognito_split_mode); | 207 CreateTestExtension(cases[i].name, cases[i].incognito_split_mode); |
| 209 extension_info_map_->AddExtension( | 208 extension_info_map_->AddExtension( |
| 210 extension.get(), base::Time::Now(), cases[i].incognito_enabled, false); | 209 extension.get(), base::Time::Now(), cases[i].incognito_enabled, false); |
| 211 | 210 |
| 212 // First test a main frame request. | 211 // First test a main frame request. |
| 213 { | 212 { |
| 214 // It doesn't matter that the resource doesn't exist. If the resource | 213 // It doesn't matter that the resource doesn't exist. If the resource |
| 215 // is blocked, we should see ADDRESS_UNREACHABLE. Otherwise, the request | 214 // is blocked, we should see ADDRESS_UNREACHABLE. Otherwise, the request |
| 216 // should just fail because the file doesn't exist. | 215 // should just fail because the file doesn't exist. |
| 217 scoped_ptr<net::URLRequest> request( | 216 std::unique_ptr<net::URLRequest> request( |
| 218 resource_context_.GetRequestContext()->CreateRequest( | 217 resource_context_.GetRequestContext()->CreateRequest( |
| 219 extension->GetResourceURL("404.html"), | 218 extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY, |
| 220 net::DEFAULT_PRIORITY, | |
| 221 &test_delegate_)); | 219 &test_delegate_)); |
| 222 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); | 220 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 223 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); | 221 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); |
| 224 | 222 |
| 225 if (cases[i].should_allow_main_frame_load) { | 223 if (cases[i].should_allow_main_frame_load) { |
| 226 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request->status().error()) << | 224 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request->status().error()) << |
| 227 cases[i].name; | 225 cases[i].name; |
| 228 } else { | 226 } else { |
| 229 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request->status().error()) << | 227 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request->status().error()) << |
| 230 cases[i].name; | 228 cases[i].name; |
| 231 } | 229 } |
| 232 } | 230 } |
| 233 | 231 |
| 234 // Now do a subframe request. | 232 // Now do a subframe request. |
| 235 { | 233 { |
| 236 scoped_ptr<net::URLRequest> request( | 234 std::unique_ptr<net::URLRequest> request( |
| 237 resource_context_.GetRequestContext()->CreateRequest( | 235 resource_context_.GetRequestContext()->CreateRequest( |
| 238 extension->GetResourceURL("404.html"), | 236 extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY, |
| 239 net::DEFAULT_PRIORITY, | |
| 240 &test_delegate_)); | 237 &test_delegate_)); |
| 241 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); | 238 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); |
| 242 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); | 239 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); |
| 243 | 240 |
| 244 if (cases[i].should_allow_sub_frame_load) { | 241 if (cases[i].should_allow_sub_frame_load) { |
| 245 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request->status().error()) << | 242 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request->status().error()) << |
| 246 cases[i].name; | 243 cases[i].name; |
| 247 } else { | 244 } else { |
| 248 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request->status().error()) << | 245 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request->status().error()) << |
| 249 cases[i].name; | 246 cases[i].name; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 269 SetProtocolHandler(false); | 266 SetProtocolHandler(false); |
| 270 | 267 |
| 271 scoped_refptr<Extension> extension = CreateWebStoreExtension(); | 268 scoped_refptr<Extension> extension = CreateWebStoreExtension(); |
| 272 extension_info_map_->AddExtension(extension.get(), | 269 extension_info_map_->AddExtension(extension.get(), |
| 273 base::Time::Now(), | 270 base::Time::Now(), |
| 274 false, | 271 false, |
| 275 false); | 272 false); |
| 276 | 273 |
| 277 // First test it with the extension enabled. | 274 // First test it with the extension enabled. |
| 278 { | 275 { |
| 279 scoped_ptr<net::URLRequest> request( | 276 std::unique_ptr<net::URLRequest> request( |
| 280 resource_context_.GetRequestContext()->CreateRequest( | 277 resource_context_.GetRequestContext()->CreateRequest( |
| 281 extension->GetResourceURL("webstore_icon_16.png"), | 278 extension->GetResourceURL("webstore_icon_16.png"), |
| 282 net::DEFAULT_PRIORITY, | 279 net::DEFAULT_PRIORITY, &test_delegate_)); |
| 283 &test_delegate_)); | |
| 284 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 280 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 285 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); | 281 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 286 CheckForContentLengthHeader(request.get()); | 282 CheckForContentLengthHeader(request.get()); |
| 287 } | 283 } |
| 288 | 284 |
| 289 // And then test it with the extension disabled. | 285 // And then test it with the extension disabled. |
| 290 extension_info_map_->RemoveExtension(extension->id(), | 286 extension_info_map_->RemoveExtension(extension->id(), |
| 291 UnloadedExtensionInfo::REASON_DISABLE); | 287 UnloadedExtensionInfo::REASON_DISABLE); |
| 292 { | 288 { |
| 293 scoped_ptr<net::URLRequest> request( | 289 std::unique_ptr<net::URLRequest> request( |
| 294 resource_context_.GetRequestContext()->CreateRequest( | 290 resource_context_.GetRequestContext()->CreateRequest( |
| 295 extension->GetResourceURL("webstore_icon_16.png"), | 291 extension->GetResourceURL("webstore_icon_16.png"), |
| 296 net::DEFAULT_PRIORITY, | 292 net::DEFAULT_PRIORITY, &test_delegate_)); |
| 297 &test_delegate_)); | |
| 298 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 293 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 299 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); | 294 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 300 CheckForContentLengthHeader(request.get()); | 295 CheckForContentLengthHeader(request.get()); |
| 301 } | 296 } |
| 302 } | 297 } |
| 303 | 298 |
| 304 // Tests that a URL request for resource from an extension returns a few | 299 // Tests that a URL request for resource from an extension returns a few |
| 305 // expected response headers. | 300 // expected response headers. |
| 306 TEST_F(ExtensionProtocolTest, ResourceRequestResponseHeaders) { | 301 TEST_F(ExtensionProtocolTest, ResourceRequestResponseHeaders) { |
| 307 // Register a non-incognito extension protocol handler. | 302 // Register a non-incognito extension protocol handler. |
| 308 SetProtocolHandler(false); | 303 SetProtocolHandler(false); |
| 309 | 304 |
| 310 scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension(); | 305 scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension(); |
| 311 extension_info_map_->AddExtension(extension.get(), | 306 extension_info_map_->AddExtension(extension.get(), |
| 312 base::Time::Now(), | 307 base::Time::Now(), |
| 313 false, | 308 false, |
| 314 false); | 309 false); |
| 315 | 310 |
| 316 { | 311 { |
| 317 scoped_ptr<net::URLRequest> request( | 312 std::unique_ptr<net::URLRequest> request( |
| 318 resource_context_.GetRequestContext()->CreateRequest( | 313 resource_context_.GetRequestContext()->CreateRequest( |
| 319 extension->GetResourceURL("test.dat"), | 314 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 320 net::DEFAULT_PRIORITY, | |
| 321 &test_delegate_)); | 315 &test_delegate_)); |
| 322 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 316 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 323 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); | 317 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 324 | 318 |
| 325 // Check that cache-related headers are set. | 319 // Check that cache-related headers are set. |
| 326 std::string etag; | 320 std::string etag; |
| 327 request->GetResponseHeaderByName("ETag", &etag); | 321 request->GetResponseHeaderByName("ETag", &etag); |
| 328 EXPECT_TRUE(base::StartsWith(etag, "\"", base::CompareCase::SENSITIVE)); | 322 EXPECT_TRUE(base::StartsWith(etag, "\"", base::CompareCase::SENSITIVE)); |
| 329 EXPECT_TRUE(base::EndsWith(etag, "\"", base::CompareCase::SENSITIVE)); | 323 EXPECT_TRUE(base::EndsWith(etag, "\"", base::CompareCase::SENSITIVE)); |
| 330 | 324 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 347 SetProtocolHandler(false); | 341 SetProtocolHandler(false); |
| 348 | 342 |
| 349 scoped_refptr<Extension> extension = CreateTestExtension("foo", false); | 343 scoped_refptr<Extension> extension = CreateTestExtension("foo", false); |
| 350 extension_info_map_->AddExtension(extension.get(), | 344 extension_info_map_->AddExtension(extension.get(), |
| 351 base::Time::Now(), | 345 base::Time::Now(), |
| 352 false, | 346 false, |
| 353 false); | 347 false); |
| 354 | 348 |
| 355 // All MAIN_FRAME and SUB_FRAME requests should succeed. | 349 // All MAIN_FRAME and SUB_FRAME requests should succeed. |
| 356 { | 350 { |
| 357 scoped_ptr<net::URLRequest> request( | 351 std::unique_ptr<net::URLRequest> request( |
| 358 resource_context_.GetRequestContext()->CreateRequest( | 352 resource_context_.GetRequestContext()->CreateRequest( |
| 359 extension->GetResourceURL("test.dat"), | 353 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 360 net::DEFAULT_PRIORITY, | |
| 361 &test_delegate_)); | 354 &test_delegate_)); |
| 362 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); | 355 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 363 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); | 356 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 364 } | 357 } |
| 365 { | 358 { |
| 366 scoped_ptr<net::URLRequest> request( | 359 std::unique_ptr<net::URLRequest> request( |
| 367 resource_context_.GetRequestContext()->CreateRequest( | 360 resource_context_.GetRequestContext()->CreateRequest( |
| 368 extension->GetResourceURL("test.dat"), | 361 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 369 net::DEFAULT_PRIORITY, | |
| 370 &test_delegate_)); | 362 &test_delegate_)); |
| 371 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); | 363 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); |
| 372 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); | 364 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 373 } | 365 } |
| 374 | 366 |
| 375 // And subresource types, such as media, should fail. | 367 // And subresource types, such as media, should fail. |
| 376 { | 368 { |
| 377 scoped_ptr<net::URLRequest> request( | 369 std::unique_ptr<net::URLRequest> request( |
| 378 resource_context_.GetRequestContext()->CreateRequest( | 370 resource_context_.GetRequestContext()->CreateRequest( |
| 379 extension->GetResourceURL("test.dat"), | 371 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 380 net::DEFAULT_PRIORITY, | |
| 381 &test_delegate_)); | 372 &test_delegate_)); |
| 382 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 373 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 383 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); | 374 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); |
| 384 } | 375 } |
| 385 } | 376 } |
| 386 | 377 |
| 387 | 378 |
| 388 TEST_F(ExtensionProtocolTest, MetadataFolder) { | 379 TEST_F(ExtensionProtocolTest, MetadataFolder) { |
| 389 SetProtocolHandler(false); | 380 SetProtocolHandler(false); |
| 390 | 381 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 406 DoRequest(*extension, relative_path.AsUTF8Unsafe())); | 397 DoRequest(*extension, relative_path.AsUTF8Unsafe())); |
| 407 | 398 |
| 408 // Loading "/_metadata/a.txt" should also fail. | 399 // Loading "/_metadata/a.txt" should also fail. |
| 409 relative_path = base::FilePath(kMetadataFolder).AppendASCII("a.txt"); | 400 relative_path = base::FilePath(kMetadataFolder).AppendASCII("a.txt"); |
| 410 EXPECT_TRUE(base::PathExists(extension_dir.Append(relative_path))); | 401 EXPECT_TRUE(base::PathExists(extension_dir.Append(relative_path))); |
| 411 EXPECT_EQ(net::URLRequestStatus::FAILED, | 402 EXPECT_EQ(net::URLRequestStatus::FAILED, |
| 412 DoRequest(*extension, relative_path.AsUTF8Unsafe())); | 403 DoRequest(*extension, relative_path.AsUTF8Unsafe())); |
| 413 } | 404 } |
| 414 | 405 |
| 415 } // namespace extensions | 406 } // namespace extensions |
| OLD | NEW |