15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_url_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_url_util_dev.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/url_util_dev.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(URLUtil); 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool ComponentEquals(const PP_URLComponent_Dev& component, 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int begin, int len) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return component.begin == begin && component.len == len; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLUtil::Init() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) util_ = pp::URLUtil_Dev::Get(); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!util_; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLUtil::RunTests(const std::string& filter) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(Canonicalize, filter); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ResolveRelative, filter); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(IsSameSecurityOrigin, filter); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(DocumentCanRequest, filter); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(DocumentCanAccessDocument, filter); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetDocumentURL, filter); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetPluginInstanceURL, filter); 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RUN_TEST(GetPluginReferrerURL, filter); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestCanonicalize() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test no canonicalize output. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var result = util_->Canonicalize("http://Google.com"); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.AsString() == "http://google.com/"); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test all the components 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_URLComponents_Dev c; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = util_->Canonicalize( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://me:pw@Google.com:1234/path?query#ref ", 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &c); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.AsString() == 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0 1 2 3 4 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0123456789012345678901234567890123456789012 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://me:pw@google.com:1234/path?query#ref"); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.scheme, 0, 4)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.username, 7, 2)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.password, 10, 2)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.host, 13, 10)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.port, 24, 4)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.path, 28, 5)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.query, 34, 5)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.ref, 40, 3)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test minimal components. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = util_->Canonicalize("http://google.com/", &c); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0 1 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0123456789012345678 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.AsString() == "http://google.com/"); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.scheme, 0, 4)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.username, 0, -1)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.password, 0, -1)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.host, 7, 10)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.port, 0, -1)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.path, 17, 1)); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.query, 0, -1)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ComponentEquals(c.ref, 0, -1)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestResolveRelative() { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTestCount = 6; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestCase { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* base; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* relative; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected; // NULL if 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[kTestCount] = { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://google.com/", "foo", "http://google.com/foo"}, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://google.com/foo", "/bar", "http://google.com/bar"}, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://foo/", "http://bar", "http://bar/"}, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"data:foo", "/bar", NULL}, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"data:foo", "http://foo/", "http://foo/"}, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://foo/", "", "http://foo/"}, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kTestCount; i++) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var result = util_->ResolveRelativeToURL(test_cases[i].base, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].relative); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_cases[i].expected == NULL) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.is_null()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result.AsString() == test_cases[i].expected); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestIsSameSecurityOrigin() { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(util_->IsSameSecurityOrigin("http://google.com/", 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://example.com/")); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(util_->IsSameSecurityOrigin("http://google.com/foo", 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://google.com/bar")); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestDocumentCanRequest() { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is hard to test, but we can at least verify we can't request 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // some random domain. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(util_->DocumentCanRequest(instance_, "http://evil.com/")); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestDocumentCanAccessDocument() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is hard to test, but we can at least verify we can access ourselves. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(util_->DocumentCanAccessDocument(instance_, instance_)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestGetDocumentURL() { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var url = util_->GetDocumentURL(instance_); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(url.is_string()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::VarPrivate window = instance_->GetWindowObject(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var href = window.GetProperty("location").GetProperty("href"); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(href.is_string()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the test framework, they should be the same. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(url.AsString(), href.AsString()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestURLUtil::TestGetPluginInstanceURL() { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var url = util_->GetPluginInstanceURL(instance_); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(url.is_string()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see test_case.html 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(url.AsString(), "http://a.b.c/test"); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string TestURLUtil::TestGetPluginReferrerURL() { 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pp::Var url = util_->GetPluginReferrerURL(instance_); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(url.is_string()); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pp::VarPrivate window = instance_->GetWindowObject(); 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pp::Var href = window.GetProperty("location").GetProperty("href"); 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(href.is_string()); 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(url.AsString(), href.AsString()); 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PASS(); 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 151