LCOV - code coverage report
Current view: top level - dom/base - BarProps.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 25 119 21.0 %
Date: 2017-07-14 16:53:18 Functions: 11 45 24.4 %
Legend: Lines: hit not hit

          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             : 

Generated by: LCOV version 1.13