// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_SHELL_PLATFORM_DARWIN_MACOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_MAC_H_
#define FLUTTER_SHELL_PLATFORM_DARWIN_MACOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_MAC_H_

#import <Cocoa/Cocoa.h>

#include "flutter/fml/macros.h"
#include "flutter/shell/platform/common/accessibility_bridge.h"

@class FlutterEngine;
@class FlutterViewController;

namespace flutter {

//------------------------------------------------------------------------------
/// The macOS implementation of AccessibilityBridge.
///
/// This interacts with macOS accessibility APIs, which includes routing
/// accessibility events fired from the framework to macOS, routing native
/// macOS accessibility events to the framework, and creating macOS-specific
/// FlutterPlatformNodeDelegate objects for each node in the semantics tree.
///
/// AccessibilityBridgeMac must be created as a shared_ptr, since some methods
/// acquires its weak_ptr.
class AccessibilityBridgeMac : public AccessibilityBridge {
 public:
  //---------------------------------------------------------------------------
  /// @brief      Creates an AccessibilityBridgeMacDelegate.
  /// @param[in]  flutter_engine     The weak reference to the FlutterEngine.
  /// @param[in]  view_controller    The weak reference to the FlutterViewController.
  explicit AccessibilityBridgeMac(__weak FlutterEngine* flutter_engine,
                                  __weak FlutterViewController* view_controller);
  virtual ~AccessibilityBridgeMac() = default;

  // |FlutterPlatformNodeDelegate::OwnerBridge|
  void DispatchAccessibilityAction(AccessibilityNodeId target,
                                   FlutterSemanticsAction action,
                                   fml::MallocMapping data) override;

  // Update the default view controller, and recreate the corresponding
  // accessibility node delegate.
  //
  // This is called by the engine when the default view controller is updated.
  void UpdateDefaultViewController(__weak FlutterViewController* view_controller);

 protected:
  // |AccessibilityBridge|
  void OnAccessibilityEvent(ui::AXEventGenerator::TargetedEvent targeted_event) override;

  // |AccessibilityBridge|
  std::shared_ptr<FlutterPlatformNodeDelegate> CreateFlutterPlatformNodeDelegate() override;

 private:
  /// A wrapper structure to wraps macOS native accessibility events.
  struct NSAccessibilityEvent {
    NSAccessibilityNotificationName name;
    gfx::NativeViewAccessible target;
    NSDictionary* user_info;
  };

  //---------------------------------------------------------------------------
  /// @brief      Posts the given event against the given node to the macOS
  ///             accessibility notification system.
  /// @param[in]  native_node       The event target, must not be nil.
  /// @param[in]  mac_notification  The event name, must not be nil.
  virtual void DispatchMacOSNotification(gfx::NativeViewAccessible native_node,
                                         NSAccessibilityNotificationName mac_notification);

  //---------------------------------------------------------------------------
  /// @brief      Posts the given event against the given node with the
  ///             additional attributes to the macOS accessibility notification
  ///             system.
  /// @param[in]  native_node       The event target, must not be nil.
  /// @param[in]  mac_notification  The event name, must not be nil.
  /// @param[in]  user_info         The additional attributes, must not be nil.
  void DispatchMacOSNotificationWithUserInfo(gfx::NativeViewAccessible native_node,
                                             NSAccessibilityNotificationName mac_notification,
                                             NSDictionary* user_info);

  //---------------------------------------------------------------------------
  /// @brief      Whether the given event is in current pending events.
  /// @param[in]  event_type        The event to look up.
  bool HasPendingEvent(ui::AXEventGenerator::Event event) const;

  //---------------------------------------------------------------------------
  /// @brief      Converts the give ui::AXEventGenerator::Event into
  ///             macOS native accessibility event[s]
  /// @param[in]  event_type        The original event type.
  /// @param[in]  ax_node           The original event target.
  std::vector<NSAccessibilityEvent> MacOSEventsFromAXEvent(ui::AXEventGenerator::Event event_type,
                                                           const ui::AXNode& ax_node) const;

  __weak FlutterEngine* flutter_engine_;
  __weak FlutterViewController* view_controller_;

  FML_DISALLOW_COPY_AND_ASSIGN(AccessibilityBridgeMac);
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_DARWIN_MACOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_MAC_H_
