Home | History | Annotate | Download | only in accessibility
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_STATE_IMPL_H_
      6 #define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_STATE_IMPL_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/compiler_specific.h"
     12 #include "base/memory/singleton.h"
     13 #include "content/common/view_message_enums.h"
     14 #include "content/public/browser/browser_accessibility_state.h"
     15 
     16 namespace content {
     17 
     18 // The BrowserAccessibilityState class is used to determine if Chrome should be
     19 // customized for users with assistive technology, such as screen readers. We
     20 // modify the behavior of certain user interfaces to provide a better experience
     21 // for screen reader users. The way we detect a screen reader program is
     22 // different for each platform.
     23 //
     24 // Screen Reader Detection
     25 // (1) On windows many screen reader detection mechinisms will give false
     26 // positives like relying on the SPI_GETSCREENREADER system parameter. In Chrome
     27 // we attempt to dynamically detect a MSAA client screen reader by calling
     28 // NotifiyWinEvent in NativeWidgetWin with a custom ID and wait to see if the ID
     29 // is requested by a subsequent call to WM_GETOBJECT.
     30 // (2) On mac we detect dynamically if VoiceOver is running.  We rely upon the
     31 // undocumented accessibility attribute @"AXEnhancedUserInterface" which is set
     32 // when VoiceOver is launched and unset when VoiceOver is closed.  This is an
     33 // improvement over reading defaults preference values (which has no callback
     34 // mechanism).
     35 class CONTENT_EXPORT BrowserAccessibilityStateImpl
     36     : public base::RefCountedThreadSafe<BrowserAccessibilityStateImpl>,
     37       public BrowserAccessibilityState {
     38  public:
     39   BrowserAccessibilityStateImpl();
     40 
     41   static BrowserAccessibilityStateImpl* GetInstance();
     42 
     43   virtual void EnableAccessibility() OVERRIDE;
     44   virtual void DisableAccessibility() OVERRIDE;
     45   virtual void ResetAccessibilityMode() OVERRIDE;
     46   virtual void OnScreenReaderDetected() OVERRIDE;
     47   virtual bool IsAccessibleBrowser() OVERRIDE;
     48   virtual void AddHistogramCallback(base::Closure callback) OVERRIDE;
     49 
     50   virtual void UpdateHistogramsForTesting() OVERRIDE;
     51 
     52   AccessibilityMode accessibility_mode() const { return accessibility_mode_; };
     53 
     54   // Adds the given accessibility mode to the current accessibility mode bitmap.
     55   void AddAccessibilityMode(AccessibilityMode mode);
     56 
     57   // Removes the given accessibility mode from the current accessibility mode
     58   // bitmap, managing the bits that are shared with other modes such that a
     59   // bit will only be turned off when all modes that depend on it have been
     60   // removed.
     61   void RemoveAccessibilityMode(AccessibilityMode mode);
     62 
     63  private:
     64   friend class base::RefCountedThreadSafe<BrowserAccessibilityStateImpl>;
     65   friend struct DefaultSingletonTraits<BrowserAccessibilityStateImpl>;
     66 
     67   // Resets accessibility_mode_ to the default value.
     68   void ResetAccessibilityModeValue();
     69 
     70   // Called a short while after startup to allow time for the accessibility
     71   // state to be determined. Updates histograms with the current state.
     72   void UpdateHistograms();
     73 
     74   // Leaky singleton, destructor generally won't be called.
     75   virtual ~BrowserAccessibilityStateImpl();
     76 
     77   void UpdatePlatformSpecificHistograms();
     78 
     79   // Updates the accessibility mode of all render widgets, including swapped out
     80   // ones. |add| specifies whether the mode should be added or removed.
     81   void AddOrRemoveFromRenderWidgets(AccessibilityMode mode, bool add);
     82 
     83   AccessibilityMode accessibility_mode_;
     84 
     85   std::vector<base::Closure> histogram_callbacks_;
     86 
     87   DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityStateImpl);
     88 };
     89 
     90 }  // namespace content
     91 
     92 #endif  // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_STATE_IMPL_H_
     93