Line data Source code
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 : #include "mozilla/dom/BarPropBinding.h"
9 : #include "nsContentUtils.h"
10 : #include "nsGlobalWindow.h"
11 : #include "nsIDocShell.h"
12 : #include "nsIScrollable.h"
13 : #include "nsIWebBrowserChrome.h"
14 :
15 : namespace mozilla {
16 : namespace dom {
17 :
18 : //
19 : // Basic (virtual) BarProp class implementation
20 : //
21 1 : BarProp::BarProp(nsGlobalWindow* aWindow)
22 1 : : mDOMWindow(aWindow)
23 : {
24 1 : MOZ_ASSERT(aWindow->IsInnerWindow());
25 1 : }
26 :
27 0 : BarProp::~BarProp()
28 : {
29 0 : }
30 :
31 : nsPIDOMWindowInner*
32 1 : BarProp::GetParentObject() const
33 : {
34 1 : return mDOMWindow->AsInner();
35 : }
36 :
37 : JSObject*
38 1 : BarProp::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
39 : {
40 1 : return BarPropBinding::Wrap(aCx, this, aGivenProto);
41 : }
42 :
43 3 : NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(BarProp, mDOMWindow)
44 2 : NS_IMPL_CYCLE_COLLECTING_ADDREF(BarProp)
45 0 : NS_IMPL_CYCLE_COLLECTING_RELEASE(BarProp)
46 10 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(BarProp)
47 1 : NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
48 0 : NS_INTERFACE_MAP_ENTRY(nsISupports)
49 0 : NS_INTERFACE_MAP_END
50 :
51 : bool
52 5 : BarProp::GetVisibleByFlag(uint32_t aChromeFlag, ErrorResult& aRv)
53 : {
54 10 : nsCOMPtr<nsIWebBrowserChrome> browserChrome = GetBrowserChrome();
55 5 : NS_ENSURE_TRUE(browserChrome, false);
56 :
57 : uint32_t chromeFlags;
58 :
59 5 : if (NS_FAILED(browserChrome->GetChromeFlags(&chromeFlags))) {
60 0 : aRv.Throw(NS_ERROR_FAILURE);
61 0 : return false;
62 : }
63 :
64 5 : return (chromeFlags & aChromeFlag);
65 : }
66 :
67 : void
68 0 : BarProp::SetVisibleByFlag(bool aVisible, uint32_t aChromeFlag,
69 : CallerType aCallerType, ErrorResult& aRv)
70 : {
71 0 : nsCOMPtr<nsIWebBrowserChrome> browserChrome = GetBrowserChrome();
72 0 : NS_ENSURE_TRUE_VOID(browserChrome);
73 :
74 0 : if (aCallerType != CallerType::System) {
75 0 : return;
76 : }
77 :
78 : uint32_t chromeFlags;
79 :
80 0 : if (NS_FAILED(browserChrome->GetChromeFlags(&chromeFlags))) {
81 0 : aRv.Throw(NS_ERROR_FAILURE);
82 0 : return;
83 : }
84 :
85 0 : if (aVisible)
86 0 : chromeFlags |= aChromeFlag;
87 : else
88 0 : chromeFlags &= ~aChromeFlag;
89 :
90 0 : if (NS_FAILED(browserChrome->SetChromeFlags(chromeFlags))) {
91 0 : aRv.Throw(NS_ERROR_FAILURE);
92 : }
93 : }
94 :
95 : already_AddRefed<nsIWebBrowserChrome>
96 5 : BarProp::GetBrowserChrome()
97 : {
98 5 : if (!mDOMWindow) {
99 0 : return nullptr;
100 : }
101 :
102 5 : return mDOMWindow->GetWebBrowserChrome();
103 : }
104 :
105 : //
106 : // MenubarProp class implementation
107 : //
108 :
109 0 : MenubarProp::MenubarProp(nsGlobalWindow *aWindow)
110 0 : : BarProp(aWindow)
111 : {
112 0 : }
113 :
114 0 : MenubarProp::~MenubarProp()
115 : {
116 0 : }
117 :
118 : bool
119 0 : MenubarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv)
120 : {
121 0 : return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_MENUBAR, aRv);
122 : }
123 :
124 : void
125 0 : MenubarProp::SetVisible(bool aVisible, CallerType aCallerType, ErrorResult& aRv)
126 : {
127 0 : BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_MENUBAR,
128 0 : aCallerType, aRv);
129 0 : }
130 :
131 : //
132 : // ToolbarProp class implementation
133 : //
134 :
135 1 : ToolbarProp::ToolbarProp(nsGlobalWindow *aWindow)
136 1 : : BarProp(aWindow)
137 : {
138 1 : }
139 :
140 0 : ToolbarProp::~ToolbarProp()
141 : {
142 0 : }
143 :
144 : bool
145 5 : ToolbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv)
146 : {
147 5 : return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_TOOLBAR, aRv);
148 : }
149 :
150 : void
151 0 : ToolbarProp::SetVisible(bool aVisible, CallerType aCallerType, ErrorResult& aRv)
152 : {
153 0 : BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_TOOLBAR,
154 0 : aCallerType, aRv);
155 0 : }
156 :
157 : //
158 : // LocationbarProp class implementation
159 : //
160 :
161 0 : LocationbarProp::LocationbarProp(nsGlobalWindow *aWindow)
162 0 : : BarProp(aWindow)
163 : {
164 0 : }
165 :
166 0 : LocationbarProp::~LocationbarProp()
167 : {
168 0 : }
169 :
170 : bool
171 0 : LocationbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv)
172 : {
173 0 : return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_LOCATIONBAR,
174 0 : aRv);
175 : }
176 :
177 : void
178 0 : LocationbarProp::SetVisible(bool aVisible, CallerType aCallerType,
179 : ErrorResult& aRv)
180 : {
181 0 : BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_LOCATIONBAR,
182 0 : aCallerType, aRv);
183 0 : }
184 :
185 : //
186 : // PersonalbarProp class implementation
187 : //
188 :
189 0 : PersonalbarProp::PersonalbarProp(nsGlobalWindow *aWindow)
190 0 : : BarProp(aWindow)
191 : {
192 0 : }
193 :
194 0 : PersonalbarProp::~PersonalbarProp()
195 : {
196 0 : }
197 :
198 : bool
199 0 : PersonalbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv)
200 : {
201 0 : return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR,
202 0 : aRv);
203 : }
204 :
205 : void
206 0 : PersonalbarProp::SetVisible(bool aVisible, CallerType aCallerType,
207 : ErrorResult& aRv)
208 : {
209 0 : BarProp::SetVisibleByFlag(aVisible,
210 : nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR,
211 0 : aCallerType, aRv);
212 0 : }
213 :
214 : //
215 : // StatusbarProp class implementation
216 : //
217 :
218 0 : StatusbarProp::StatusbarProp(nsGlobalWindow *aWindow)
219 0 : : BarProp(aWindow)
220 : {
221 0 : }
222 :
223 0 : StatusbarProp::~StatusbarProp()
224 : {
225 0 : }
226 :
227 : bool
228 0 : StatusbarProp::GetVisible(CallerType aCallerType, ErrorResult& aRv)
229 : {
230 0 : return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_STATUSBAR, aRv);
231 : }
232 :
233 : void
234 0 : StatusbarProp::SetVisible(bool aVisible, CallerType aCallerType,
235 : ErrorResult& aRv)
236 : {
237 0 : return BarProp::SetVisibleByFlag(aVisible,
238 : nsIWebBrowserChrome::CHROME_STATUSBAR,
239 0 : aCallerType, aRv);
240 : }
241 :
242 : //
243 : // ScrollbarsProp class implementation
244 : //
245 :
246 0 : ScrollbarsProp::ScrollbarsProp(nsGlobalWindow *aWindow)
247 0 : : BarProp(aWindow)
248 : {
249 0 : }
250 :
251 0 : ScrollbarsProp::~ScrollbarsProp()
252 : {
253 0 : }
254 :
255 : bool
256 0 : ScrollbarsProp::GetVisible(CallerType aCallerType, ErrorResult& aRv)
257 : {
258 0 : if (!mDOMWindow) {
259 0 : return true;
260 : }
261 :
262 : nsCOMPtr<nsIScrollable> scroller =
263 0 : do_QueryInterface(mDOMWindow->GetDocShell());
264 :
265 0 : if (!scroller) {
266 0 : return true;
267 : }
268 :
269 : int32_t prefValue;
270 0 : scroller->GetDefaultScrollbarPreferences(
271 0 : nsIScrollable::ScrollOrientation_Y, &prefValue);
272 0 : if (prefValue != nsIScrollable::Scrollbar_Never) {
273 0 : return true;
274 : }
275 :
276 0 : scroller->GetDefaultScrollbarPreferences(
277 0 : nsIScrollable::ScrollOrientation_X, &prefValue);
278 0 : return prefValue != nsIScrollable::Scrollbar_Never;
279 : }
280 :
281 : void
282 0 : ScrollbarsProp::SetVisible(bool aVisible, CallerType aCallerType,
283 : ErrorResult& aRv)
284 : {
285 0 : if (aCallerType != CallerType::System) {
286 0 : return;
287 : }
288 :
289 : /* Scrollbars, unlike the other barprops, implement visibility directly
290 : rather than handing off to the superclass (and from there to the
291 : chrome window) because scrollbar visibility uniquely applies only
292 : to the window making the change (arguably. it does now, anyway.)
293 : and because embedding apps have no interface for implementing this
294 : themselves, and therefore the implementation must be internal. */
295 :
296 0 : nsContentUtils::SetScrollbarsVisibility(mDOMWindow->GetDocShell(), aVisible);
297 :
298 : /* Notably absent is the part where we notify the chrome window using
299 : GetBrowserChrome()->SetChromeFlags(). Given the possibility of multiple
300 : DOM windows (multiple top-level windows, even) within a single
301 : chrome window, the historical concept of a single "has scrollbars"
302 : flag in the chrome is inapplicable, and we can't tell at this level
303 : whether we represent the particular DOM window that makes this decision
304 : for the chrome.
305 :
306 : So only this object (and its corresponding DOM window) knows whether
307 : scrollbars are visible. The corresponding chrome window will need to
308 : ask (one of) its DOM window(s) when it needs to know about scrollbar
309 : visibility, rather than caching its own copy of that information.
310 : */
311 : }
312 :
313 : } // namespace dom
314 : } // namespace mozilla
315 :
|