Files
palemoon27/dom/base/BarProps.cpp
T
roytam1 081721a2da import changes from `dev' branch of rmottola/Arctic-Fox:
- reapply Bug 1574573 - Disambiguate a use of Handle in XPCShellEnvironment.cpp r=Ehsan (a674c4b006)
- Bug 1255707 - Part 2. Remove ScreenSizeChanged. r=snorp (3a93e4e768)
- Bug 1250418 - Remove the assertion check of mCanSend in CompositorCh ld::ActorDestroy, r=nical (14bb402a1d)
- Bug 1250718 - Improve layer logging for preserve-3d layers. r=thinker (f373a50040)
- Bug 1232042 - Addendum: Add comment for mLayerManager check. r=jrmuizel (2b69aa784a)
- Bug 1239861. Skip composite if vsync time is before force composite time. r=kats (5ee4038157)
- Bug 1241678 - Fix low-volume null-deref crash. r=BenWa (b28d944615)
- Rename PCompositor to PCompositorBridge. (bug 1258479 part 2, r=mattwoodrow) (dd535a9bdd)
- Bug 1220184 - Eliminate Gingerbread compatibility. r=froydnj, r=nalexander (dce9e4f9e8)
- Bug 1250917 - Remove NS_SUCCESS_I_DID_SOMETHING; r=bholley (9dd6fe351b)
- Bug 1155241: Check mInstanceOwner for nullptr in nsObjectLoadingContent::PluginDestroyed; r=smaug (ad60991e3e)
- Bug 1229220 - Update the scrollbar visibility prefs when initializing a TabChild; r=smaug (28997e0a6d)
- Bug 1252262 - Don't combine the client offset into the outer rect for the child process. r=jimm (f415c0418e)
- Bug 1249943 - Make test_basic_pan work on Fennec and Linux as well. r=botond (657c940be1)
- bit of bug 1245765 part 5 (82463f7eaa)
- Bug 1207512 - Remove the JS_IsRunning call in nsObjectLoadingContent::ScriptRequestPluginInstance; r=bholley (76047284a6)
- Bug 1239463 - Do not assert when notifying an inactive document about changed content from the plugin crash notification. r=bz (03bf38a683)
- Bug 1192450 - Remove PlayPreview registration from Shumway. r=jet (9b6e131876)
- Bug 1200602 - Use the alternate content for <applet>. r=kmachulis (843fccf0aa)
2024-03-15 00:30:42 +08:00

310 lines
6.9 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/BarProps.h"
#include "mozilla/dom/BarPropBinding.h"
#include "nsContentUtils.h"
#include "nsGlobalWindow.h"
#include "nsIDocShell.h"
#include "nsIScrollable.h"
#include "nsIWebBrowserChrome.h"
namespace mozilla {
namespace dom {
//
// Basic (virtual) BarProp class implementation
//
BarProp::BarProp(nsGlobalWindow* aWindow)
: mDOMWindow(aWindow)
{
MOZ_ASSERT(aWindow->IsInnerWindow());
}
BarProp::~BarProp()
{
}
nsPIDOMWindow*
BarProp::GetParentObject() const
{
return mDOMWindow;
}
JSObject*
BarProp::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return BarPropBinding::Wrap(aCx, this, aGivenProto);
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(BarProp, mDOMWindow)
NS_IMPL_CYCLE_COLLECTING_ADDREF(BarProp)
NS_IMPL_CYCLE_COLLECTING_RELEASE(BarProp)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(BarProp)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
bool
BarProp::GetVisibleByFlag(uint32_t aChromeFlag, ErrorResult& aRv)
{
nsCOMPtr<nsIWebBrowserChrome> browserChrome = GetBrowserChrome();
NS_ENSURE_TRUE(browserChrome, false);
uint32_t chromeFlags;
if (NS_FAILED(browserChrome->GetChromeFlags(&chromeFlags))) {
aRv.Throw(NS_ERROR_FAILURE);
return false;
}
return (chromeFlags & aChromeFlag);
}
void
BarProp::SetVisibleByFlag(bool aVisible, uint32_t aChromeFlag,
ErrorResult& aRv)
{
nsCOMPtr<nsIWebBrowserChrome> browserChrome = GetBrowserChrome();
NS_ENSURE_TRUE_VOID(browserChrome);
if (!nsContentUtils::IsCallerChrome()) {
return;
}
uint32_t chromeFlags;
if (NS_FAILED(browserChrome->GetChromeFlags(&chromeFlags))) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
if (aVisible)
chromeFlags |= aChromeFlag;
else
chromeFlags &= ~aChromeFlag;
if (NS_FAILED(browserChrome->SetChromeFlags(chromeFlags))) {
aRv.Throw(NS_ERROR_FAILURE);
}
}
already_AddRefed<nsIWebBrowserChrome>
BarProp::GetBrowserChrome()
{
if (!mDOMWindow) {
return nullptr;
}
return mDOMWindow->GetWebBrowserChrome();
}
//
// MenubarProp class implementation
//
MenubarProp::MenubarProp(nsGlobalWindow *aWindow)
: BarProp(aWindow)
{
}
MenubarProp::~MenubarProp()
{
}
bool
MenubarProp::GetVisible(ErrorResult& aRv)
{
return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_MENUBAR, aRv);
}
void
MenubarProp::SetVisible(bool aVisible, ErrorResult& aRv)
{
BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_MENUBAR, aRv);
}
//
// ToolbarProp class implementation
//
ToolbarProp::ToolbarProp(nsGlobalWindow *aWindow)
: BarProp(aWindow)
{
}
ToolbarProp::~ToolbarProp()
{
}
bool
ToolbarProp::GetVisible(ErrorResult& aRv)
{
return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_TOOLBAR, aRv);
}
void
ToolbarProp::SetVisible(bool aVisible, ErrorResult& aRv)
{
BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_TOOLBAR,
aRv);
}
//
// LocationbarProp class implementation
//
LocationbarProp::LocationbarProp(nsGlobalWindow *aWindow)
: BarProp(aWindow)
{
}
LocationbarProp::~LocationbarProp()
{
}
bool
LocationbarProp::GetVisible(ErrorResult& aRv)
{
return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_LOCATIONBAR,
aRv);
}
void
LocationbarProp::SetVisible(bool aVisible, ErrorResult& aRv)
{
BarProp::SetVisibleByFlag(aVisible, nsIWebBrowserChrome::CHROME_LOCATIONBAR,
aRv);
}
//
// PersonalbarProp class implementation
//
PersonalbarProp::PersonalbarProp(nsGlobalWindow *aWindow)
: BarProp(aWindow)
{
}
PersonalbarProp::~PersonalbarProp()
{
}
bool
PersonalbarProp::GetVisible(ErrorResult& aRv)
{
return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR,
aRv);
}
void
PersonalbarProp::SetVisible(bool aVisible, ErrorResult& aRv)
{
BarProp::SetVisibleByFlag(aVisible,
nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR,
aRv);
}
//
// StatusbarProp class implementation
//
StatusbarProp::StatusbarProp(nsGlobalWindow *aWindow)
: BarProp(aWindow)
{
}
StatusbarProp::~StatusbarProp()
{
}
bool
StatusbarProp::GetVisible(ErrorResult& aRv)
{
return BarProp::GetVisibleByFlag(nsIWebBrowserChrome::CHROME_STATUSBAR, aRv);
}
void
StatusbarProp::SetVisible(bool aVisible, ErrorResult& aRv)
{
return BarProp::SetVisibleByFlag(aVisible,
nsIWebBrowserChrome::CHROME_STATUSBAR, aRv);
}
//
// ScrollbarsProp class implementation
//
ScrollbarsProp::ScrollbarsProp(nsGlobalWindow *aWindow)
: BarProp(aWindow)
{
}
ScrollbarsProp::~ScrollbarsProp()
{
}
bool
ScrollbarsProp::GetVisible(ErrorResult& aRv)
{
if (!mDOMWindow) {
return true;
}
nsCOMPtr<nsIScrollable> scroller =
do_QueryInterface(mDOMWindow->GetDocShell());
if (!scroller) {
return true;
}
int32_t prefValue;
scroller->GetDefaultScrollbarPreferences(
nsIScrollable::ScrollOrientation_Y, &prefValue);
if (prefValue != nsIScrollable::Scrollbar_Never) {
return true;
}
scroller->GetDefaultScrollbarPreferences(
nsIScrollable::ScrollOrientation_X, &prefValue);
return prefValue != nsIScrollable::Scrollbar_Never;
}
void
ScrollbarsProp::SetVisible(bool aVisible, ErrorResult& aRv)
{
if (!nsContentUtils::LegacyIsCallerChromeOrNativeCode()) {
return;
}
/* Scrollbars, unlike the other barprops, implement visibility directly
rather than handing off to the superclass (and from there to the
chrome window) because scrollbar visibility uniquely applies only
to the window making the change (arguably. it does now, anyway.)
and because embedding apps have no interface for implementing this
themselves, and therefore the implementation must be internal. */
nsContentUtils::SetScrollbarsVisibility(mDOMWindow->GetDocShell(), aVisible);
/* Notably absent is the part where we notify the chrome window using
GetBrowserChrome()->SetChromeFlags(). Given the possibility of multiple
DOM windows (multiple top-level windows, even) within a single
chrome window, the historical concept of a single "has scrollbars"
flag in the chrome is inapplicable, and we can't tell at this level
whether we represent the particular DOM window that makes this decision
for the chrome.
So only this object (and its corresponding DOM window) knows whether
scrollbars are visible. The corresponding chrome window will need to
ask (one of) its DOM window(s) when it needs to know about scrollbar
visibility, rather than caching its own copy of that information.
*/
}
} // namespace dom
} // namespace mozilla