Browse Source

Check harder before enabling Accessibility support

Paul Betts 8 years ago
parent
commit
0df21afcdf
3 changed files with 25 additions and 9 deletions
  1. 5 0
      atom/browser/native_window_views.h
  2. 19 9
      atom/browser/native_window_views_win.cc
  3. 1 0
      electron.gyp

+ 5 - 0
atom/browser/native_window_views.h

@@ -18,6 +18,8 @@
 #include "atom/browser/ui/win/message_handler_delegate.h"
 #include "atom/browser/ui/win/taskbar_host.h"
 #include "base/win/scoped_gdi_object.h"
+#include "ui/base/win/accessibility_misc_utils.h"
+#include <UIAutomationCoreApi.h>
 #endif
 
 namespace views {
@@ -228,6 +230,9 @@ class NativeWindowViews : public NativeWindow,
   // In charge of running taskbar related APIs.
   TaskbarHost taskbar_host_;
 
+  // Memoized version of a11y check
+  bool checked_for_a11y_support_;
+
   // If true we have enabled a11y
   bool enabled_a11y_support_;
 

+ 19 - 9
atom/browser/native_window_views_win.cc

@@ -92,15 +92,25 @@ bool NativeWindowViews::PreHandleMSG(
     // accessibility object.
     case WM_GETOBJECT: {
       const DWORD obj_id = static_cast<DWORD>(l_param);
-      if (enabled_a11y_support_) return false;
-
-      if (obj_id == OBJID_CLIENT) {
-        const auto axState = content::BrowserAccessibilityState::GetInstance();
-        if (axState && !axState->IsAccessibleBrowser()) {
-          axState->OnScreenReaderDetected();
-          enabled_a11y_support_ = true;
-          Browser::Get()->OnAccessibilitySupportChanged();
-        }
+      if (checked_for_a11y_support_) return false;
+
+      checked_for_a11y_support_ = true;
+
+      if (obj_id != OBJID_CLIENT) {
+        return false;
+      }
+
+      UINT screenReader = 0;
+      SystemParametersInfo(SPI_GETSCREENREADER, 0, &screenReader, 0);
+      if (!screenReader || !UiaClientsAreListening()) {
+        return false;
+      }
+
+      const auto axState = content::BrowserAccessibilityState::GetInstance();
+      if (axState && !axState->IsAccessibleBrowser()) {
+        axState->OnScreenReaderDetected();
+        enabled_a11y_support_ = true;
+        Browser::Get()->OnAccessibilitySupportChanged();
       }
 
       return false;

+ 1 - 0
electron.gyp

@@ -281,6 +281,7 @@
               '-lwininet.lib',
               '-lwinmm.lib',
               '-lcrypt32.lib',
+              '-luiautomationcore.lib',
             ],
           },
           'dependencies': [