From fc36ac8c1bd58c63f754956202cc52e014b11fcc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:04:56 -0700 Subject: [PATCH 1/9] Add API for accessibility state and changes --- atom/browser/api/atom_api_app.cc | 11 +++++++++++ atom/browser/api/atom_api_app.h | 2 ++ atom/browser/browser.cc | 4 ++++ atom/browser/browser.h | 2 ++ atom/browser/browser_observer.h | 3 +++ 5 files changed, 22 insertions(+) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 9d799f11500..800c86ebe7c 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -32,6 +32,7 @@ #include "base/strings/string_util.h" #include "brightray/browser/brightray_paths.h" #include "chrome/common/chrome_paths.h" +#include "content/public/browser/browser_accessibility_state.h" #include "content/public/browser/client_certificate_delegate.h" #include "content/public/browser/gpu_data_manager.h" #include "content/public/browser/render_frame_host.h" @@ -281,6 +282,10 @@ void App::OnFinishLaunching() { Emit("ready"); } +void App::OnAccessibilityChanged() { + Emit("accessibility-changed", IsAccessible()); +} + #if defined(OS_MACOSX) void App::OnContinueUserActivity( bool* prevent_default, @@ -486,6 +491,11 @@ void App::DisableHardwareAcceleration(mate::Arguments* args) { content::GpuDataManager::GetInstance()->DisableHardwareAcceleration(); } +bool App::IsAccessible() { + auto ax_state = content::BrowserAccessibilityState::GetInstance(); + return ax_state->IsAccessibleBrowser(); +} + #if defined(USE_NSS_CERTS) void App::ImportCertificate( const base::DictionaryValue& options, @@ -578,6 +588,7 @@ void App::BuildPrototype( .SetMethod("makeSingleInstance", &App::MakeSingleInstance) .SetMethod("releaseSingleInstance", &App::ReleaseSingleInstance) .SetMethod("relaunch", &App::Relaunch) + .SetMethod("isAccessible", &App::IsAccessible) .SetMethod("disableHardwareAcceleration", &App::DisableHardwareAcceleration); } diff --git a/atom/browser/api/atom_api_app.h b/atom/browser/api/atom_api_app.h index b550f0ba7b9..aa79b55f51b 100644 --- a/atom/browser/api/atom_api_app.h +++ b/atom/browser/api/atom_api_app.h @@ -72,6 +72,7 @@ class App : public AtomBrowserClient::Delegate, void OnFinishLaunching() override; void OnLogin(LoginHandler* login_handler, const base::DictionaryValue& request_details) override; + void OnAccessibilityChanged() override; #if defined(OS_MACOSX) void OnContinueUserActivity( bool* prevent_default, @@ -113,6 +114,7 @@ class App : public AtomBrowserClient::Delegate, void ReleaseSingleInstance(); bool Relaunch(mate::Arguments* args); void DisableHardwareAcceleration(mate::Arguments* args); + bool IsAccessible(); #if defined(USE_NSS_CERTS) void ImportCertificate(const base::DictionaryValue& options, const net::CompletionCallback& callback); diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index b7d5626a82e..2727daae449 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -155,6 +155,10 @@ void Browser::DidFinishLaunching() { FOR_EACH_OBSERVER(BrowserObserver, observers_, OnFinishLaunching()); } +void Browser::OnAccessibilityChanged() { + FOR_EACH_OBSERVER(BrowserObserver, observers_, OnAccessibilityChanged()); +} + void Browser::RequestLogin( LoginHandler* login_handler, std::unique_ptr request_details) { diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 98f561bcd15..dbcb6b03bce 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -185,6 +185,8 @@ class Browser : public WindowListObserver { void WillFinishLaunching(); void DidFinishLaunching(); + void OnAccessibilityChanged(); + // Request basic auth login. void RequestLogin(LoginHandler* login_handler, std::unique_ptr request_details); diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index 6e85b599d03..5ef4ee12792 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -52,6 +52,9 @@ class BrowserObserver { virtual void OnLogin(LoginHandler* login_handler, const base::DictionaryValue& request_details) {} + // The browser's accessibility state has changed. + virtual void OnAccessibilityChanged() {}; + #if defined(OS_MACOSX) // The browser wants to resume a user activity via handoff. (macOS only) virtual void OnContinueUserActivity( From 68d7ae75b0a881f0de96ebcab2b417cfb9cd09a8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:09:01 -0700 Subject: [PATCH 2/9] Implement accessiblity change events on mac --- atom/browser/mac/atom_application.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/atom/browser/mac/atom_application.mm b/atom/browser/mac/atom_application.mm index ea64af3a04d..deb8d4dc4c9 100644 --- a/atom/browser/mac/atom_application.mm +++ b/atom/browser/mac/atom_application.mm @@ -83,6 +83,8 @@ } else { ax_state->DisableAccessibility(); } + + atom::Browser::Get()->OnAccessibilityChanged(); } @end From 3fcbac78accf146f4fa2a31f7c71c66b4d00e81f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:19:16 -0700 Subject: [PATCH 3/9] Implement accessiblity change events on Windows --- atom/browser/native_window_views_win.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/atom/browser/native_window_views_win.cc b/atom/browser/native_window_views_win.cc index c49533033cd..9546dde69f5 100644 --- a/atom/browser/native_window_views_win.cc +++ b/atom/browser/native_window_views_win.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. +#include "atom/browser/browser.h" #include "atom/browser/native_window_views.h" #include "content/public/browser/browser_accessibility_state.h" @@ -98,6 +99,7 @@ bool NativeWindowViews::PreHandleMSG( if (axState && !axState->IsAccessibleBrowser()) { axState->OnScreenReaderDetected(); enabled_a11y_support_ = true; + Browser::Get()->OnAccessibilityChanged(); } } From 34f7ddec9f3b70e819ea76f0a65bf4eac9b4b8a8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:32:14 -0700 Subject: [PATCH 4/9] Update API to isAccessibilitySupportEnabled --- atom/browser/api/atom_api_app.cc | 9 +++++---- atom/browser/api/atom_api_app.h | 4 ++-- atom/browser/browser.cc | 6 ++++-- atom/browser/browser.h | 2 +- atom/browser/browser_observer.h | 4 ++-- atom/browser/mac/atom_application.mm | 2 +- atom/browser/native_window_views_win.cc | 2 +- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 800c86ebe7c..96d90d14f66 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -282,8 +282,8 @@ void App::OnFinishLaunching() { Emit("ready"); } -void App::OnAccessibilityChanged() { - Emit("accessibility-changed", IsAccessible()); +void App::OnAccessibilitySupportChanged() { + Emit("accessibility-support-changed", IsAccessibilitySupportEnabled()); } #if defined(OS_MACOSX) @@ -491,7 +491,7 @@ void App::DisableHardwareAcceleration(mate::Arguments* args) { content::GpuDataManager::GetInstance()->DisableHardwareAcceleration(); } -bool App::IsAccessible() { +bool App::IsAccessibilitySupportEnabled() { auto ax_state = content::BrowserAccessibilityState::GetInstance(); return ax_state->IsAccessibleBrowser(); } @@ -588,7 +588,8 @@ void App::BuildPrototype( .SetMethod("makeSingleInstance", &App::MakeSingleInstance) .SetMethod("releaseSingleInstance", &App::ReleaseSingleInstance) .SetMethod("relaunch", &App::Relaunch) - .SetMethod("isAccessible", &App::IsAccessible) + .SetMethod("IsAccessibilitySupportEnabled", + &App::IsAccessibilitySupportEnabled) .SetMethod("disableHardwareAcceleration", &App::DisableHardwareAcceleration); } diff --git a/atom/browser/api/atom_api_app.h b/atom/browser/api/atom_api_app.h index aa79b55f51b..13cedaa7d89 100644 --- a/atom/browser/api/atom_api_app.h +++ b/atom/browser/api/atom_api_app.h @@ -72,7 +72,7 @@ class App : public AtomBrowserClient::Delegate, void OnFinishLaunching() override; void OnLogin(LoginHandler* login_handler, const base::DictionaryValue& request_details) override; - void OnAccessibilityChanged() override; + void OnAccessibilitySupportChanged() override; #if defined(OS_MACOSX) void OnContinueUserActivity( bool* prevent_default, @@ -114,7 +114,7 @@ class App : public AtomBrowserClient::Delegate, void ReleaseSingleInstance(); bool Relaunch(mate::Arguments* args); void DisableHardwareAcceleration(mate::Arguments* args); - bool IsAccessible(); + bool IsAccessibilitySupportEnabled(); #if defined(USE_NSS_CERTS) void ImportCertificate(const base::DictionaryValue& options, const net::CompletionCallback& callback); diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 2727daae449..dd958d0dc7d 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -155,8 +155,10 @@ void Browser::DidFinishLaunching() { FOR_EACH_OBSERVER(BrowserObserver, observers_, OnFinishLaunching()); } -void Browser::OnAccessibilityChanged() { - FOR_EACH_OBSERVER(BrowserObserver, observers_, OnAccessibilityChanged()); +void Browser::OnAccessibilitySupportChanged() { + FOR_EACH_OBSERVER(BrowserObserver, + observers_, + OnAccessibilitySupportChanged()); } void Browser::RequestLogin( diff --git a/atom/browser/browser.h b/atom/browser/browser.h index dbcb6b03bce..7d493f05493 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -185,7 +185,7 @@ class Browser : public WindowListObserver { void WillFinishLaunching(); void DidFinishLaunching(); - void OnAccessibilityChanged(); + void OnAccessibilitySupportChanged(); // Request basic auth login. void RequestLogin(LoginHandler* login_handler, diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index 5ef4ee12792..4217939911c 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -52,8 +52,8 @@ class BrowserObserver { virtual void OnLogin(LoginHandler* login_handler, const base::DictionaryValue& request_details) {} - // The browser's accessibility state has changed. - virtual void OnAccessibilityChanged() {}; + // The browser's accessibility suppport has changed. + virtual void OnAccessibilitySupportChanged() {}; #if defined(OS_MACOSX) // The browser wants to resume a user activity via handoff. (macOS only) diff --git a/atom/browser/mac/atom_application.mm b/atom/browser/mac/atom_application.mm index deb8d4dc4c9..159852a59a8 100644 --- a/atom/browser/mac/atom_application.mm +++ b/atom/browser/mac/atom_application.mm @@ -84,7 +84,7 @@ ax_state->DisableAccessibility(); } - atom::Browser::Get()->OnAccessibilityChanged(); + atom::Browser::Get()->OnAccessibilitySupportChanged(); } @end diff --git a/atom/browser/native_window_views_win.cc b/atom/browser/native_window_views_win.cc index 9546dde69f5..9af003d55db 100644 --- a/atom/browser/native_window_views_win.cc +++ b/atom/browser/native_window_views_win.cc @@ -99,7 +99,7 @@ bool NativeWindowViews::PreHandleMSG( if (axState && !axState->IsAccessibleBrowser()) { axState->OnScreenReaderDetected(); enabled_a11y_support_ = true; - Browser::Get()->OnAccessibilityChanged(); + Browser::Get()->OnAccessibilitySupportChanged(); } } From 67b647322fe8f2e338f1e41864343fe4d2a6ab90 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:32:24 -0700 Subject: [PATCH 5/9] Add spec to verify app.isAccessibilitySupportEnabled return type --- spec/api-app-spec.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index 8ceb44f19d3..c95de0fb099 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -339,4 +339,10 @@ describe('app module', function () { }) }) }) + + describe('isAccessibilitySupportEnabled API', function () { + it('returns whether the Chrome has accessibility APIs enabled', function () { + assert.equal(app.isAccessibilitySupportEnabled(), 'boolean') + }) + }) }) From 46a1e0382dde5271dd355387a2f90622c536e840 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:41:35 -0700 Subject: [PATCH 6/9] Document accessibility support API --- docs/api/app.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/api/app.md b/docs/api/app.md index c7e0998b6cc..fac59edd3f9 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -259,6 +259,19 @@ app.on('login', (event, webContents, request, authInfo, callback) => { Emitted when the gpu process crashes. +### Event: 'accessibility-support-changed' _macOS_ _Windows_ + +Returns: + +* `event` Event +* `accessibilitySupportEnabled` Boolean - `true` when Chrome's accessibility + support is enabled, `false` otherwise. + +Emitted when Chrome's accessibility support changes. This event fires when +assistive technologies, such as screen readers, are enabled or disabled. +See https://www.chromium.org/developers/design-documents/accessibility for more +details. + ## Methods The `app` object has the following methods: @@ -625,6 +638,14 @@ Return an Object with the login item settings of the app. Set the app's login item settings. +### `app.isAccessibilitySupportEnabled()` _macOS_ _Windows_ + +Returns a `Boolean`, `true` if Chrome's accessibility support is enabled, +`false` otherwise. This API will return `true` if the use of assistive +technologies, such as screen readers, has been detected. See +https://www.chromium.org/developers/design-documents/accessibility for more +details. + ### `app.commandLine.appendSwitch(switch[, value])` Append a switch (with optional `value`) to Chromium's command line. From 131bff48ea7ce1d1031e2db687f7cfe018276c85 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:44:32 -0700 Subject: [PATCH 7/9] IsAccessibilitySupportEnabled -> isAccessibilitySupportEnabled --- atom/browser/api/atom_api_app.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 96d90d14f66..43ba298ad0d 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -588,7 +588,7 @@ void App::BuildPrototype( .SetMethod("makeSingleInstance", &App::MakeSingleInstance) .SetMethod("releaseSingleInstance", &App::ReleaseSingleInstance) .SetMethod("relaunch", &App::Relaunch) - .SetMethod("IsAccessibilitySupportEnabled", + .SetMethod("isAccessibilitySupportEnabled", &App::IsAccessibilitySupportEnabled) .SetMethod("disableHardwareAcceleration", &App::DisableHardwareAcceleration); From f5d371e1806b36ab5bb4f2a4aa19235148fac159 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:46:28 -0700 Subject: [PATCH 8/9] Remove linter warnings --- atom/browser/browser_observer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index 4217939911c..54617e5e09f 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -53,7 +53,7 @@ class BrowserObserver { const base::DictionaryValue& request_details) {} // The browser's accessibility suppport has changed. - virtual void OnAccessibilitySupportChanged() {}; + virtual void OnAccessibilitySupportChanged() {} #if defined(OS_MACOSX) // The browser wants to resume a user activity via handoff. (macOS only) From 4e22d5dd8a34e711cdef834c4785ebfc045e84f3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Jul 2016 14:48:48 -0700 Subject: [PATCH 9/9] Add missing typeof --- spec/api-app-spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index c95de0fb099..f1e1b1b5a7c 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -342,7 +342,7 @@ describe('app module', function () { describe('isAccessibilitySupportEnabled API', function () { it('returns whether the Chrome has accessibility APIs enabled', function () { - assert.equal(app.isAccessibilitySupportEnabled(), 'boolean') + assert.equal(typeof app.isAccessibilitySupportEnabled(), 'boolean') }) }) })