// Copyright 2017 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 "ui/accessibility/platform/ax_fake_caret_win.h"

#include <windows.h>

#include "base/logging.h"
#include "ui/accessibility/ax_enums.h"
#include "ui/accessibility/platform/ax_platform_node_win.h"
#include "ui/accessibility/platform/ax_platform_unique_id.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/rect_f.h"

namespace ui {

AXFakeCaretWin::AXFakeCaretWin(gfx::AcceleratedWidget event_target)
    : event_target_(event_target) {
  caret_ = static_cast<AXPlatformNodeWin*>(AXPlatformNodeWin::Create(this));
  data_.id = GetNextAXPlatformNodeUniqueId();
  data_.role = AX_ROLE_CARET;
  data_.state = 0;
  data_.SetName(L"caret");
  data_.offset_container_id = -1;
}

AXFakeCaretWin::~AXFakeCaretWin() {
  caret_->Destroy();
  caret_ = nullptr;
}

base::win::ScopedComPtr<IAccessible> AXFakeCaretWin::GetCaret() const {
  base::win::ScopedComPtr<IAccessible> caret_accessible;
  HRESULT hr = caret_->QueryInterface(
      IID_IAccessible,
      reinterpret_cast<void**>(caret_accessible.GetAddressOf()));
  DCHECK(SUCCEEDED(hr));
  return caret_accessible;
}

void AXFakeCaretWin::MoveCaretTo(const gfx::Rect& bounds) {
  if (bounds.IsEmpty())
    return;
  data_.location = gfx::RectF(bounds);
  if (event_target_) {
    ::NotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, event_target_, OBJID_CARET,
                     -data_.id);
  }
}

const AXNodeData& AXFakeCaretWin::GetData() const {
  return data_;
}

const ui::AXTreeData& AXFakeCaretWin::GetTreeData() const {
  CR_DEFINE_STATIC_LOCAL(ui::AXTreeData, empty_data, ());
  return empty_data;
}

gfx::NativeWindow AXFakeCaretWin::GetTopLevelWidget() {
  return nullptr;
}

gfx::NativeViewAccessible AXFakeCaretWin::GetParent() {
  if (!event_target_)
    return nullptr;

  gfx::NativeViewAccessible parent;
  HRESULT hr =
      ::AccessibleObjectFromWindow(event_target_, OBJID_WINDOW, IID_IAccessible,
                                   reinterpret_cast<void**>(&parent));
  if (SUCCEEDED(hr))
    return parent;
  return nullptr;
}

int AXFakeCaretWin::GetChildCount() {
  return 0;
}

gfx::NativeViewAccessible AXFakeCaretWin::ChildAtIndex(int index) {
  return nullptr;
}

gfx::Rect AXFakeCaretWin::GetScreenBoundsRect() const {
  gfx::Rect bounds = ToEnclosingRect(data_.location);
  return bounds;
}

gfx::NativeViewAccessible AXFakeCaretWin::HitTestSync(int x, int y) {
  return nullptr;
}

gfx::NativeViewAccessible AXFakeCaretWin::GetFocus() {
  return nullptr;
}

gfx::AcceleratedWidget AXFakeCaretWin::GetTargetForNativeAccessibilityEvent() {
  return event_target_;
}

bool AXFakeCaretWin::AccessibilityPerformAction(const ui::AXActionData& data) {
  return false;
}

bool AXFakeCaretWin::ShouldIgnoreHoveredStateForTesting() {
  return true;
}

}  // namespace ui
