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/accessibility_mode_enums.h" 14#include "content/public/browser/browser_accessibility_state.h" 15 16namespace 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). 35class 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 web contents, including swapped out 80 // ones. |add| specifies whether the mode should be added or removed. 81 void AddOrRemoveFromAllWebContents(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