| 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 <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "content/public/test/test_browser_thread_bundle.h" | 27 #include "content/public/test/test_browser_thread_bundle.h" |
| 28 #include "content/public/test/test_utils.h" | 28 #include "content/public/test/test_utils.h" |
| 29 #include "extensions/browser/content_verifier.h" | 29 #include "extensions/browser/content_verifier.h" |
| 30 #include "extensions/browser/extension_protocols.h" | 30 #include "extensions/browser/extension_protocols.h" |
| 31 #include "extensions/browser/info_map.h" | 31 #include "extensions/browser/info_map.h" |
| 32 #include "extensions/common/constants.h" | 32 #include "extensions/common/constants.h" |
| 33 #include "extensions/common/extension.h" | 33 #include "extensions/common/extension.h" |
| 34 #include "extensions/common/extension_builder.h" | 34 #include "extensions/common/extension_builder.h" |
| 35 #include "extensions/common/file_util.h" | 35 #include "extensions/common/file_util.h" |
| 36 #include "net/base/request_priority.h" | 36 #include "net/base/request_priority.h" |
| 37 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 37 #include "net/url_request/url_request.h" | 38 #include "net/url_request/url_request.h" |
| 38 #include "net/url_request/url_request_job_factory_impl.h" | 39 #include "net/url_request/url_request_job_factory_impl.h" |
| 39 #include "net/url_request/url_request_status.h" | 40 #include "net/url_request/url_request_status.h" |
| 40 #include "net/url_request/url_request_test_util.h" | 41 #include "net/url_request/url_request_test_util.h" |
| 41 #include "testing/gtest/include/gtest/gtest.h" | 42 #include "testing/gtest/include/gtest/gtest.h" |
| 42 | 43 |
| 43 using content::ResourceType; | 44 using content::ResourceType; |
| 44 | 45 |
| 45 namespace extensions { | 46 namespace extensions { |
| 46 namespace { | 47 namespace { |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 int DoRequest(const Extension& extension, const std::string& relative_path) { | 240 int DoRequest(const Extension& extension, const std::string& relative_path) { |
| 240 if (!extension_info_map_->extensions().Contains(extension.id())) { | 241 if (!extension_info_map_->extensions().Contains(extension.id())) { |
| 241 extension_info_map_->AddExtension(&extension, | 242 extension_info_map_->AddExtension(&extension, |
| 242 base::Time::Now(), | 243 base::Time::Now(), |
| 243 false, // incognito_enabled | 244 false, // incognito_enabled |
| 244 false); // notifications_disabled | 245 false); // notifications_disabled |
| 245 } | 246 } |
| 246 std::unique_ptr<net::URLRequest> request( | 247 std::unique_ptr<net::URLRequest> request( |
| 247 resource_context_.GetRequestContext()->CreateRequest( | 248 resource_context_.GetRequestContext()->CreateRequest( |
| 248 extension.GetResourceURL(relative_path), net::DEFAULT_PRIORITY, | 249 extension.GetResourceURL(relative_path), net::DEFAULT_PRIORITY, |
| 249 &test_delegate_)); | 250 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 250 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); | 251 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 251 return test_delegate_.request_status(); | 252 return test_delegate_.request_status(); |
| 252 } | 253 } |
| 253 | 254 |
| 254 protected: | 255 protected: |
| 255 content::TestBrowserThreadBundle thread_bundle_; | 256 content::TestBrowserThreadBundle thread_bundle_; |
| 256 scoped_refptr<InfoMap> extension_info_map_; | 257 scoped_refptr<InfoMap> extension_info_map_; |
| 257 net::URLRequestJobFactoryImpl job_factory_; | 258 net::URLRequestJobFactoryImpl job_factory_; |
| 258 const net::URLRequestJobFactory* old_factory_; | 259 const net::URLRequestJobFactory* old_factory_; |
| 259 net::TestDelegate test_delegate_; | 260 net::TestDelegate test_delegate_; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 extension.get(), base::Time::Now(), cases[i].incognito_enabled, false); | 295 extension.get(), base::Time::Now(), cases[i].incognito_enabled, false); |
| 295 | 296 |
| 296 // First test a main frame request. | 297 // First test a main frame request. |
| 297 { | 298 { |
| 298 // It doesn't matter that the resource doesn't exist. If the resource | 299 // It doesn't matter that the resource doesn't exist. If the resource |
| 299 // is blocked, we should see BLOCKED_BY_CLIENT. Otherwise, the request | 300 // is blocked, we should see BLOCKED_BY_CLIENT. Otherwise, the request |
| 300 // should just fail because the file doesn't exist. | 301 // should just fail because the file doesn't exist. |
| 301 std::unique_ptr<net::URLRequest> request( | 302 std::unique_ptr<net::URLRequest> request( |
| 302 resource_context_.GetRequestContext()->CreateRequest( | 303 resource_context_.GetRequestContext()->CreateRequest( |
| 303 extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY, | 304 extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY, |
| 304 &test_delegate_)); | 305 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 305 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); | 306 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 306 | 307 |
| 307 if (cases[i].should_allow_main_frame_load) { | 308 if (cases[i].should_allow_main_frame_load) { |
| 308 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, test_delegate_.request_status()) | 309 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, test_delegate_.request_status()) |
| 309 << cases[i].name; | 310 << cases[i].name; |
| 310 } else { | 311 } else { |
| 311 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()) | 312 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()) |
| 312 << cases[i].name; | 313 << cases[i].name; |
| 313 } | 314 } |
| 314 } | 315 } |
| 315 | 316 |
| 316 // Now do a subframe request. | 317 // Now do a subframe request. |
| 317 { | 318 { |
| 318 // With PlzNavigate, the subframe navigation requests are blocked in | 319 // With PlzNavigate, the subframe navigation requests are blocked in |
| 319 // ExtensionNavigationThrottle which isn't added in this unit test. This | 320 // ExtensionNavigationThrottle which isn't added in this unit test. This |
| 320 // is tested in an integration test in | 321 // is tested in an integration test in |
| 321 // ExtensionResourceRequestPolicyTest.IframeNavigateToInaccessible. | 322 // ExtensionResourceRequestPolicyTest.IframeNavigateToInaccessible. |
| 322 if (!content::IsBrowserSideNavigationEnabled()) { | 323 if (!content::IsBrowserSideNavigationEnabled()) { |
| 323 std::unique_ptr<net::URLRequest> request( | 324 std::unique_ptr<net::URLRequest> request( |
| 324 resource_context_.GetRequestContext()->CreateRequest( | 325 resource_context_.GetRequestContext()->CreateRequest( |
| 325 extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY, | 326 extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY, |
| 326 &test_delegate_)); | 327 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 327 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); | 328 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); |
| 328 | 329 |
| 329 if (cases[i].should_allow_sub_frame_load) { | 330 if (cases[i].should_allow_sub_frame_load) { |
| 330 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, test_delegate_.request_status()) | 331 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, test_delegate_.request_status()) |
| 331 << cases[i].name; | 332 << cases[i].name; |
| 332 } else { | 333 } else { |
| 333 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()) | 334 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()) |
| 334 << cases[i].name; | 335 << cases[i].name; |
| 335 } | 336 } |
| 336 } | 337 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 358 extension_info_map_->AddExtension(extension.get(), | 359 extension_info_map_->AddExtension(extension.get(), |
| 359 base::Time::Now(), | 360 base::Time::Now(), |
| 360 false, | 361 false, |
| 361 false); | 362 false); |
| 362 | 363 |
| 363 // First test it with the extension enabled. | 364 // First test it with the extension enabled. |
| 364 { | 365 { |
| 365 std::unique_ptr<net::URLRequest> request( | 366 std::unique_ptr<net::URLRequest> request( |
| 366 resource_context_.GetRequestContext()->CreateRequest( | 367 resource_context_.GetRequestContext()->CreateRequest( |
| 367 extension->GetResourceURL("webstore_icon_16.png"), | 368 extension->GetResourceURL("webstore_icon_16.png"), |
| 368 net::DEFAULT_PRIORITY, &test_delegate_)); | 369 net::DEFAULT_PRIORITY, &test_delegate_, |
| 370 TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 369 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 371 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 370 EXPECT_EQ(net::OK, test_delegate_.request_status()); | 372 EXPECT_EQ(net::OK, test_delegate_.request_status()); |
| 371 CheckForContentLengthHeader(request.get()); | 373 CheckForContentLengthHeader(request.get()); |
| 372 } | 374 } |
| 373 | 375 |
| 374 // And then test it with the extension disabled. | 376 // And then test it with the extension disabled. |
| 375 extension_info_map_->RemoveExtension(extension->id(), | 377 extension_info_map_->RemoveExtension(extension->id(), |
| 376 UnloadedExtensionInfo::REASON_DISABLE); | 378 UnloadedExtensionInfo::REASON_DISABLE); |
| 377 { | 379 { |
| 378 std::unique_ptr<net::URLRequest> request( | 380 std::unique_ptr<net::URLRequest> request( |
| 379 resource_context_.GetRequestContext()->CreateRequest( | 381 resource_context_.GetRequestContext()->CreateRequest( |
| 380 extension->GetResourceURL("webstore_icon_16.png"), | 382 extension->GetResourceURL("webstore_icon_16.png"), |
| 381 net::DEFAULT_PRIORITY, &test_delegate_)); | 383 net::DEFAULT_PRIORITY, &test_delegate_, |
| 384 TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 382 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 385 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 383 EXPECT_EQ(net::OK, test_delegate_.request_status()); | 386 EXPECT_EQ(net::OK, test_delegate_.request_status()); |
| 384 CheckForContentLengthHeader(request.get()); | 387 CheckForContentLengthHeader(request.get()); |
| 385 } | 388 } |
| 386 } | 389 } |
| 387 | 390 |
| 388 // Tests that a URL request for resource from an extension returns a few | 391 // Tests that a URL request for resource from an extension returns a few |
| 389 // expected response headers. | 392 // expected response headers. |
| 390 TEST_F(ExtensionProtocolsTest, ResourceRequestResponseHeaders) { | 393 TEST_F(ExtensionProtocolsTest, ResourceRequestResponseHeaders) { |
| 391 // Register a non-incognito extension protocol handler. | 394 // Register a non-incognito extension protocol handler. |
| 392 SetProtocolHandler(false); | 395 SetProtocolHandler(false); |
| 393 | 396 |
| 394 scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension(); | 397 scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension(); |
| 395 extension_info_map_->AddExtension(extension.get(), | 398 extension_info_map_->AddExtension(extension.get(), |
| 396 base::Time::Now(), | 399 base::Time::Now(), |
| 397 false, | 400 false, |
| 398 false); | 401 false); |
| 399 | 402 |
| 400 { | 403 { |
| 401 std::unique_ptr<net::URLRequest> request( | 404 std::unique_ptr<net::URLRequest> request( |
| 402 resource_context_.GetRequestContext()->CreateRequest( | 405 resource_context_.GetRequestContext()->CreateRequest( |
| 403 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, | 406 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 404 &test_delegate_)); | 407 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 405 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 408 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 406 EXPECT_EQ(net::OK, test_delegate_.request_status()); | 409 EXPECT_EQ(net::OK, test_delegate_.request_status()); |
| 407 | 410 |
| 408 // Check that cache-related headers are set. | 411 // Check that cache-related headers are set. |
| 409 std::string etag; | 412 std::string etag; |
| 410 request->GetResponseHeaderByName("ETag", &etag); | 413 request->GetResponseHeaderByName("ETag", &etag); |
| 411 EXPECT_TRUE(base::StartsWith(etag, "\"", base::CompareCase::SENSITIVE)); | 414 EXPECT_TRUE(base::StartsWith(etag, "\"", base::CompareCase::SENSITIVE)); |
| 412 EXPECT_TRUE(base::EndsWith(etag, "\"", base::CompareCase::SENSITIVE)); | 415 EXPECT_TRUE(base::EndsWith(etag, "\"", base::CompareCase::SENSITIVE)); |
| 413 | 416 |
| 414 std::string revalidation_header; | 417 std::string revalidation_header; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 435 false, | 438 false, |
| 436 false); | 439 false); |
| 437 | 440 |
| 438 // All MAIN_FRAME requests should succeed. SUB_FRAME requests that are not | 441 // All MAIN_FRAME requests should succeed. SUB_FRAME requests that are not |
| 439 // explicitly listed in web_accesible_resources or same-origin to the parent | 442 // explicitly listed in web_accesible_resources or same-origin to the parent |
| 440 // should not succeed. | 443 // should not succeed. |
| 441 { | 444 { |
| 442 std::unique_ptr<net::URLRequest> request( | 445 std::unique_ptr<net::URLRequest> request( |
| 443 resource_context_.GetRequestContext()->CreateRequest( | 446 resource_context_.GetRequestContext()->CreateRequest( |
| 444 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, | 447 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 445 &test_delegate_)); | 448 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 446 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); | 449 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 447 EXPECT_EQ(net::OK, test_delegate_.request_status()); | 450 EXPECT_EQ(net::OK, test_delegate_.request_status()); |
| 448 } | 451 } |
| 449 { | 452 { |
| 450 // With PlzNavigate, the subframe navigation requests are blocked in | 453 // With PlzNavigate, the subframe navigation requests are blocked in |
| 451 // ExtensionNavigationThrottle which isn't added in this unit test. This is | 454 // ExtensionNavigationThrottle which isn't added in this unit test. This is |
| 452 // tested in an integration test in | 455 // tested in an integration test in |
| 453 // ExtensionResourceRequestPolicyTest.IframeNavigateToInaccessible. | 456 // ExtensionResourceRequestPolicyTest.IframeNavigateToInaccessible. |
| 454 if (!content::IsBrowserSideNavigationEnabled()) { | 457 if (!content::IsBrowserSideNavigationEnabled()) { |
| 455 std::unique_ptr<net::URLRequest> request( | 458 std::unique_ptr<net::URLRequest> request( |
| 456 resource_context_.GetRequestContext()->CreateRequest( | 459 resource_context_.GetRequestContext()->CreateRequest( |
| 457 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, | 460 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 458 &test_delegate_)); | 461 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 459 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); | 462 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); |
| 460 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()); | 463 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()); |
| 461 } | 464 } |
| 462 } | 465 } |
| 463 | 466 |
| 464 // And subresource types, such as media, should fail. | 467 // And subresource types, such as media, should fail. |
| 465 { | 468 { |
| 466 std::unique_ptr<net::URLRequest> request( | 469 std::unique_ptr<net::URLRequest> request( |
| 467 resource_context_.GetRequestContext()->CreateRequest( | 470 resource_context_.GetRequestContext()->CreateRequest( |
| 468 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, | 471 extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY, |
| 469 &test_delegate_)); | 472 &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); |
| 470 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); | 473 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 471 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()); | 474 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status()); |
| 472 } | 475 } |
| 473 } | 476 } |
| 474 | 477 |
| 475 TEST_F(ExtensionProtocolsTest, MetadataFolder) { | 478 TEST_F(ExtensionProtocolsTest, MetadataFolder) { |
| 476 SetProtocolHandler(false); | 479 SetProtocolHandler(false); |
| 477 | 480 |
| 478 base::FilePath extension_dir = GetTestPath("metadata_folder"); | 481 base::FilePath extension_dir = GetTestPath("metadata_folder"); |
| 479 std::string error; | 482 std::string error; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 content_verifier_->OnExtensionLoaded(testing_profile_.get(), extension.get()); | 596 content_verifier_->OnExtensionLoaded(testing_profile_.get(), extension.get()); |
| 594 // Wait for PostTask to ContentVerifierIOData::AddData() to finish. | 597 // Wait for PostTask to ContentVerifierIOData::AddData() to finish. |
| 595 content::RunAllPendingInMessageLoop(); | 598 content::RunAllPendingInMessageLoop(); |
| 596 | 599 |
| 597 // Request foo.js. | 600 // Request foo.js. |
| 598 EXPECT_EQ(net::OK, DoRequest(*extension, kFooJs)); | 601 EXPECT_EQ(net::OK, DoRequest(*extension, kFooJs)); |
| 599 test_job_delegate.WaitForDoneReading(extension->id()); | 602 test_job_delegate.WaitForDoneReading(extension->id()); |
| 600 } | 603 } |
| 601 | 604 |
| 602 } // namespace extensions | 605 } // namespace extensions |
| OLD | NEW |