/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "gtest/gtest.h" #include "mozilla/gtest/MozAssertions.h" #include "mozilla/BasePrincipal.h" #include "mozilla/ContentPrincipal.h" #include "mozilla/NullPrincipal.h" #include "mozilla/ipc/BackgroundUtils.h" #include "mozilla/ipc/PBackgroundSharedTypes.h" #include "nsIEventTarget.h" #include "nsISerialEventTarget.h" #include "nsIURIMutator.h" #include "nsNetUtil.h" #include "nsPrintfCString.h" #include "nsThreadUtils.h" namespace mozilla { template void RunOnBackgroundThread(F&& aFunction) { nsCOMPtr backgroundQueue; ASSERT_NS_SUCCEEDED(NS_CreateBackgroundTaskQueue( "RunOnBackgroundThread", getter_AddRefs(backgroundQueue))); ASSERT_NS_SUCCEEDED(NS_DispatchAndSpinEventLoopUntilComplete( "RunOnBackgroundThread"_ns, backgroundQueue, NS_NewRunnableFunction("RunOnBackgroundThread", std::forward(aFunction)))); } TEST(BackgroundThreadPrincipal, CreateContent) { RunOnBackgroundThread([] { nsCOMPtr contentURI; ASSERT_NS_SUCCEEDED(NS_NewURI(getter_AddRefs(contentURI), "http://subdomain.example.com:8000"_ns)); RefPtr contentPrincipal = BasePrincipal::CreateContentPrincipal(contentURI, OriginAttributes()); EXPECT_TRUE(contentPrincipal->Is()); nsCString origin; ASSERT_NS_SUCCEEDED(contentPrincipal->GetOrigin(origin)); EXPECT_EQ(origin, "http://subdomain.example.com:8000"_ns); nsCString siteOrigin; ASSERT_NS_SUCCEEDED(contentPrincipal->GetSiteOrigin(siteOrigin)); EXPECT_EQ(siteOrigin, "http://example.com"_ns); }); } TEST(BackgroundThreadPrincipal, CreateNull) { RunOnBackgroundThread([] { nsCOMPtr contentURI; ASSERT_NS_SUCCEEDED(NS_NewURI(getter_AddRefs(contentURI), "data:text/plain,hello world"_ns)); RefPtr principal = BasePrincipal::CreateContentPrincipal(contentURI, OriginAttributes()); EXPECT_TRUE(principal->Is()); nsCString origin; ASSERT_NS_SUCCEEDED(principal->GetOrigin(origin)); EXPECT_TRUE(StringBeginsWith(origin, "moz-nullprincipal:"_ns)); }); } TEST(BackgroundThreadPrincipal, PrincipalInfoConversions) { RunOnBackgroundThread([] { nsCOMPtr contentURI; ASSERT_NS_SUCCEEDED(NS_NewURI(getter_AddRefs(contentURI), "http://subdomain.example.com:8000"_ns)); RefPtr contentPrincipal = BasePrincipal::CreateContentPrincipal(contentURI, OriginAttributes()); EXPECT_TRUE(contentPrincipal->Is()); ipc::PrincipalInfo info; ASSERT_NS_SUCCEEDED(ipc::PrincipalToPrincipalInfo(contentPrincipal, &info)); EXPECT_TRUE(info.type() == ipc::PrincipalInfo::TContentPrincipalInfo); EXPECT_EQ(info.get_ContentPrincipalInfo().spec(), "http://subdomain.example.com:8000/"_ns); EXPECT_EQ(info.get_ContentPrincipalInfo().baseDomain(), "example.com"_ns); auto result = PrincipalInfoToPrincipal(info); ASSERT_TRUE(result.isOk()); nsCOMPtr deserialized = result.unwrap(); EXPECT_TRUE(deserialized->GetIsContentPrincipal()); EXPECT_TRUE(deserialized->Equals(contentPrincipal)); }); } } // namespace mozilla