1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_ANDROID_H_
6#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_ANDROID_H_
7
8#include "base/android/scoped_java_ref.h"
9#include "content/browser/accessibility/browser_accessibility_manager.h"
10#include "content/browser/android/content_view_core_impl.h"
11
12namespace content {
13
14namespace aria_strings {
15  extern const char kAriaLivePolite[];
16  extern const char kAriaLiveAssertive[];
17}
18
19class CONTENT_EXPORT BrowserAccessibilityManagerAndroid
20    : public BrowserAccessibilityManager {
21 public:
22  BrowserAccessibilityManagerAndroid(
23      base::android::ScopedJavaLocalRef<jobject> content_view_core,
24      const ui::AXTreeUpdate& initial_tree,
25      BrowserAccessibilityDelegate* delegate,
26      BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
27
28  virtual ~BrowserAccessibilityManagerAndroid();
29
30  static ui::AXTreeUpdate GetEmptyDocument();
31
32  void SetContentViewCore(
33      base::android::ScopedJavaLocalRef<jobject> content_view_core);
34
35  // Implementation of BrowserAccessibilityManager.
36  virtual void NotifyAccessibilityEvent(
37      ui::AXEvent event_type, BrowserAccessibility* node) OVERRIDE;
38
39  // --------------------------------------------------------------------------
40  // Methods called from Java via JNI
41  // --------------------------------------------------------------------------
42
43  // Tree methods.
44  jint GetRootId(JNIEnv* env, jobject obj);
45  jboolean IsNodeValid(JNIEnv* env, jobject obj, jint id);
46  void HitTest(JNIEnv* env, jobject obj, jint x, jint y);
47
48  // Populate Java accessibility data structures with info about a node.
49  jboolean PopulateAccessibilityNodeInfo(
50      JNIEnv* env, jobject obj, jobject info, jint id);
51  jboolean PopulateAccessibilityEvent(
52      JNIEnv* env, jobject obj, jobject event, jint id, jint event_type);
53
54  // Perform actions.
55  void Click(JNIEnv* env, jobject obj, jint id);
56  void Focus(JNIEnv* env, jobject obj, jint id);
57  void Blur(JNIEnv* env, jobject obj);
58  void ScrollToMakeNodeVisible(JNIEnv* env, jobject obj, int id);
59
60  // Return the id of the next node in tree order in the direction given by
61  // |forwards|, starting with |start_id|, that matches |element_type|,
62  // where |element_type| is a special uppercase string from TalkBack or
63  // BrailleBack indicating general categories of web content like
64  // "SECTION" or "CONTROL".  Return 0 if not found.
65  jint FindElementType(JNIEnv* env, jobject obj, jint start_id,
66                       jstring element_type, jboolean forwards);
67
68 protected:
69  // AXTreeDelegate overrides.
70  virtual void OnRootChanged(ui::AXNode* new_root) OVERRIDE;
71
72  virtual bool UseRootScrollOffsetsWhenComputingBounds() OVERRIDE;
73
74 private:
75  // This gives BrowserAccessibilityManager::Create access to the class
76  // constructor.
77  friend class BrowserAccessibilityManager;
78
79  // A weak reference to the Java BrowserAccessibilityManager object.
80  // This avoids adding another reference to BrowserAccessibilityManager and
81  // preventing garbage collection.
82  // Premature garbage collection is prevented by the long-lived reference in
83  // ContentViewCore.
84  JavaObjectWeakGlobalRef java_ref_;
85
86  // Handle a hover event from the renderer process.
87  void HandleHoverEvent(BrowserAccessibility* node);
88
89  DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerAndroid);
90};
91
92bool RegisterBrowserAccessibilityManager(JNIEnv* env);
93
94}
95
96#endif  // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_ANDROID_H_
97