1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "BackgroundUtils.h"
7 #include "MainThreadUtils.h"
8 #include "mozilla/Assertions.h"
9 #include "mozilla/ipc/PBackgroundSharedTypes.h"
10 #include "nsIPrincipal.h"
11 #include "nsIScriptSecurityManager.h"
13 #include "nsNetUtil.h"
14 #include "nsNullPrincipal.h"
15 #include "nsServiceManagerUtils.h"
21 already_AddRefed
<nsIPrincipal
>
22 PrincipalInfoToPrincipal(const PrincipalInfo
& aPrincipalInfo
,
23 nsresult
* aOptionalResult
)
25 MOZ_ASSERT(NS_IsMainThread());
26 MOZ_ASSERT(aPrincipalInfo
.type() != PrincipalInfo::T__None
);
29 nsresult
& rv
= aOptionalResult
? *aOptionalResult
: stackResult
;
31 nsCOMPtr
<nsIScriptSecurityManager
> secMan
=
32 do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID
, &rv
);
33 if (NS_WARN_IF(NS_FAILED(rv
))) {
37 nsCOMPtr
<nsIPrincipal
> principal
;
39 switch (aPrincipalInfo
.type()) {
40 case PrincipalInfo::TSystemPrincipalInfo
: {
41 rv
= secMan
->GetSystemPrincipal(getter_AddRefs(principal
));
42 if (NS_WARN_IF(NS_FAILED(rv
))) {
46 return principal
.forget();
49 case PrincipalInfo::TNullPrincipalInfo
: {
50 principal
= do_CreateInstance(NS_NULLPRINCIPAL_CONTRACTID
, &rv
);
51 if (NS_WARN_IF(NS_FAILED(rv
))) {
55 return principal
.forget();
58 case PrincipalInfo::TContentPrincipalInfo
: {
59 const ContentPrincipalInfo
& info
=
60 aPrincipalInfo
.get_ContentPrincipalInfo();
63 rv
= NS_NewURI(getter_AddRefs(uri
), info
.spec());
64 if (NS_WARN_IF(NS_FAILED(rv
))) {
68 if (info
.appId() == nsIScriptSecurityManager::UNKNOWN_APP_ID
) {
69 rv
= secMan
->GetSimpleCodebasePrincipal(uri
, getter_AddRefs(principal
));
71 rv
= secMan
->GetAppCodebasePrincipal(uri
,
73 info
.isInBrowserElement(),
74 getter_AddRefs(principal
));
76 if (NS_WARN_IF(NS_FAILED(rv
))) {
80 return principal
.forget();
84 MOZ_CRASH("Unknown PrincipalInfo type!");
87 MOZ_CRASH("Should never get here!");
91 PrincipalToPrincipalInfo(nsIPrincipal
* aPrincipal
,
92 PrincipalInfo
* aPrincipalInfo
)
94 MOZ_ASSERT(NS_IsMainThread());
95 MOZ_ASSERT(aPrincipal
);
96 MOZ_ASSERT(aPrincipalInfo
);
99 nsresult rv
= aPrincipal
->GetIsNullPrincipal(&isNullPointer
);
100 if (NS_WARN_IF(NS_FAILED(rv
))) {
105 *aPrincipalInfo
= NullPrincipalInfo();
109 nsCOMPtr
<nsIScriptSecurityManager
> secMan
=
110 do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID
, &rv
);
111 if (NS_WARN_IF(NS_FAILED(rv
))) {
115 bool isSystemPrincipal
;
116 rv
= secMan
->IsSystemPrincipal(aPrincipal
, &isSystemPrincipal
);
117 if (NS_WARN_IF(NS_FAILED(rv
))) {
121 if (isSystemPrincipal
) {
122 *aPrincipalInfo
= SystemPrincipalInfo();
126 nsCOMPtr
<nsIURI
> uri
;
127 rv
= aPrincipal
->GetURI(getter_AddRefs(uri
));
128 if (NS_WARN_IF(NS_FAILED(rv
))) {
133 rv
= uri
->GetSpec(spec
);
134 if (NS_WARN_IF(NS_FAILED(rv
))) {
139 rv
= aPrincipal
->GetAppId(&appId
);
140 if (NS_WARN_IF(NS_FAILED(rv
))) {
144 bool isInBrowserElement
;
145 rv
= aPrincipal
->GetIsInBrowserElement(&isInBrowserElement
);
146 if (NS_WARN_IF(NS_FAILED(rv
))) {
150 *aPrincipalInfo
= ContentPrincipalInfo(appId
, isInBrowserElement
, spec
);
155 } // namespace mozilla