LoadContext.cpp (6855B)
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 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 36 LoadContext::LoadContext(OriginAttributes& aAttrs) 37 : mTopFrameElement(nullptr), 38 mIsContent(false), 39 mUseRemoteTabs(false), 40 mUseRemoteSubframes(false), 41 #ifdef DEBUG 42 mIsNotNull(true), 43 #endif 44 mOriginAttributes(aAttrs) { 45 // This constructor does not have a base load context, so we need to decide 46 // the mUseTrackingProtection based on prefs. 47 mUseTrackingProtection = 48 StaticPrefs::privacy_trackingprotection_enabled() || 49 (UsePrivateBrowsing() && 50 StaticPrefs::privacy_trackingprotection_pbmode_enabled()); 51 } 52 53 LoadContext::LoadContext(nsIPrincipal* aPrincipal, 54 nsILoadContext* aOptionalBase) 55 : mTopFrameElement(nullptr), 56 mIsContent(true), 57 mUseRemoteTabs(false), 58 mUseRemoteSubframes(false), 59 mUseTrackingProtection(false), 60 #ifdef DEBUG 61 mIsNotNull(true), 62 #endif 63 mOriginAttributes(aPrincipal->OriginAttributesRef()) { 64 if (!aOptionalBase) { 65 // Fallback to prefs to determine if tracking protection is enabled. 66 mUseTrackingProtection = 67 StaticPrefs::privacy_trackingprotection_enabled() || 68 (UsePrivateBrowsing() && 69 StaticPrefs::privacy_trackingprotection_pbmode_enabled()); 70 71 return; 72 } 73 74 MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetIsContent(&mIsContent)); 75 MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetUseRemoteTabs(&mUseRemoteTabs)); 76 MOZ_ALWAYS_SUCCEEDS( 77 aOptionalBase->GetUseRemoteSubframes(&mUseRemoteSubframes)); 78 MOZ_ALWAYS_SUCCEEDS( 79 aOptionalBase->GetUseTrackingProtection(&mUseTrackingProtection)); 80 } 81 82 LoadContext::~LoadContext() = default; 83 84 //----------------------------------------------------------------------------- 85 // LoadContext::nsILoadContext 86 //----------------------------------------------------------------------------- 87 88 NS_IMETHODIMP 89 LoadContext::GetAssociatedWindow(mozIDOMWindowProxy**) { 90 MOZ_ASSERT(mIsNotNull); 91 92 // can't support this in the parent process 93 return NS_ERROR_UNEXPECTED; 94 } 95 96 NS_IMETHODIMP 97 LoadContext::GetTopWindow(mozIDOMWindowProxy**) { 98 MOZ_ASSERT(mIsNotNull); 99 100 // can't support this in the parent process 101 return NS_ERROR_UNEXPECTED; 102 } 103 104 NS_IMETHODIMP 105 LoadContext::GetTopFrameElement(dom::Element** aElement) { 106 nsCOMPtr<dom::Element> element = do_QueryReferent(mTopFrameElement); 107 element.forget(aElement); 108 return NS_OK; 109 } 110 111 NS_IMETHODIMP 112 LoadContext::GetIsContent(bool* aIsContent) { 113 MOZ_ASSERT(mIsNotNull); 114 115 NS_ENSURE_ARG_POINTER(aIsContent); 116 117 *aIsContent = mIsContent; 118 return NS_OK; 119 } 120 121 NS_IMETHODIMP 122 LoadContext::GetUsePrivateBrowsing(bool* aUsePrivateBrowsing) { 123 MOZ_ASSERT(mIsNotNull); 124 125 NS_ENSURE_ARG_POINTER(aUsePrivateBrowsing); 126 127 *aUsePrivateBrowsing = mOriginAttributes.IsPrivateBrowsing(); 128 return NS_OK; 129 } 130 131 NS_IMETHODIMP 132 LoadContext::SetUsePrivateBrowsing(bool aUsePrivateBrowsing) { 133 MOZ_ASSERT(mIsNotNull); 134 135 // We shouldn't need this on parent... 136 return NS_ERROR_UNEXPECTED; 137 } 138 139 NS_IMETHODIMP 140 LoadContext::SetPrivateBrowsing(bool aUsePrivateBrowsing) { 141 MOZ_ASSERT(mIsNotNull); 142 143 // We shouldn't need this on parent... 144 return NS_ERROR_UNEXPECTED; 145 } 146 147 NS_IMETHODIMP 148 LoadContext::GetUseRemoteTabs(bool* aUseRemoteTabs) { 149 MOZ_ASSERT(mIsNotNull); 150 151 NS_ENSURE_ARG_POINTER(aUseRemoteTabs); 152 153 *aUseRemoteTabs = mUseRemoteTabs; 154 return NS_OK; 155 } 156 157 NS_IMETHODIMP 158 LoadContext::SetRemoteTabs(bool aUseRemoteTabs) { 159 MOZ_ASSERT(mIsNotNull); 160 161 // We shouldn't need this on parent... 162 return NS_ERROR_UNEXPECTED; 163 } 164 165 NS_IMETHODIMP 166 LoadContext::GetUseRemoteSubframes(bool* aUseRemoteSubframes) { 167 MOZ_ASSERT(mIsNotNull); 168 169 NS_ENSURE_ARG_POINTER(aUseRemoteSubframes); 170 171 *aUseRemoteSubframes = mUseRemoteSubframes; 172 return NS_OK; 173 } 174 175 NS_IMETHODIMP 176 LoadContext::SetRemoteSubframes(bool aUseRemoteSubframes) { 177 MOZ_ASSERT(mIsNotNull); 178 179 // We shouldn't need this on parent... 180 return NS_ERROR_UNEXPECTED; 181 } 182 183 NS_IMETHODIMP 184 LoadContext::GetScriptableOriginAttributes( 185 JSContext* aCx, JS::MutableHandle<JS::Value> aAttrs) { 186 bool ok = ToJSValue(aCx, mOriginAttributes, aAttrs); 187 NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE); 188 return NS_OK; 189 } 190 191 NS_IMETHODIMP_(void) 192 LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) { 193 aAttrs = mOriginAttributes; 194 } 195 196 NS_IMETHODIMP 197 LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection) { 198 MOZ_ASSERT(mIsNotNull); 199 200 NS_ENSURE_ARG_POINTER(aUseTrackingProtection); 201 202 *aUseTrackingProtection = mUseTrackingProtection; 203 return NS_OK; 204 } 205 206 NS_IMETHODIMP 207 LoadContext::SetUseTrackingProtection(bool aUseTrackingProtection) { 208 MOZ_ASSERT_UNREACHABLE("Should only be set through nsDocShell"); 209 210 return NS_ERROR_UNEXPECTED; 211 } 212 213 //----------------------------------------------------------------------------- 214 // LoadContext::nsIInterfaceRequestor 215 //----------------------------------------------------------------------------- 216 NS_IMETHODIMP 217 LoadContext::GetInterface(const nsIID& aIID, void** aResult) { 218 NS_ENSURE_ARG_POINTER(aResult); 219 *aResult = nullptr; 220 221 if (aIID.Equals(NS_GET_IID(nsILoadContext))) { 222 *aResult = static_cast<nsILoadContext*>(this); 223 NS_ADDREF_THIS(); 224 return NS_OK; 225 } 226 227 return NS_NOINTERFACE; 228 } 229 230 static already_AddRefed<nsILoadContext> CreateInstance(bool aPrivate) { 231 OriginAttributes oa; 232 oa.mPrivateBrowsingId = aPrivate ? 1 : 0; 233 234 nsCOMPtr<nsILoadContext> lc = new LoadContext(oa); 235 236 return lc.forget(); 237 } 238 239 already_AddRefed<nsILoadContext> CreateLoadContext() { 240 return CreateInstance(false); 241 } 242 243 already_AddRefed<nsILoadContext> CreatePrivateLoadContext() { 244 return CreateInstance(true); 245 } 246 247 } // namespace mozilla