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