tor-browser

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

LoadContextInfo.cpp (5037B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include "LoadContextInfo.h"
      6 
      7 #include "mozilla/dom/ToJSValue.h"
      8 #include "mozilla/StoragePrincipalHelper.h"
      9 #include "nsDocShell.h"
     10 #include "nsIChannel.h"
     11 #include "nsILoadContext.h"
     12 #include "nsIWebNavigation.h"
     13 #include "nsNetUtil.h"
     14 
     15 using namespace mozilla::dom;
     16 namespace mozilla {
     17 namespace net {
     18 
     19 // LoadContextInfo
     20 
     21 NS_IMPL_ISUPPORTS(LoadContextInfo, nsILoadContextInfo)
     22 
     23 LoadContextInfo::LoadContextInfo(bool aIsAnonymous,
     24                                 OriginAttributes aOriginAttributes)
     25    : mIsAnonymous(aIsAnonymous),
     26      mOriginAttributes(std::move(aOriginAttributes)) {}
     27 
     28 NS_IMETHODIMP LoadContextInfo::GetIsPrivate(bool* aIsPrivate) {
     29  *aIsPrivate = mOriginAttributes.IsPrivateBrowsing();
     30  return NS_OK;
     31 }
     32 
     33 NS_IMETHODIMP LoadContextInfo::GetIsAnonymous(bool* aIsAnonymous) {
     34  *aIsAnonymous = mIsAnonymous;
     35  return NS_OK;
     36 }
     37 
     38 OriginAttributes const* LoadContextInfo::OriginAttributesPtr() {
     39  return &mOriginAttributes;
     40 }
     41 
     42 NS_IMETHODIMP LoadContextInfo::GetOriginAttributes(
     43    JSContext* aCx, JS::MutableHandle<JS::Value> aVal) {
     44  if (NS_WARN_IF(!ToJSValue(aCx, mOriginAttributes, aVal))) {
     45    return NS_ERROR_FAILURE;
     46  }
     47  return NS_OK;
     48 }
     49 
     50 // LoadContextInfoFactory
     51 
     52 NS_IMPL_ISUPPORTS(LoadContextInfoFactory, nsILoadContextInfoFactory)
     53 
     54 NS_IMETHODIMP LoadContextInfoFactory::GetDefault(
     55    nsILoadContextInfo** aDefault) {
     56  nsCOMPtr<nsILoadContextInfo> info =
     57      GetLoadContextInfo(false, OriginAttributes());
     58  info.forget(aDefault);
     59  return NS_OK;
     60 }
     61 
     62 NS_IMETHODIMP LoadContextInfoFactory::GetPrivate(
     63    nsILoadContextInfo** aPrivate) {
     64  OriginAttributes attrs;
     65  attrs.SyncAttributesWithPrivateBrowsing(true);
     66  nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(false, attrs);
     67  info.forget(aPrivate);
     68  return NS_OK;
     69 }
     70 
     71 NS_IMETHODIMP LoadContextInfoFactory::GetAnonymous(
     72    nsILoadContextInfo** aAnonymous) {
     73  nsCOMPtr<nsILoadContextInfo> info =
     74      GetLoadContextInfo(true, OriginAttributes());
     75  info.forget(aAnonymous);
     76  return NS_OK;
     77 }
     78 
     79 NS_IMETHODIMP LoadContextInfoFactory::Custom(
     80    bool aAnonymous, JS::Handle<JS::Value> aOriginAttributes, JSContext* cx,
     81    nsILoadContextInfo** _retval) {
     82  OriginAttributes attrs;
     83  bool status = attrs.Init(cx, aOriginAttributes);
     84  NS_ENSURE_TRUE(status, NS_ERROR_FAILURE);
     85 
     86  nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aAnonymous, attrs);
     87  info.forget(_retval);
     88  return NS_OK;
     89 }
     90 
     91 NS_IMETHODIMP LoadContextInfoFactory::FromLoadContext(
     92    nsILoadContext* aLoadContext, bool aAnonymous,
     93    nsILoadContextInfo** _retval) {
     94  nsCOMPtr<nsILoadContextInfo> info =
     95      GetLoadContextInfo(aLoadContext, aAnonymous);
     96  info.forget(_retval);
     97  return NS_OK;
     98 }
     99 
    100 NS_IMETHODIMP LoadContextInfoFactory::FromWindow(nsIDOMWindow* aWindow,
    101                                                 bool aAnonymous,
    102                                                 nsILoadContextInfo** _retval) {
    103  nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aWindow, aAnonymous);
    104  info.forget(_retval);
    105  return NS_OK;
    106 }
    107 
    108 // Helper functions
    109 
    110 LoadContextInfo* GetLoadContextInfo(nsIChannel* aChannel) {
    111  nsresult rv;
    112 
    113  DebugOnly<bool> pb = NS_UsePrivateBrowsing(aChannel);
    114 
    115  bool anon = false;
    116  nsLoadFlags loadFlags;
    117  rv = aChannel->GetLoadFlags(&loadFlags);
    118  if (NS_SUCCEEDED(rv)) {
    119    anon = !!(loadFlags & nsIChannel::LOAD_ANONYMOUS);
    120  }
    121 
    122  OriginAttributes oa;
    123  StoragePrincipalHelper::GetOriginAttributesForNetworkState(aChannel, oa);
    124  MOZ_ASSERT(pb == (oa.IsPrivateBrowsing()));
    125 
    126  return new LoadContextInfo(anon, oa);
    127 }
    128 
    129 LoadContextInfo* GetLoadContextInfo(nsILoadContext* aLoadContext,
    130                                    bool aIsAnonymous) {
    131  if (!aLoadContext) {
    132    return new LoadContextInfo(aIsAnonymous, OriginAttributes());
    133  }
    134 
    135  OriginAttributes oa;
    136  aLoadContext->GetOriginAttributes(oa);
    137 
    138 #ifdef DEBUG
    139  nsCOMPtr<nsIDocShell> docShell = do_QueryInterface(aLoadContext);
    140  if (!docShell ||
    141      nsDocShell::Cast(docShell)->GetBrowsingContext()->IsContent()) {
    142    MOZ_ASSERT(aLoadContext->UsePrivateBrowsing() == (oa.IsPrivateBrowsing()));
    143  }
    144 #endif
    145 
    146  return new LoadContextInfo(aIsAnonymous, oa);
    147 }
    148 
    149 LoadContextInfo* GetLoadContextInfo(nsIDOMWindow* aWindow, bool aIsAnonymous) {
    150  nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aWindow);
    151  nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(webNav);
    152 
    153  return GetLoadContextInfo(loadContext, aIsAnonymous);
    154 }
    155 
    156 LoadContextInfo* GetLoadContextInfo(nsILoadContextInfo* aInfo) {
    157  return new LoadContextInfo(aInfo->IsAnonymous(),
    158                             *aInfo->OriginAttributesPtr());
    159 }
    160 
    161 LoadContextInfo* GetLoadContextInfo(bool const aIsAnonymous,
    162                                    OriginAttributes const& aOriginAttributes) {
    163  return new LoadContextInfo(aIsAnonymous, aOriginAttributes);
    164 }
    165 
    166 }  // namespace net
    167 }  // namespace mozilla