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