17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_ANDROID_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_ANDROID_H_
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace aria_strings {
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  extern const char kAriaLivePolite[];
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  extern const char kAriaLiveAssertive[];
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CONTENT_EXPORT BrowserAccessibilityManagerAndroid
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public BrowserAccessibilityManager {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BrowserAccessibilityManagerAndroid(
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::android::ScopedJavaLocalRef<jobject> content_view_core,
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const AccessibilityNodeData& src,
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserAccessibilityDelegate* delegate,
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~BrowserAccessibilityManagerAndroid();
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static AccessibilityNodeData GetEmptyDocument();
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void SetContentViewCore(
330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::android::ScopedJavaLocalRef<jobject> content_view_core);
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Implementation of BrowserAccessibilityManager.
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void NotifyAccessibilityEvent(
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebAXEvent event_type, BrowserAccessibility* node) OVERRIDE;
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // --------------------------------------------------------------------------
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Methods called from Java via JNI
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // --------------------------------------------------------------------------
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Tree methods.
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  jint GetRootId(JNIEnv* env, jobject obj);
45d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  jboolean IsNodeValid(JNIEnv* env, jobject obj, jint id);
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  jint HitTest(JNIEnv* env, jobject obj, jint x, jint y);
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Populate Java accessibility data structures with info about a node.
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  jboolean PopulateAccessibilityNodeInfo(
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      JNIEnv* env, jobject obj, jobject info, jint id);
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  jboolean PopulateAccessibilityEvent(
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      JNIEnv* env, jobject obj, jobject event, jint id, jint event_type);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Perform actions.
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Click(JNIEnv* env, jobject obj, jint id);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Focus(JNIEnv* env, jobject obj, jint id);
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Blur(JNIEnv* env, jobject obj);
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void NotifyRootChanged() OVERRIDE;
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual bool UseRootScrollOffsetsWhenComputingBounds() OVERRIDE;
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This gives BrowserAccessibilityManager::Create access to the class
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // constructor.
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class BrowserAccessibilityManager;
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // A weak reference to the Java BrowserAccessibilityManager object.
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This avoids adding another reference to BrowserAccessibilityManager and
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // preventing garbage collection.
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Premature garbage collection is prevented by the long-lived reference in
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ContentViewCore.
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  JavaObjectWeakGlobalRef java_ref_;
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Searches through the children of start_node to find the nearest
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // accessibility focus candidate for a touch which has not landed directly on
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // an accessibility focus candidate.
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BrowserAccessibility* FuzzyHitTest(
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int x, int y, BrowserAccessibility* start_node);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void FuzzyHitTestImpl(int x, int y, BrowserAccessibility* start_node,
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserAccessibility** nearest_candidate, int* min_distance);
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Calculates the distance from the point (x, y) to the nearest point on the
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // edge of |node|.
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static int CalculateDistanceSquared(int x, int y, BrowserAccessibility* node);
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerAndroid);
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RegisterBrowserAccessibilityManager(JNIEnv* env);
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_ANDROID_H_
97