// 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
