Bumping manifests a=b2g-bump
[gecko.git] / ipc / glue / BackgroundUtils.cpp
blob5b4feea6b05861433aceb63921dd00624d374d50
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"
12 #include "nsIURI.h"
13 #include "nsNetUtil.h"
14 #include "nsNullPrincipal.h"
15 #include "nsServiceManagerUtils.h"
16 #include "nsString.h"
18 namespace mozilla {
19 namespace ipc {
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);
28 nsresult stackResult;
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))) {
34 return nullptr;
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))) {
43 return nullptr;
46 return principal.forget();
49 case PrincipalInfo::TNullPrincipalInfo: {
50 principal = do_CreateInstance(NS_NULLPRINCIPAL_CONTRACTID, &rv);
51 if (NS_WARN_IF(NS_FAILED(rv))) {
52 return nullptr;
55 return principal.forget();
58 case PrincipalInfo::TContentPrincipalInfo: {
59 const ContentPrincipalInfo& info =
60 aPrincipalInfo.get_ContentPrincipalInfo();
62 nsCOMPtr<nsIURI> uri;
63 rv = NS_NewURI(getter_AddRefs(uri), info.spec());
64 if (NS_WARN_IF(NS_FAILED(rv))) {
65 return nullptr;
68 if (info.appId() == nsIScriptSecurityManager::UNKNOWN_APP_ID) {
69 rv = secMan->GetSimpleCodebasePrincipal(uri, getter_AddRefs(principal));
70 } else {
71 rv = secMan->GetAppCodebasePrincipal(uri,
72 info.appId(),
73 info.isInBrowserElement(),
74 getter_AddRefs(principal));
76 if (NS_WARN_IF(NS_FAILED(rv))) {
77 return nullptr;
80 return principal.forget();
83 default:
84 MOZ_CRASH("Unknown PrincipalInfo type!");
87 MOZ_CRASH("Should never get here!");
90 nsresult
91 PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal,
92 PrincipalInfo* aPrincipalInfo)
94 MOZ_ASSERT(NS_IsMainThread());
95 MOZ_ASSERT(aPrincipal);
96 MOZ_ASSERT(aPrincipalInfo);
98 bool isNullPointer;
99 nsresult rv = aPrincipal->GetIsNullPrincipal(&isNullPointer);
100 if (NS_WARN_IF(NS_FAILED(rv))) {
101 return rv;
104 if (isNullPointer) {
105 *aPrincipalInfo = NullPrincipalInfo();
106 return NS_OK;
109 nsCOMPtr<nsIScriptSecurityManager> secMan =
110 do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
111 if (NS_WARN_IF(NS_FAILED(rv))) {
112 return rv;
115 bool isSystemPrincipal;
116 rv = secMan->IsSystemPrincipal(aPrincipal, &isSystemPrincipal);
117 if (NS_WARN_IF(NS_FAILED(rv))) {
118 return rv;
121 if (isSystemPrincipal) {
122 *aPrincipalInfo = SystemPrincipalInfo();
123 return NS_OK;
126 nsCOMPtr<nsIURI> uri;
127 rv = aPrincipal->GetURI(getter_AddRefs(uri));
128 if (NS_WARN_IF(NS_FAILED(rv))) {
129 return rv;
132 nsCString spec;
133 rv = uri->GetSpec(spec);
134 if (NS_WARN_IF(NS_FAILED(rv))) {
135 return rv;
138 uint32_t appId;
139 rv = aPrincipal->GetAppId(&appId);
140 if (NS_WARN_IF(NS_FAILED(rv))) {
141 return rv;
144 bool isInBrowserElement;
145 rv = aPrincipal->GetIsInBrowserElement(&isInBrowserElement);
146 if (NS_WARN_IF(NS_FAILED(rv))) {
147 return rv;
150 *aPrincipalInfo = ContentPrincipalInfo(appId, isInBrowserElement, spec);
151 return NS_OK;
154 } // namespace ipc
155 } // namespace mozilla