Line data Source code
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/LoadContext.h"
10 : #include "mozilla/Preferences.h"
11 : #include "mozilla/dom/ScriptSettings.h" // for AutoJSAPI
12 : #include "nsContentUtils.h"
13 : #include "xpcpublic.h"
14 :
15 : namespace mozilla {
16 :
17 578 : NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor)
18 :
19 2 : LoadContext::LoadContext(nsIPrincipal* aPrincipal,
20 2 : nsILoadContext* aOptionalBase)
21 : : mTopFrameElement(nullptr)
22 : , mNestedFrameId(0)
23 : , mIsContent(true)
24 : , mUseRemoteTabs(false)
25 : , mUseTrackingProtection(false)
26 : #ifdef DEBUG
27 2 : , mIsNotNull(true)
28 : #endif
29 : {
30 2 : mOriginAttributes = aPrincipal->OriginAttributesRef();
31 2 : if (!aOptionalBase) {
32 2 : return;
33 : }
34 :
35 0 : MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetIsContent(&mIsContent));
36 0 : MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetUseRemoteTabs(&mUseRemoteTabs));
37 0 : MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetUseTrackingProtection(&mUseTrackingProtection));
38 : }
39 :
40 : //-----------------------------------------------------------------------------
41 : // LoadContext::nsILoadContext
42 : //-----------------------------------------------------------------------------
43 :
44 : NS_IMETHODIMP
45 6 : LoadContext::GetAssociatedWindow(mozIDOMWindowProxy**)
46 : {
47 6 : MOZ_ASSERT(mIsNotNull);
48 :
49 : // can't support this in the parent process
50 6 : return NS_ERROR_UNEXPECTED;
51 : }
52 :
53 : NS_IMETHODIMP
54 0 : LoadContext::GetTopWindow(mozIDOMWindowProxy**)
55 : {
56 0 : MOZ_ASSERT(mIsNotNull);
57 :
58 : // can't support this in the parent process
59 0 : return NS_ERROR_UNEXPECTED;
60 : }
61 :
62 : NS_IMETHODIMP
63 0 : LoadContext::GetTopFrameElement(nsIDOMElement** aElement)
64 : {
65 0 : nsCOMPtr<nsIDOMElement> element = do_QueryReferent(mTopFrameElement);
66 0 : element.forget(aElement);
67 0 : return NS_OK;
68 : }
69 :
70 : NS_IMETHODIMP
71 0 : LoadContext::GetNestedFrameId(uint64_t* aId)
72 : {
73 0 : NS_ENSURE_ARG(aId);
74 0 : *aId = mNestedFrameId;
75 0 : return NS_OK;
76 : }
77 :
78 : NS_IMETHODIMP
79 0 : LoadContext::GetIsContent(bool* aIsContent)
80 : {
81 0 : MOZ_ASSERT(mIsNotNull);
82 :
83 0 : NS_ENSURE_ARG_POINTER(aIsContent);
84 :
85 0 : *aIsContent = mIsContent;
86 0 : return NS_OK;
87 : }
88 :
89 : NS_IMETHODIMP
90 24 : LoadContext::GetUsePrivateBrowsing(bool* aUsePrivateBrowsing)
91 : {
92 24 : MOZ_ASSERT(mIsNotNull);
93 :
94 24 : NS_ENSURE_ARG_POINTER(aUsePrivateBrowsing);
95 :
96 24 : *aUsePrivateBrowsing = mOriginAttributes.mPrivateBrowsingId > 0;
97 24 : return NS_OK;
98 : }
99 :
100 : NS_IMETHODIMP
101 0 : LoadContext::SetUsePrivateBrowsing(bool aUsePrivateBrowsing)
102 : {
103 0 : MOZ_ASSERT(mIsNotNull);
104 :
105 : // We shouldn't need this on parent...
106 0 : return NS_ERROR_UNEXPECTED;
107 : }
108 :
109 : NS_IMETHODIMP
110 0 : LoadContext::SetPrivateBrowsing(bool aUsePrivateBrowsing)
111 : {
112 0 : MOZ_ASSERT(mIsNotNull);
113 :
114 : // We shouldn't need this on parent...
115 0 : return NS_ERROR_UNEXPECTED;
116 : }
117 :
118 : NS_IMETHODIMP
119 0 : LoadContext::GetUseRemoteTabs(bool* aUseRemoteTabs)
120 : {
121 0 : MOZ_ASSERT(mIsNotNull);
122 :
123 0 : NS_ENSURE_ARG_POINTER(aUseRemoteTabs);
124 :
125 0 : *aUseRemoteTabs = mUseRemoteTabs;
126 0 : return NS_OK;
127 : }
128 :
129 : NS_IMETHODIMP
130 0 : LoadContext::SetRemoteTabs(bool aUseRemoteTabs)
131 : {
132 0 : MOZ_ASSERT(mIsNotNull);
133 :
134 : // We shouldn't need this on parent...
135 0 : return NS_ERROR_UNEXPECTED;
136 : }
137 :
138 : NS_IMETHODIMP
139 26 : LoadContext::GetIsInIsolatedMozBrowserElement(bool* aIsInIsolatedMozBrowserElement)
140 : {
141 26 : MOZ_ASSERT(mIsNotNull);
142 :
143 26 : NS_ENSURE_ARG_POINTER(aIsInIsolatedMozBrowserElement);
144 :
145 26 : *aIsInIsolatedMozBrowserElement = mOriginAttributes.mInIsolatedMozBrowser;
146 26 : return NS_OK;
147 : }
148 :
149 : NS_IMETHODIMP
150 0 : LoadContext::GetScriptableOriginAttributes(JS::MutableHandleValue aAttrs)
151 : {
152 0 : JSContext* cx = nsContentUtils::GetCurrentJSContext();
153 0 : MOZ_ASSERT(cx);
154 :
155 0 : bool ok = ToJSValue(cx, mOriginAttributes, aAttrs);
156 0 : NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
157 0 : return NS_OK;
158 : }
159 :
160 : NS_IMETHODIMP_(void)
161 9 : LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs)
162 : {
163 9 : aAttrs = mOriginAttributes;
164 9 : }
165 :
166 : NS_IMETHODIMP
167 9 : LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection)
168 : {
169 9 : MOZ_ASSERT(mIsNotNull);
170 :
171 9 : NS_ENSURE_ARG_POINTER(aUseTrackingProtection);
172 :
173 9 : *aUseTrackingProtection = mUseTrackingProtection;
174 9 : return NS_OK;
175 : }
176 :
177 : NS_IMETHODIMP
178 0 : LoadContext::SetUseTrackingProtection(bool aUseTrackingProtection)
179 : {
180 0 : MOZ_ASSERT_UNREACHABLE("Should only be set through nsDocShell");
181 :
182 : return NS_ERROR_UNEXPECTED;
183 : }
184 :
185 : //-----------------------------------------------------------------------------
186 : // LoadContext::nsIInterfaceRequestor
187 : //-----------------------------------------------------------------------------
188 : NS_IMETHODIMP
189 5 : LoadContext::GetInterface(const nsIID& aIID, void** aResult)
190 : {
191 5 : NS_ENSURE_ARG_POINTER(aResult);
192 5 : *aResult = nullptr;
193 :
194 5 : if (aIID.Equals(NS_GET_IID(nsILoadContext))) {
195 4 : *aResult = static_cast<nsILoadContext*>(this);
196 4 : NS_ADDREF_THIS();
197 4 : return NS_OK;
198 : }
199 :
200 1 : return NS_NOINTERFACE;
201 : }
202 :
203 : static nsresult
204 0 : CreateTestInstance(bool aPrivate, nsISupports *aOuter, REFNSIID aIID, void **aResult)
205 : {
206 : // Shamelessly modified from NS_GENERIC_FACTORY_CONSTRUCTOR
207 0 : *aResult = nullptr;
208 :
209 0 : if (aOuter) {
210 0 : return NS_ERROR_NO_AGGREGATION;
211 : }
212 :
213 0 : OriginAttributes oa;
214 0 : oa.mPrivateBrowsingId = aPrivate ? 1 : 0;
215 :
216 0 : RefPtr<LoadContext> lc = new LoadContext(oa);
217 :
218 0 : return lc->QueryInterface(aIID, aResult);
219 : }
220 :
221 : nsresult
222 0 : CreateTestLoadContext(nsISupports *aOuter, REFNSIID aIID, void **aResult)
223 : {
224 0 : return CreateTestInstance(false, aOuter, aIID, aResult);
225 : }
226 :
227 : nsresult
228 0 : CreatePrivateTestLoadContext(nsISupports *aOuter, REFNSIID aIID, void **aResult)
229 : {
230 0 : return CreateTestInstance(true, aOuter, aIID, aResult);
231 : }
232 :
233 : } // namespace mozilla
|