tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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