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
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "LoadContextInfo.h"
7 #include "mozilla/dom/ToJSValue.h"
8 #include "mozilla/StoragePrincipalHelper.h"
9 #include "nsDocShell.h"
10 #include "nsIChannel.h"
11 #include "nsILoadContext.h"
12 #include "nsIWebNavigation.h"
13 #include "nsNetUtil.h"
15 using namespace mozilla::dom
;
21 NS_IMPL_ISUPPORTS(LoadContextInfo
, nsILoadContextInfo
)
23 LoadContextInfo::LoadContextInfo(bool aIsAnonymous
,
24 OriginAttributes aOriginAttributes
)
25 : mIsAnonymous(aIsAnonymous
),
26 mOriginAttributes(std::move(aOriginAttributes
)) {}
28 NS_IMETHODIMP
LoadContextInfo::GetIsPrivate(bool* aIsPrivate
) {
29 *aIsPrivate
= mOriginAttributes
.mPrivateBrowsingId
> 0;
33 NS_IMETHODIMP
LoadContextInfo::GetIsAnonymous(bool* aIsAnonymous
) {
34 *aIsAnonymous
= mIsAnonymous
;
38 OriginAttributes
const* LoadContextInfo::OriginAttributesPtr() {
39 return &mOriginAttributes
;
42 NS_IMETHODIMP
LoadContextInfo::GetOriginAttributes(
43 JSContext
* aCx
, JS::MutableHandle
<JS::Value
> aVal
) {
44 if (NS_WARN_IF(!ToJSValue(aCx
, mOriginAttributes
, aVal
))) {
45 return NS_ERROR_FAILURE
;
50 // LoadContextInfoFactory
52 NS_IMPL_ISUPPORTS(LoadContextInfoFactory
, nsILoadContextInfoFactory
)
54 NS_IMETHODIMP
LoadContextInfoFactory::GetDefault(
55 nsILoadContextInfo
** aDefault
) {
56 nsCOMPtr
<nsILoadContextInfo
> info
=
57 GetLoadContextInfo(false, OriginAttributes());
58 info
.forget(aDefault
);
62 NS_IMETHODIMP
LoadContextInfoFactory::GetPrivate(
63 nsILoadContextInfo
** aPrivate
) {
64 OriginAttributes attrs
;
65 attrs
.SyncAttributesWithPrivateBrowsing(true);
66 nsCOMPtr
<nsILoadContextInfo
> info
= GetLoadContextInfo(false, attrs
);
67 info
.forget(aPrivate
);
71 NS_IMETHODIMP
LoadContextInfoFactory::GetAnonymous(
72 nsILoadContextInfo
** aAnonymous
) {
73 nsCOMPtr
<nsILoadContextInfo
> info
=
74 GetLoadContextInfo(true, OriginAttributes());
75 info
.forget(aAnonymous
);
79 NS_IMETHODIMP
LoadContextInfoFactory::Custom(
80 bool aAnonymous
, JS::Handle
<JS::Value
> aOriginAttributes
, JSContext
* cx
,
81 nsILoadContextInfo
** _retval
) {
82 OriginAttributes attrs
;
83 bool status
= attrs
.Init(cx
, aOriginAttributes
);
84 NS_ENSURE_TRUE(status
, NS_ERROR_FAILURE
);
86 nsCOMPtr
<nsILoadContextInfo
> info
= GetLoadContextInfo(aAnonymous
, attrs
);
91 NS_IMETHODIMP
LoadContextInfoFactory::FromLoadContext(
92 nsILoadContext
* aLoadContext
, bool aAnonymous
,
93 nsILoadContextInfo
** _retval
) {
94 nsCOMPtr
<nsILoadContextInfo
> info
=
95 GetLoadContextInfo(aLoadContext
, aAnonymous
);
100 NS_IMETHODIMP
LoadContextInfoFactory::FromWindow(nsIDOMWindow
* aWindow
,
102 nsILoadContextInfo
** _retval
) {
103 nsCOMPtr
<nsILoadContextInfo
> info
= GetLoadContextInfo(aWindow
, aAnonymous
);
104 info
.forget(_retval
);
110 LoadContextInfo
* GetLoadContextInfo(nsIChannel
* aChannel
) {
113 DebugOnly
<bool> pb
= NS_UsePrivateBrowsing(aChannel
);
116 nsLoadFlags loadFlags
;
117 rv
= aChannel
->GetLoadFlags(&loadFlags
);
118 if (NS_SUCCEEDED(rv
)) {
119 anon
= !!(loadFlags
& nsIChannel::LOAD_ANONYMOUS
);
123 StoragePrincipalHelper::GetOriginAttributesForNetworkState(aChannel
, oa
);
124 MOZ_ASSERT(pb
== (oa
.mPrivateBrowsingId
> 0));
126 return new LoadContextInfo(anon
, oa
);
129 LoadContextInfo
* GetLoadContextInfo(nsILoadContext
* aLoadContext
,
132 return new LoadContextInfo(aIsAnonymous
, OriginAttributes());
136 aLoadContext
->GetOriginAttributes(oa
);
139 nsCOMPtr
<nsIDocShell
> docShell
= do_QueryInterface(aLoadContext
);
141 nsDocShell::Cast(docShell
)->GetBrowsingContext()->IsContent()) {
142 MOZ_ASSERT(aLoadContext
->UsePrivateBrowsing() ==
143 (oa
.mPrivateBrowsingId
> 0));
147 return new LoadContextInfo(aIsAnonymous
, oa
);
150 LoadContextInfo
* GetLoadContextInfo(nsIDOMWindow
* aWindow
, bool aIsAnonymous
) {
151 nsCOMPtr
<nsIWebNavigation
> webNav
= do_GetInterface(aWindow
);
152 nsCOMPtr
<nsILoadContext
> loadContext
= do_QueryInterface(webNav
);
154 return GetLoadContextInfo(loadContext
, aIsAnonymous
);
157 LoadContextInfo
* GetLoadContextInfo(nsILoadContextInfo
* aInfo
) {
158 return new LoadContextInfo(aInfo
->IsAnonymous(),
159 *aInfo
->OriginAttributesPtr());
162 LoadContextInfo
* GetLoadContextInfo(bool const aIsAnonymous
,
163 OriginAttributes
const& aOriginAttributes
) {
164 return new LoadContextInfo(aIsAnonymous
, aOriginAttributes
);
168 } // namespace mozilla