| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <map> |
| 9 |
| 8 #include "base/logging.h" | 10 #include "base/logging.h" |
| 9 #include "base/macros.h" | 11 #include "base/macros.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "url/gurl.h" | 13 #include "url/gurl.h" |
| 12 #include "url/origin.h" | 14 #include "url/origin.h" |
| 13 | 15 |
| 14 namespace { | 16 namespace { |
| 15 | 17 |
| 16 void ExpectParsedUrlsEqual(const GURL& a, const GURL& b) { | 18 void ExpectParsedUrlsEqual(const GURL& a, const GURL& b) { |
| 17 EXPECT_EQ(a, b); | 19 EXPECT_EQ(a, b); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 34 EXPECT_EQ(a_parsed.ref.begin, b_parsed.ref.begin); | 36 EXPECT_EQ(a_parsed.ref.begin, b_parsed.ref.begin); |
| 35 EXPECT_EQ(a_parsed.ref.len, b_parsed.ref.len); | 37 EXPECT_EQ(a_parsed.ref.len, b_parsed.ref.len); |
| 36 } | 38 } |
| 37 | 39 |
| 38 TEST(OriginTest, UniqueOriginComparison) { | 40 TEST(OriginTest, UniqueOriginComparison) { |
| 39 url::Origin unique_origin; | 41 url::Origin unique_origin; |
| 40 EXPECT_EQ("", unique_origin.scheme()); | 42 EXPECT_EQ("", unique_origin.scheme()); |
| 41 EXPECT_EQ("", unique_origin.host()); | 43 EXPECT_EQ("", unique_origin.host()); |
| 42 EXPECT_EQ(0, unique_origin.port()); | 44 EXPECT_EQ(0, unique_origin.port()); |
| 43 EXPECT_TRUE(unique_origin.unique()); | 45 EXPECT_TRUE(unique_origin.unique()); |
| 44 EXPECT_FALSE(unique_origin.IsSameOriginWith(unique_origin)); | 46 EXPECT_TRUE(unique_origin.IsSameOriginWith(unique_origin)); |
| 45 | 47 |
| 46 const char* const urls[] = {"data:text/html,Hello!", | 48 const char* const urls[] = {"data:text/html,Hello!", |
| 47 "javascript:alert(1)", | 49 "javascript:alert(1)", |
| 48 "file://example.com:443/etc/passwd", | 50 "file://example.com:443/etc/passwd", |
| 49 "yay", | 51 "yay", |
| 50 "http::///invalid.example.com/"}; | 52 "http::///invalid.example.com/"}; |
| 51 | 53 |
| 52 for (auto* test_url : urls) { | 54 for (auto* test_url : urls) { |
| 53 SCOPED_TRACE(test_url); | 55 SCOPED_TRACE(test_url); |
| 54 GURL url(test_url); | 56 GURL url(test_url); |
| 55 url::Origin origin(url); | 57 url::Origin origin(url); |
| 58 url::Origin origin_copy(origin); |
| 56 EXPECT_EQ("", origin.scheme()); | 59 EXPECT_EQ("", origin.scheme()); |
| 57 EXPECT_EQ("", origin.host()); | 60 EXPECT_EQ("", origin.host()); |
| 58 EXPECT_EQ(0, origin.port()); | 61 EXPECT_EQ(0, origin.port()); |
| 59 EXPECT_TRUE(origin.unique()); | 62 EXPECT_TRUE(origin.unique()); |
| 60 EXPECT_FALSE(origin.IsSameOriginWith(origin)); | 63 EXPECT_TRUE(origin.IsSameOriginWith(origin)); |
| 61 EXPECT_FALSE(unique_origin.IsSameOriginWith(origin)); | 64 EXPECT_FALSE(unique_origin.IsSameOriginWith(origin)); |
| 62 EXPECT_FALSE(origin.IsSameOriginWith(unique_origin)); | 65 EXPECT_FALSE(origin.IsSameOriginWith(unique_origin)); |
| 63 | 66 |
| 64 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); | 67 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); |
| 68 |
| 69 // A unique origin should always be same origin to itself… |
| 70 EXPECT_TRUE(origin.IsSameOriginWith(origin_copy)); |
| 71 |
| 72 // …but it shouldn't be same origin if it's created again. |
| 73 url::Origin origin2(url); |
| 74 EXPECT_FALSE(origin.IsSameOriginWith(origin2)); |
| 75 EXPECT_FALSE(origin2.IsSameOriginWith(origin)); |
| 65 } | 76 } |
| 66 } | 77 } |
| 67 | 78 |
| 68 TEST(OriginTest, ConstructFromTuple) { | 79 TEST(OriginTest, ConstructFromTuple) { |
| 69 struct TestCases { | 80 struct TestCases { |
| 70 const char* const scheme; | 81 const char* const scheme; |
| 71 const char* const host; | 82 const char* const host; |
| 72 const uint16_t port; | 83 const uint16_t port; |
| 73 const char* const suborigin; | 84 const char* const suborigin; |
| 74 } cases[] = { | 85 } cases[] = { |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 EXPECT_TRUE(origin2.IsSamePhysicalOriginWith(origin2)); | 325 EXPECT_TRUE(origin2.IsSamePhysicalOriginWith(origin2)); |
| 315 EXPECT_EQ(test_case.is_same_physical_origin, | 326 EXPECT_EQ(test_case.is_same_physical_origin, |
| 316 origin1.IsSamePhysicalOriginWith(origin2)); | 327 origin1.IsSamePhysicalOriginWith(origin2)); |
| 317 EXPECT_EQ(test_case.is_same_physical_origin, | 328 EXPECT_EQ(test_case.is_same_physical_origin, |
| 318 origin2.IsSamePhysicalOriginWith(origin1)); | 329 origin2.IsSamePhysicalOriginWith(origin1)); |
| 319 } | 330 } |
| 320 } | 331 } |
| 321 | 332 |
| 322 TEST(OriginTest, Comparison) { | 333 TEST(OriginTest, Comparison) { |
| 323 // These URLs are arranged in increasing order: | 334 // These URLs are arranged in increasing order: |
| 324 const char* const urls[] = { | 335 url::Origin origins[] = { |
| 325 "data:uniqueness", | 336 url::Origin(GURL("data:uniqueness")), url::Origin(GURL("http://a:80")), |
| 326 "http://a:80", | 337 url::Origin(GURL("http://b:80")), url::Origin(GURL("https://a:80")), |
| 327 "http://b:80", | 338 url::Origin(GURL("https://b:80")), url::Origin(GURL("http://a:81")), |
| 328 "https://a:80", | 339 url::Origin(GURL("http://b:81")), url::Origin(GURL("https://a:81")), |
| 329 "https://b:80", | 340 url::Origin(GURL("https://b:81")), |
| 330 "http://a:81", | |
| 331 "http://b:81", | |
| 332 "https://a:81", | |
| 333 "https://b:81", | |
| 334 }; | 341 }; |
| 335 | 342 |
| 336 for (size_t i = 0; i < arraysize(urls); i++) { | 343 for (size_t i = 0; i < arraysize(origins); i++) { |
| 337 GURL current_url(urls[i]); | 344 for (size_t j = i; j < arraysize(origins); j++) { |
| 338 url::Origin current(current_url); | 345 EXPECT_EQ(i < j, origins[i] < origins[j]) << i << " < " << j; |
| 339 for (size_t j = i; j < arraysize(urls); j++) { | 346 EXPECT_EQ(j < i, origins[j] < origins[i]) << j << " < " << i; |
| 340 GURL compare_url(urls[j]); | |
| 341 url::Origin to_compare(compare_url); | |
| 342 EXPECT_EQ(i < j, current < to_compare) << i << " < " << j; | |
| 343 EXPECT_EQ(j < i, to_compare < current) << j << " < " << i; | |
| 344 } | 347 } |
| 345 } | 348 } |
| 346 } | 349 } |
| 347 | 350 |
| 348 TEST(OriginTest, UnsafelyCreate) { | 351 TEST(OriginTest, UnsafelyCreate) { |
| 349 struct TestCase { | 352 struct TestCase { |
| 350 const char* scheme; | 353 const char* scheme; |
| 351 const char* host; | 354 const char* host; |
| 352 uint16_t port; | 355 uint16_t port; |
| 353 } cases[] = { | 356 } cases[] = { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 | 401 |
| 399 for (const auto& test : cases) { | 402 for (const auto& test : cases) { |
| 400 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":" | 403 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":" |
| 401 << test.port); | 404 << test.port); |
| 402 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization( | 405 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization( |
| 403 test.scheme, test.host, test.port); | 406 test.scheme, test.host, test.port); |
| 404 EXPECT_EQ("", origin.scheme()); | 407 EXPECT_EQ("", origin.scheme()); |
| 405 EXPECT_EQ("", origin.host()); | 408 EXPECT_EQ("", origin.host()); |
| 406 EXPECT_EQ(0, origin.port()); | 409 EXPECT_EQ(0, origin.port()); |
| 407 EXPECT_TRUE(origin.unique()); | 410 EXPECT_TRUE(origin.unique()); |
| 408 EXPECT_FALSE(origin.IsSameOriginWith(origin)); | |
| 409 | 411 |
| 410 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); | 412 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); |
| 413 |
| 414 // A unique origin should always be same origin to itself… |
| 415 EXPECT_TRUE(origin.IsSameOriginWith(origin)); |
| 416 |
| 417 // …but it shouldn't be same origin if it's created again. |
| 418 url::Origin origin2 = url::Origin::UnsafelyCreateOriginWithoutNormalization( |
| 419 test.scheme, test.host, test.port); |
| 420 EXPECT_FALSE(origin.IsSameOriginWith(origin2)); |
| 421 EXPECT_FALSE(origin2.IsSameOriginWith(origin)); |
| 411 } | 422 } |
| 412 } | 423 } |
| 413 | 424 |
| 414 TEST(OriginTest, UnsafelyCreateUniqueViaEmbeddedNulls) { | 425 TEST(OriginTest, UnsafelyCreateUniqueViaEmbeddedNulls) { |
| 415 struct TestCases { | 426 struct TestCases { |
| 416 const char* scheme; | 427 const char* scheme; |
| 417 size_t scheme_length; | 428 size_t scheme_length; |
| 418 const char* host; | 429 const char* host; |
| 419 size_t host_length; | 430 size_t host_length; |
| 420 uint16_t port; | 431 uint16_t port; |
| 421 } cases[] = {{"http\0more", 9, "example.com", 11, 80}, | 432 } cases[] = {{"http\0more", 9, "example.com", 11, 80}, |
| 422 {"http\0", 5, "example.com", 11, 80}, | 433 {"http\0", 5, "example.com", 11, 80}, |
| 423 {"\0http", 5, "example.com", 11, 80}, | 434 {"\0http", 5, "example.com", 11, 80}, |
| 424 {"http", 4, "example.com\0not-example.com", 27, 80}, | 435 {"http", 4, "example.com\0not-example.com", 27, 80}, |
| 425 {"http", 4, "example.com\0", 12, 80}, | 436 {"http", 4, "example.com\0", 12, 80}, |
| 426 {"http", 4, "\0example.com", 12, 80}}; | 437 {"http", 4, "\0example.com", 12, 80}}; |
| 427 | 438 |
| 428 for (const auto& test : cases) { | 439 for (const auto& test : cases) { |
| 429 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":" | 440 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":" |
| 430 << test.port); | 441 << test.port); |
| 431 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization( | 442 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization( |
| 432 std::string(test.scheme, test.scheme_length), | 443 std::string(test.scheme, test.scheme_length), |
| 433 std::string(test.host, test.host_length), test.port); | 444 std::string(test.host, test.host_length), test.port); |
| 434 EXPECT_EQ("", origin.scheme()); | 445 EXPECT_EQ("", origin.scheme()); |
| 435 EXPECT_EQ("", origin.host()); | 446 EXPECT_EQ("", origin.host()); |
| 436 EXPECT_EQ(0, origin.port()); | 447 EXPECT_EQ(0, origin.port()); |
| 437 EXPECT_TRUE(origin.unique()); | 448 EXPECT_TRUE(origin.unique()); |
| 438 EXPECT_FALSE(origin.IsSameOriginWith(origin)); | |
| 439 | 449 |
| 440 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); | 450 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); |
| 451 |
| 452 // A unique origin should always be same origin to itself… |
| 453 EXPECT_TRUE(origin.IsSameOriginWith(origin)); |
| 454 |
| 455 // …but it shouldn't be same origin if it's created again. |
| 456 url::Origin origin2 = url::Origin::UnsafelyCreateOriginWithoutNormalization( |
| 457 std::string(test.scheme, test.scheme_length), |
| 458 std::string(test.host, test.host_length), test.port); |
| 459 EXPECT_FALSE(origin.IsSameOriginWith(origin2)); |
| 460 EXPECT_FALSE(origin2.IsSameOriginWith(origin)); |
| 441 } | 461 } |
| 442 } | 462 } |
| 443 | 463 |
| 444 TEST(OriginTest, DomainIs) { | 464 TEST(OriginTest, DomainIs) { |
| 445 const struct { | 465 const struct { |
| 446 const char* url; | 466 const char* url; |
| 447 const char* lower_ascii_domain; | 467 const char* lower_ascii_domain; |
| 448 bool expected_domain_is; | 468 bool expected_domain_is; |
| 449 } kTestCases[] = { | 469 } kTestCases[] = { |
| 450 {"http://google.com/foo", "google.com", true}, | 470 {"http://google.com/foo", "google.com", true}, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 // If the URL is invalid, DomainIs returns false. | 511 // If the URL is invalid, DomainIs returns false. |
| 492 GURL invalid_url("google.com"); | 512 GURL invalid_url("google.com"); |
| 493 ASSERT_FALSE(invalid_url.is_valid()); | 513 ASSERT_FALSE(invalid_url.is_valid()); |
| 494 EXPECT_FALSE(url::Origin(invalid_url).DomainIs("google.com")); | 514 EXPECT_FALSE(url::Origin(invalid_url).DomainIs("google.com")); |
| 495 | 515 |
| 496 // Unique origins. | 516 // Unique origins. |
| 497 EXPECT_FALSE(url::Origin().DomainIs("")); | 517 EXPECT_FALSE(url::Origin().DomainIs("")); |
| 498 EXPECT_FALSE(url::Origin().DomainIs("com")); | 518 EXPECT_FALSE(url::Origin().DomainIs("com")); |
| 499 } | 519 } |
| 500 | 520 |
| 521 TEST(OriginTest, UniqueOriginsInSet) { |
| 522 std::set<url::Origin> origins; |
| 523 EXPECT_TRUE(origins.empty()); |
| 524 |
| 525 url::Origin origin1; |
| 526 origins.insert(origin1); |
| 527 EXPECT_EQ(1u, origins.size()); |
| 528 EXPECT_TRUE(origins.find(origin1) != origins.end()); |
| 529 |
| 530 url::Origin origin2; |
| 531 origins.insert(origin2); |
| 532 EXPECT_EQ(2u, origins.size()); |
| 533 EXPECT_TRUE(origins.find(origin2) != origins.end()); |
| 534 |
| 535 { |
| 536 auto result = origins.insert(origin1); |
| 537 EXPECT_FALSE(result.second); |
| 538 EXPECT_TRUE(origin1.IsSameOriginWith(*result.first)); |
| 539 } |
| 540 |
| 541 { |
| 542 auto result = origins.insert(origin2); |
| 543 EXPECT_FALSE(result.second); |
| 544 EXPECT_TRUE(origin2.IsSameOriginWith(*result.first)); |
| 545 } |
| 546 |
| 547 EXPECT_EQ(2u, origins.size()); |
| 548 } |
| 549 |
| 501 } // namespace url | 550 } // namespace url |
| OLD | NEW |