tor-browser

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

BarProps.cpp (6985B)


      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/dom/BarProps.h"
      8 
      9 #include "mozilla/dom/BarPropBinding.h"
     10 #include "nsContentUtils.h"
     11 #include "nsDocShell.h"
     12 #include "nsGlobalWindowInner.h"
     13 #include "nsIWebBrowserChrome.h"
     14 
     15 namespace mozilla::dom {
     16 
     17 //
     18 //  Basic (virtual) BarProp class implementation
     19 //
     20 BarProp::BarProp(nsGlobalWindowInner* aWindow) : mDOMWindow(aWindow) {}
     21 
     22 BarProp::~BarProp() = default;
     23 
     24 nsPIDOMWindowInner* BarProp::GetParentObject() const { return mDOMWindow; }
     25 
     26 JSObject* BarProp::WrapObject(JSContext* aCx,
     27                              JS::Handle<JSObject*> aGivenProto) {
     28  return BarProp_Binding::Wrap(aCx, this, aGivenProto);
     29 }
     30 
     31 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(BarProp, mDOMWindow)
     32 NS_IMPL_CYCLE_COLLECTING_ADDREF(BarProp)
     33 NS_IMPL_CYCLE_COLLECTING_RELEASE(BarProp)
     34 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(BarProp)
     35  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
     36  NS_INTERFACE_MAP_ENTRY(nsISupports)
     37 NS_INTERFACE_MAP_END
     38 
     39 bool BarProp::GetVisibleByIsPopup() {
     40  // For web content, return the value defined by the spec, instead of
     41  // the actual visibility of each bar.
     42  //
     43  // If this browsing context is created by requesting a popup, all
     44  // `BarProp.visible` should return false.
     45  RefPtr<BrowsingContext> bc = GetBrowsingContext();
     46  if (!bc || bc->IsDiscarded()) {
     47    return true;
     48  }
     49  bc = bc->Top();
     50  bool isPopup = bc->GetIsPopupRequested();
     51  return !isPopup;
     52 }
     53 
     54 bool BarProp::GetVisibleByFlag(uint32_t aChromeFlag, CallerType aCallerType,
     55                               ErrorResult& aRv) {
     56  if (aCallerType != CallerType::System) {
     57    return GetVisibleByIsPopup();
     58  }
     59 
     60  nsCOMPtr<nsIWebBrowserChrome> browserChrome = GetBrowserChrome();
     61  if (!browserChrome) {
     62    return false;
     63  }
     64 
     65  uint32_t chromeFlags;
     66 
     67  if (NS_FAILED(browserChrome->GetChromeFlags(&chromeFlags))) {
     68    aRv.Throw(NS_ERROR_FAILURE);
     69    return false;
     70  }
     71 
     72  return (chromeFlags & aChromeFlag);
     73 }
     74 
     75 void BarProp::SetVisibleByFlag(bool aVisible, uint32_t aChromeFlag,
     76                               CallerType aCallerType, ErrorResult& aRv) {
     77  nsCOMPtr<nsIWebBrowserChrome> browserChrome = GetBrowserChrome();
     78  NS_ENSURE_TRUE_VOID(browserChrome);
     79 
     80  if (aCallerType != CallerType::System) {
     81    return;
     82  }
     83 
     84  uint32_t chromeFlags;
     85 
     86  if (NS_FAILED(browserChrome->GetChromeFlags(&chromeFlags))) {
     87    aRv.Throw(NS_ERROR_FAILURE);
     88    return;
     89  }
     90 
     91  if (aVisible)
     92    chromeFlags |= aChromeFlag;
     93  else
     94    chromeFlags &= ~aChromeFlag;
     95 
     96  if (NS_FAILED(browserChrome->SetChromeFlags(chromeFlags))) {
     97    aRv.Throw(NS_ERROR_FAILURE);
     98  }
     99 }
    100 
    101 already_AddRefed<nsIWebBrowserChrome> BarProp::GetBrowserChrome() {
    102  if (!mDOMWindow) {
    103    return nullptr;
    104  }
    105 
    106  return mDOMWindow->GetWebBrowserChrome();
    107 }
    108 
    109 BrowsingContext* BarProp::GetBrowsingContext() {
    110  if (!mDOMWindow) {
    111    return nullptr;
    112  }
    113 
    114  return mDOMWindow->GetBrowsingContext();
    115 }
    116 
    117 //
    118 // MenubarProp class implementation
    119 //
    120 
    121 MenubarProp::MenubarProp(nsGlobalWindowInner* aWindow) : BarProp(aWindow) {}
    122 
    123 MenubarProp::~MenubarProp() = default;
    124 
    125 bool MenubarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv) {
    126  return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_MENUBAR,
    127                                   aCallerType, aRv);
    128 }
    129 
    130 void MenubarProp::SetVisible(bool aVisible, CallerType aCallerType,
    131                             ErrorResult& aRv) {
    132  BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_MENUBAR,
    133                            aCallerType, aRv);
    134 }
    135 
    136 //
    137 // ToolbarProp class implementation
    138 //
    139 
    140 ToolbarProp::ToolbarProp(nsGlobalWindowInner* aWindow) : BarProp(aWindow) {}
    141 
    142 ToolbarProp::~ToolbarProp() = default;
    143 
    144 bool ToolbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv) {
    145  return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_TOOLBAR,
    146                                   aCallerType, aRv);
    147 }
    148 
    149 void ToolbarProp::SetVisible(bool aVisible, CallerType aCallerType,
    150                             ErrorResult& aRv) {
    151  BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_TOOLBAR,
    152                            aCallerType, aRv);
    153 }
    154 
    155 //
    156 // LocationbarProp class implementation
    157 //
    158 
    159 LocationbarProp::LocationbarProp(nsGlobalWindowInner* aWindow)
    160    : BarProp(aWindow) {}
    161 
    162 LocationbarProp::~LocationbarProp() = default;
    163 
    164 bool LocationbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv) {
    165  return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_LOCATIONBAR,
    166                                   aCallerType, aRv);
    167 }
    168 
    169 void LocationbarProp::SetVisible(bool aVisible, CallerType aCallerType,
    170                                 ErrorResult& aRv) {
    171  BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_LOCATIONBAR,
    172                            aCallerType, aRv);
    173 }
    174 
    175 //
    176 // PersonalbarProp class implementation
    177 //
    178 
    179 PersonalbarProp::PersonalbarProp(nsGlobalWindowInner* aWindow)
    180    : BarProp(aWindow) {}
    181 
    182 PersonalbarProp::~PersonalbarProp() = default;
    183 
    184 bool PersonalbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv) {
    185  return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR,
    186                                   aCallerType, aRv);
    187 }
    188 
    189 void PersonalbarProp::SetVisible(bool aVisible, CallerType aCallerType,
    190                                 ErrorResult& aRv) {
    191  BarProp::SetVisibleByFlag(
    192      aVisible, nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR, aCallerType, aRv);
    193 }
    194 
    195 //
    196 // StatusbarProp class implementation
    197 //
    198 
    199 StatusbarProp::StatusbarProp(nsGlobalWindowInner* aWindow) : BarProp(aWindow) {}
    200 
    201 StatusbarProp::~StatusbarProp() = default;
    202 
    203 bool StatusbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv) {
    204  return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_STATUSBAR,
    205                                   aCallerType, aRv);
    206 }
    207 
    208 void StatusbarProp::SetVisible(bool aVisible, CallerType aCallerType,
    209                               ErrorResult& aRv) {
    210  return BarProp::SetVisibleByFlag(
    211      aVisible, nsIWebBrowserChrome::CHROME_STATUSBAR, aCallerType, aRv);
    212 }
    213 
    214 //
    215 // ScrollbarsProp class implementation
    216 //
    217 
    218 ScrollbarsProp::ScrollbarsProp(nsGlobalWindowInner* aWindow)
    219    : BarProp(aWindow) {}
    220 
    221 ScrollbarsProp::~ScrollbarsProp() = default;
    222 
    223 bool ScrollbarsProp::GetVisible(CallerType aCallerType, ErrorResult& aRv) {
    224  if (aCallerType != CallerType::System) {
    225    return BarProp::GetVisibleByIsPopup();
    226  }
    227 
    228  if (!mDOMWindow) {
    229    return true;
    230  }
    231 
    232  nsIDocShell* ds = mDOMWindow->GetDocShell();
    233  if (!ds) {
    234    return true;
    235  }
    236 
    237  ScrollbarPreference pref = nsDocShell::Cast(ds)->ScrollbarPreference();
    238  return pref != ScrollbarPreference::Never;
    239 }
    240 
    241 void ScrollbarsProp::SetVisible(bool aVisible, CallerType, ErrorResult&) {
    242  /* Do nothing */
    243 }
    244 
    245 }  // namespace mozilla::dom