Bug 1909613 - Enable <details name=''> everywhere, r=emilio
[gecko.git] / netwerk / base / LoadContextInfo.cpp
blob319ce1e0a39a2c27ab4a197abbe7cd92f5022c8c
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;
16 namespace mozilla {
17 namespace net {
19 // LoadContextInfo
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.IsPrivateBrowsing();
30 return NS_OK;
33 NS_IMETHODIMP LoadContextInfo::GetIsAnonymous(bool* aIsAnonymous) {
34 *aIsAnonymous = mIsAnonymous;
35 return NS_OK;
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;
47 return NS_OK;
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);
59 return NS_OK;
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);
68 return NS_OK;
71 NS_IMETHODIMP LoadContextInfoFactory::GetAnonymous(
72 nsILoadContextInfo** aAnonymous) {
73 nsCOMPtr<nsILoadContextInfo> info =
74 GetLoadContextInfo(true, OriginAttributes());
75 info.forget(aAnonymous);
76 return NS_OK;
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);
87 info.forget(_retval);
88 return NS_OK;
91 NS_IMETHODIMP LoadContextInfoFactory::FromLoadContext(
92 nsILoadContext* aLoadContext, bool aAnonymous,
93 nsILoadContextInfo** _retval) {
94 nsCOMPtr<nsILoadContextInfo> info =
95 GetLoadContextInfo(aLoadContext, aAnonymous);
96 info.forget(_retval);
97 return NS_OK;
100 NS_IMETHODIMP LoadContextInfoFactory::FromWindow(nsIDOMWindow* aWindow,
101 bool aAnonymous,
102 nsILoadContextInfo** _retval) {
103 nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aWindow, aAnonymous);
104 info.forget(_retval);
105 return NS_OK;
108 // Helper functions
110 LoadContextInfo* GetLoadContextInfo(nsIChannel* aChannel) {
111 nsresult rv;
113 DebugOnly<bool> pb = NS_UsePrivateBrowsing(aChannel);
115 bool anon = false;
116 nsLoadFlags loadFlags;
117 rv = aChannel->GetLoadFlags(&loadFlags);
118 if (NS_SUCCEEDED(rv)) {
119 anon = !!(loadFlags & nsIChannel::LOAD_ANONYMOUS);
122 OriginAttributes oa;
123 StoragePrincipalHelper::GetOriginAttributesForNetworkState(aChannel, oa);
124 MOZ_ASSERT(pb == (oa.IsPrivateBrowsing()));
126 return new LoadContextInfo(anon, oa);
129 LoadContextInfo* GetLoadContextInfo(nsILoadContext* aLoadContext,
130 bool aIsAnonymous) {
131 if (!aLoadContext) {
132 return new LoadContextInfo(aIsAnonymous, OriginAttributes());
135 OriginAttributes oa;
136 aLoadContext->GetOriginAttributes(oa);
138 #ifdef DEBUG
139 nsCOMPtr<nsIDocShell> docShell = do_QueryInterface(aLoadContext);
140 if (!docShell ||
141 nsDocShell::Cast(docShell)->GetBrowsingContext()->IsContent()) {
142 MOZ_ASSERT(aLoadContext->UsePrivateBrowsing() == (oa.IsPrivateBrowsing()));
144 #endif
146 return new LoadContextInfo(aIsAnonymous, oa);
149 LoadContextInfo* GetLoadContextInfo(nsIDOMWindow* aWindow, bool aIsAnonymous) {
150 nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aWindow);
151 nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(webNav);
153 return GetLoadContextInfo(loadContext, aIsAnonymous);
156 LoadContextInfo* GetLoadContextInfo(nsILoadContextInfo* aInfo) {
157 return new LoadContextInfo(aInfo->IsAnonymous(),
158 *aInfo->OriginAttributesPtr());
161 LoadContextInfo* GetLoadContextInfo(bool const aIsAnonymous,
162 OriginAttributes const& aOriginAttributes) {
163 return new LoadContextInfo(aIsAnonymous, aOriginAttributes);
166 } // namespace net
167 } // namespace mozilla