blob: fde90e8187ca36a75becedfbf541f2c16b003689 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/accessibility/browser_accessibility_state_impl.h"
#import <Cocoa/Cocoa.h>
#include "base/metrics/histogram_macros.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "ui/gfx/animation/animation.h"
@interface NSWorkspace (Partials)
@property(readonly) BOOL accessibilityDisplayShouldDifferentiateWithoutColor;
@property(readonly) BOOL accessibilityDisplayShouldIncreaseContrast;
@property(readonly) BOOL accessibilityDisplayShouldReduceTransparency;
@end
// Only available since 10.12.
@interface NSWorkspace (AvailableSinceSierra)
@property(readonly) BOOL accessibilityDisplayShouldReduceMotion;
@end
namespace content {
namespace {
void SetupAccessibilityDisplayOptionsNotifier() {
// We need to call into gfx::Animation and WebContentsImpl on the UI thread,
// so ensure that we setup the notification on the correct thread.
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (@available(macOS 10.10, *)) {
// Listen to accessibility display options changing, so that we can update
// the renderer for the prefers reduced motion settings.
//
// BrowserAccessibilityStateImpl is a deliberately leaked singleton, so we
// don't need to record the notification token for later cleanup.
[[[NSWorkspace sharedWorkspace] notificationCenter]
addObserverForName:
NSWorkspaceAccessibilityDisplayOptionsDidChangeNotification
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
gfx::Animation::UpdatePrefersReducedMotion();
for (WebContentsImpl* wc :
WebContentsImpl::GetAllWebContents()) {
wc->GetRenderViewHost()->OnWebkitPreferencesChanged();
}
}];
}
}
} // namespace
void BrowserAccessibilityStateImpl::PlatformInitialize() {
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(&SetupAccessibilityDisplayOptionsNotifier));
}
void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
// NOTE: This function is running on the file thread.
NSWorkspace* workspace = [NSWorkspace sharedWorkspace];
SEL sel = @selector(accessibilityDisplayShouldIncreaseContrast);
if ([workspace respondsToSelector:sel]) {
UMA_HISTOGRAM_BOOLEAN(
"Accessibility.Mac.DifferentiateWithoutColor",
workspace.accessibilityDisplayShouldDifferentiateWithoutColor);
UMA_HISTOGRAM_BOOLEAN("Accessibility.Mac.IncreaseContrast",
workspace.accessibilityDisplayShouldIncreaseContrast);
UMA_HISTOGRAM_BOOLEAN(
"Accessibility.Mac.ReduceTransparency",
workspace.accessibilityDisplayShouldReduceTransparency);
UMA_HISTOGRAM_BOOLEAN(
"Accessibility.Mac.FullKeyboardAccessEnabled",
static_cast<NSApplication*>(NSApp).fullKeyboardAccessEnabled);
}
sel = @selector(accessibilityDisplayShouldReduceMotion);
if ([workspace respondsToSelector:sel]) {
UMA_HISTOGRAM_BOOLEAN("Accessibility.Mac.ReduceMotion",
workspace.accessibilityDisplayShouldReduceMotion);
}
}
} // namespace content