1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "mozilla/Assertions.h"
8 #include "mozilla/BasePrincipal.h"
9 #include "mozilla/dom/ToJSValue.h"
10 #include "mozilla/LoadContext.h"
11 #include "mozilla/Preferences.h"
12 #include "mozilla/dom/Element.h"
13 #include "mozilla/dom/ScriptSettings.h" // for AutoJSAPI
14 #include "mozilla/dom/BrowsingContext.h"
15 #include "nsContentUtils.h"
16 #include "xpcpublic.h"
17
18 namespace mozilla {
19
NS_IMPL_ISUPPORTS(LoadContext,nsILoadContext,nsIInterfaceRequestor)20 NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor)
21
22 LoadContext::LoadContext(const IPC::SerializedLoadContext& aToCopy,
23 dom::Element* aTopFrameElement,
24 OriginAttributes& aAttrs)
25 : mTopFrameElement(do_GetWeakReference(aTopFrameElement)),
26 mIsContent(aToCopy.mIsContent),
27 mUseRemoteTabs(aToCopy.mUseRemoteTabs),
28 mUseRemoteSubframes(aToCopy.mUseRemoteSubframes),
29 mUseTrackingProtection(aToCopy.mUseTrackingProtection),
30 #ifdef DEBUG
31 mIsNotNull(aToCopy.mIsNotNull),
32 #endif
33 mOriginAttributes(aAttrs) {
34 }
35
LoadContext(OriginAttributes & aAttrs)36 LoadContext::LoadContext(OriginAttributes& aAttrs)
37 : mTopFrameElement(nullptr),
38 mIsContent(false),
39 mUseRemoteTabs(false),
40 mUseRemoteSubframes(false),
41 mUseTrackingProtection(false),
42 #ifdef DEBUG
43 mIsNotNull(true),
44 #endif
45 mOriginAttributes(aAttrs) {
46 }
47
LoadContext(nsIPrincipal * aPrincipal,nsILoadContext * aOptionalBase)48 LoadContext::LoadContext(nsIPrincipal* aPrincipal,
49 nsILoadContext* aOptionalBase)
50 : mTopFrameElement(nullptr),
51 mIsContent(true),
52 mUseRemoteTabs(false),
53 mUseRemoteSubframes(false),
54 mUseTrackingProtection(false),
55 #ifdef DEBUG
56 mIsNotNull(true),
57 #endif
58 mOriginAttributes(aPrincipal->OriginAttributesRef()) {
59 if (!aOptionalBase) {
60 return;
61 }
62
63 MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetIsContent(&mIsContent));
64 MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetUseRemoteTabs(&mUseRemoteTabs));
65 MOZ_ALWAYS_SUCCEEDS(
66 aOptionalBase->GetUseRemoteSubframes(&mUseRemoteSubframes));
67 MOZ_ALWAYS_SUCCEEDS(
68 aOptionalBase->GetUseTrackingProtection(&mUseTrackingProtection));
69 }
70
71 LoadContext::~LoadContext() = default;
72
73 //-----------------------------------------------------------------------------
74 // LoadContext::nsILoadContext
75 //-----------------------------------------------------------------------------
76
77 NS_IMETHODIMP
GetAssociatedWindow(mozIDOMWindowProxy **)78 LoadContext::GetAssociatedWindow(mozIDOMWindowProxy**) {
79 MOZ_ASSERT(mIsNotNull);
80
81 // can't support this in the parent process
82 return NS_ERROR_UNEXPECTED;
83 }
84
85 NS_IMETHODIMP
GetTopWindow(mozIDOMWindowProxy **)86 LoadContext::GetTopWindow(mozIDOMWindowProxy**) {
87 MOZ_ASSERT(mIsNotNull);
88
89 // can't support this in the parent process
90 return NS_ERROR_UNEXPECTED;
91 }
92
93 NS_IMETHODIMP
GetTopFrameElement(dom::Element ** aElement)94 LoadContext::GetTopFrameElement(dom::Element** aElement) {
95 nsCOMPtr<dom::Element> element = do_QueryReferent(mTopFrameElement);
96 element.forget(aElement);
97 return NS_OK;
98 }
99
100 NS_IMETHODIMP
GetIsContent(bool * aIsContent)101 LoadContext::GetIsContent(bool* aIsContent) {
102 MOZ_ASSERT(mIsNotNull);
103
104 NS_ENSURE_ARG_POINTER(aIsContent);
105
106 *aIsContent = mIsContent;
107 return NS_OK;
108 }
109
110 NS_IMETHODIMP
GetUsePrivateBrowsing(bool * aUsePrivateBrowsing)111 LoadContext::GetUsePrivateBrowsing(bool* aUsePrivateBrowsing) {
112 MOZ_ASSERT(mIsNotNull);
113
114 NS_ENSURE_ARG_POINTER(aUsePrivateBrowsing);
115
116 *aUsePrivateBrowsing = mOriginAttributes.mPrivateBrowsingId > 0;
117 return NS_OK;
118 }
119
120 NS_IMETHODIMP
SetUsePrivateBrowsing(bool aUsePrivateBrowsing)121 LoadContext::SetUsePrivateBrowsing(bool aUsePrivateBrowsing) {
122 MOZ_ASSERT(mIsNotNull);
123
124 // We shouldn't need this on parent...
125 return NS_ERROR_UNEXPECTED;
126 }
127
128 NS_IMETHODIMP
SetPrivateBrowsing(bool aUsePrivateBrowsing)129 LoadContext::SetPrivateBrowsing(bool aUsePrivateBrowsing) {
130 MOZ_ASSERT(mIsNotNull);
131
132 // We shouldn't need this on parent...
133 return NS_ERROR_UNEXPECTED;
134 }
135
136 NS_IMETHODIMP
GetUseRemoteTabs(bool * aUseRemoteTabs)137 LoadContext::GetUseRemoteTabs(bool* aUseRemoteTabs) {
138 MOZ_ASSERT(mIsNotNull);
139
140 NS_ENSURE_ARG_POINTER(aUseRemoteTabs);
141
142 *aUseRemoteTabs = mUseRemoteTabs;
143 return NS_OK;
144 }
145
146 NS_IMETHODIMP
SetRemoteTabs(bool aUseRemoteTabs)147 LoadContext::SetRemoteTabs(bool aUseRemoteTabs) {
148 MOZ_ASSERT(mIsNotNull);
149
150 // We shouldn't need this on parent...
151 return NS_ERROR_UNEXPECTED;
152 }
153
154 NS_IMETHODIMP
GetUseRemoteSubframes(bool * aUseRemoteSubframes)155 LoadContext::GetUseRemoteSubframes(bool* aUseRemoteSubframes) {
156 MOZ_ASSERT(mIsNotNull);
157
158 NS_ENSURE_ARG_POINTER(aUseRemoteSubframes);
159
160 *aUseRemoteSubframes = mUseRemoteSubframes;
161 return NS_OK;
162 }
163
164 NS_IMETHODIMP
SetRemoteSubframes(bool aUseRemoteSubframes)165 LoadContext::SetRemoteSubframes(bool aUseRemoteSubframes) {
166 MOZ_ASSERT(mIsNotNull);
167
168 // We shouldn't need this on parent...
169 return NS_ERROR_UNEXPECTED;
170 }
171
172 NS_IMETHODIMP
GetScriptableOriginAttributes(JSContext * aCx,JS::MutableHandleValue aAttrs)173 LoadContext::GetScriptableOriginAttributes(JSContext* aCx,
174 JS::MutableHandleValue aAttrs) {
175 bool ok = ToJSValue(aCx, mOriginAttributes, aAttrs);
176 NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
177 return NS_OK;
178 }
179
NS_IMETHODIMP_(void)180 NS_IMETHODIMP_(void)
181 LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) {
182 aAttrs = mOriginAttributes;
183 }
184
185 NS_IMETHODIMP
GetUseTrackingProtection(bool * aUseTrackingProtection)186 LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection) {
187 MOZ_ASSERT(mIsNotNull);
188
189 NS_ENSURE_ARG_POINTER(aUseTrackingProtection);
190
191 *aUseTrackingProtection = mUseTrackingProtection;
192 return NS_OK;
193 }
194
195 NS_IMETHODIMP
SetUseTrackingProtection(bool aUseTrackingProtection)196 LoadContext::SetUseTrackingProtection(bool aUseTrackingProtection) {
197 MOZ_ASSERT_UNREACHABLE("Should only be set through nsDocShell");
198
199 return NS_ERROR_UNEXPECTED;
200 }
201
202 //-----------------------------------------------------------------------------
203 // LoadContext::nsIInterfaceRequestor
204 //-----------------------------------------------------------------------------
205 NS_IMETHODIMP
GetInterface(const nsIID & aIID,void ** aResult)206 LoadContext::GetInterface(const nsIID& aIID, void** aResult) {
207 NS_ENSURE_ARG_POINTER(aResult);
208 *aResult = nullptr;
209
210 if (aIID.Equals(NS_GET_IID(nsILoadContext))) {
211 *aResult = static_cast<nsILoadContext*>(this);
212 NS_ADDREF_THIS();
213 return NS_OK;
214 }
215
216 return NS_NOINTERFACE;
217 }
218
CreateInstance(bool aPrivate)219 static already_AddRefed<nsILoadContext> CreateInstance(bool aPrivate) {
220 OriginAttributes oa;
221 oa.mPrivateBrowsingId = aPrivate ? 1 : 0;
222
223 nsCOMPtr<nsILoadContext> lc = new LoadContext(oa);
224
225 return lc.forget();
226 }
227
CreateLoadContext()228 already_AddRefed<nsILoadContext> CreateLoadContext() {
229 return CreateInstance(false);
230 }
231
CreatePrivateLoadContext()232 already_AddRefed<nsILoadContext> CreatePrivateLoadContext() {
233 return CreateInstance(true);
234 }
235
236 } // namespace mozilla
237