Line data Source code
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/. */
4 :
5 : #include "LoadContextInfo.h"
6 :
7 : #include "mozilla/dom/ToJSValue.h"
8 : #include "nsDocShell.h"
9 : #include "nsIChannel.h"
10 : #include "nsILoadContext.h"
11 : #include "nsIWebNavigation.h"
12 : #include "nsNetUtil.h"
13 :
14 : using namespace mozilla::dom;
15 : namespace mozilla {
16 : namespace net {
17 :
18 : // LoadContextInfo
19 :
20 83 : NS_IMPL_ISUPPORTS(LoadContextInfo, nsILoadContextInfo)
21 :
22 28 : LoadContextInfo::LoadContextInfo(bool aIsAnonymous,
23 28 : OriginAttributes aOriginAttributes)
24 : : mIsAnonymous(aIsAnonymous)
25 28 : , mOriginAttributes(aOriginAttributes)
26 : {
27 28 : }
28 :
29 56 : LoadContextInfo::~LoadContextInfo()
30 : {
31 84 : }
32 :
33 34 : NS_IMETHODIMP LoadContextInfo::GetIsPrivate(bool *aIsPrivate)
34 : {
35 34 : *aIsPrivate = mOriginAttributes.mPrivateBrowsingId > 0;
36 34 : return NS_OK;
37 : }
38 :
39 35 : NS_IMETHODIMP LoadContextInfo::GetIsAnonymous(bool *aIsAnonymous)
40 : {
41 35 : *aIsAnonymous = mIsAnonymous;
42 35 : return NS_OK;
43 : }
44 :
45 37 : OriginAttributes const* LoadContextInfo::OriginAttributesPtr()
46 : {
47 37 : return &mOriginAttributes;
48 : }
49 :
50 0 : NS_IMETHODIMP LoadContextInfo::GetOriginAttributes(JSContext *aCx,
51 : JS::MutableHandle<JS::Value> aVal)
52 : {
53 0 : if (NS_WARN_IF(!ToJSValue(aCx, mOriginAttributes, aVal))) {
54 0 : return NS_ERROR_FAILURE;
55 : }
56 0 : return NS_OK;
57 : }
58 :
59 : // LoadContextInfoFactory
60 :
61 0 : NS_IMPL_ISUPPORTS(LoadContextInfoFactory, nsILoadContextInfoFactory)
62 :
63 0 : NS_IMETHODIMP LoadContextInfoFactory::GetDefault(nsILoadContextInfo * *aDefault)
64 : {
65 : nsCOMPtr<nsILoadContextInfo> info =
66 0 : GetLoadContextInfo(false, OriginAttributes());
67 0 : info.forget(aDefault);
68 0 : return NS_OK;
69 : }
70 :
71 0 : NS_IMETHODIMP LoadContextInfoFactory::GetPrivate(nsILoadContextInfo * *aPrivate)
72 : {
73 0 : OriginAttributes attrs;
74 0 : attrs.SyncAttributesWithPrivateBrowsing(true);
75 0 : nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(false, attrs);
76 0 : info.forget(aPrivate);
77 0 : return NS_OK;
78 : }
79 :
80 0 : NS_IMETHODIMP LoadContextInfoFactory::GetAnonymous(nsILoadContextInfo * *aAnonymous)
81 : {
82 : nsCOMPtr<nsILoadContextInfo> info =
83 0 : GetLoadContextInfo(true, OriginAttributes());
84 0 : info.forget(aAnonymous);
85 0 : return NS_OK;
86 : }
87 :
88 0 : NS_IMETHODIMP LoadContextInfoFactory::Custom(bool aAnonymous,
89 : JS::HandleValue aOriginAttributes, JSContext *cx,
90 : nsILoadContextInfo * *_retval)
91 : {
92 0 : OriginAttributes attrs;
93 0 : bool status = attrs.Init(cx, aOriginAttributes);
94 0 : NS_ENSURE_TRUE(status, NS_ERROR_FAILURE);
95 :
96 0 : nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aAnonymous, attrs);
97 0 : info.forget(_retval);
98 0 : return NS_OK;
99 : }
100 :
101 0 : NS_IMETHODIMP LoadContextInfoFactory::FromLoadContext(nsILoadContext *aLoadContext, bool aAnonymous,
102 : nsILoadContextInfo * *_retval)
103 : {
104 0 : nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aLoadContext, aAnonymous);
105 0 : info.forget(_retval);
106 0 : return NS_OK;
107 : }
108 :
109 0 : NS_IMETHODIMP LoadContextInfoFactory::FromWindow(nsIDOMWindow *aWindow, bool aAnonymous,
110 : nsILoadContextInfo * *_retval)
111 : {
112 0 : nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aWindow, aAnonymous);
113 0 : info.forget(_retval);
114 0 : return NS_OK;
115 : }
116 :
117 : // Helper functions
118 :
119 : LoadContextInfo *
120 7 : GetLoadContextInfo(nsIChannel * aChannel)
121 : {
122 : nsresult rv;
123 :
124 14 : DebugOnly<bool> pb = NS_UsePrivateBrowsing(aChannel);
125 :
126 7 : bool anon = false;
127 : nsLoadFlags loadFlags;
128 7 : rv = aChannel->GetLoadFlags(&loadFlags);
129 7 : if (NS_SUCCEEDED(rv)) {
130 7 : anon = !!(loadFlags & nsIChannel::LOAD_ANONYMOUS);
131 : }
132 :
133 14 : OriginAttributes oa;
134 7 : NS_GetOriginAttributes(aChannel, oa);
135 7 : MOZ_ASSERT(pb == (oa.mPrivateBrowsingId > 0));
136 :
137 21 : return new LoadContextInfo(anon, oa);
138 : }
139 :
140 : LoadContextInfo *
141 0 : GetLoadContextInfo(nsILoadContext *aLoadContext, bool aIsAnonymous)
142 : {
143 0 : if (!aLoadContext) {
144 0 : return new LoadContextInfo(aIsAnonymous, OriginAttributes());
145 : }
146 :
147 0 : OriginAttributes oa;
148 0 : aLoadContext->GetOriginAttributes(oa);
149 :
150 : #ifdef DEBUG
151 0 : nsCOMPtr<nsIDocShellTreeItem> docShell = do_QueryInterface(aLoadContext);
152 0 : if (!docShell || docShell->ItemType() != nsIDocShellTreeItem::typeChrome) {
153 0 : MOZ_ASSERT(aLoadContext->UsePrivateBrowsing() == (oa.mPrivateBrowsingId > 0));
154 : }
155 : #endif
156 :
157 0 : return new LoadContextInfo(aIsAnonymous, oa);
158 : }
159 :
160 : LoadContextInfo*
161 0 : GetLoadContextInfo(nsIDOMWindow *aWindow,
162 : bool aIsAnonymous)
163 : {
164 0 : nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aWindow);
165 0 : nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(webNav);
166 :
167 0 : return GetLoadContextInfo(loadContext, aIsAnonymous);
168 : }
169 :
170 : LoadContextInfo *
171 10 : GetLoadContextInfo(nsILoadContextInfo *aInfo)
172 : {
173 10 : return new LoadContextInfo(aInfo->IsAnonymous(),
174 20 : *aInfo->OriginAttributesPtr());
175 : }
176 :
177 : LoadContextInfo *
178 7 : GetLoadContextInfo(bool const aIsAnonymous,
179 : OriginAttributes const &aOriginAttributes)
180 : {
181 14 : return new LoadContextInfo(aIsAnonymous, aOriginAttributes);
182 : }
183 :
184 : } // namespace net
185 : } // namespace mozilla
|