1// Copyright 2014 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_SHELL_RENDERER_TEST_RUNNER_WEB_AX_OBJECT_PROXY_H_
6#define CONTENT_SHELL_RENDERER_TEST_RUNNER_WEB_AX_OBJECT_PROXY_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "gin/object_template_builder.h"
12#include "gin/wrappable.h"
13#include "third_party/WebKit/public/web/WebAXObject.h"
14#include "v8/include/v8-util.h"
15#include "v8/include/v8.h"
16
17namespace blink {
18class WebFrame;
19}
20
21namespace content {
22
23class WebAXObjectProxy : public gin::Wrappable<WebAXObjectProxy> {
24 public:
25  class Factory {
26   public:
27    virtual ~Factory() { }
28    virtual v8::Handle<v8::Object> GetOrCreate(
29        const blink::WebAXObject& object) = 0;
30  };
31
32  static gin::WrapperInfo kWrapperInfo;
33
34  WebAXObjectProxy(const blink::WebAXObject& object, Factory* factory);
35  virtual ~WebAXObjectProxy();
36
37  // gin::Wrappable:
38  virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
39      v8::Isolate* isolate) OVERRIDE;
40
41  virtual v8::Handle<v8::Object> GetChildAtIndex(unsigned index);
42  virtual bool IsRoot() const;
43  bool IsEqualToObject(const blink::WebAXObject& object);
44
45  void NotificationReceived(blink::WebFrame* frame,
46                            const std::string& notification_name);
47  void Reset();
48
49 protected:
50  const blink::WebAXObject& accessibility_object() const {
51    return accessibility_object_;
52  }
53
54  Factory* factory() const { return factory_; }
55
56 private:
57  friend class WebAXObjectProxyBindings;
58
59  // Bound properties.
60  std::string Role();
61  std::string Title();
62  std::string Description();
63  std::string HelpText();
64  std::string StringValue();
65  int X();
66  int Y();
67  int Width();
68  int Height();
69  int IntValue();
70  int MinValue();
71  int MaxValue();
72  std::string ValueDescription();
73  int ChildrenCount();
74  int InsertionPointLineNumber();
75  std::string SelectedTextRange();
76  bool IsEnabled();
77  bool IsRequired();
78  bool IsFocused();
79  bool IsFocusable();
80  bool IsSelected();
81  bool IsSelectable();
82  bool IsMultiSelectable();
83  bool IsSelectedOptionActive();
84  bool IsExpanded();
85  bool IsChecked();
86  bool IsVisible();
87  bool IsOffScreen();
88  bool IsCollapsed();
89  bool HasPopup();
90  bool IsValid();
91  bool IsReadOnly();
92  std::string Orientation();
93  int ClickPointX();
94  int ClickPointY();
95  int32_t RowCount();
96  int32_t ColumnCount();
97  bool IsClickable();
98
99  // Bound methods.
100  std::string AllAttributes();
101  std::string AttributesOfChildren();
102  int LineForIndex(int index);
103  std::string BoundsForRange(int start, int end);
104  v8::Handle<v8::Object> ChildAtIndex(int index);
105  v8::Handle<v8::Object> ElementAtPoint(int x, int y);
106  v8::Handle<v8::Object> TableHeader();
107  std::string RowIndexRange();
108  std::string ColumnIndexRange();
109  v8::Handle<v8::Object> CellForColumnAndRow(int column, int row);
110  v8::Handle<v8::Object> TitleUIElement();
111  void SetSelectedTextRange(int selection_start, int length);
112  bool IsAttributeSettable(const std::string& attribute);
113  bool IsPressActionSupported();
114  bool IsIncrementActionSupported();
115  bool IsDecrementActionSupported();
116  v8::Handle<v8::Object> ParentElement();
117  void Increment();
118  void Decrement();
119  void ShowMenu();
120  void Press();
121  bool IsEqual(v8::Handle<v8::Object> proxy);
122  void SetNotificationListener(v8::Handle<v8::Function> callback);
123  void UnsetNotificationListener();
124  void TakeFocus();
125  void ScrollToMakeVisible();
126  void ScrollToMakeVisibleWithSubFocus(int x, int y, int width, int height);
127  void ScrollToGlobalPoint(int x, int y);
128  int WordStart(int character_index);
129  int WordEnd(int character_index);
130
131  blink::WebAXObject accessibility_object_;
132  Factory* factory_;
133
134  v8::Persistent<v8::Function> notification_callback_;
135
136  DISALLOW_COPY_AND_ASSIGN(WebAXObjectProxy);
137};
138
139class RootWebAXObjectProxy : public WebAXObjectProxy {
140 public:
141  RootWebAXObjectProxy(const blink::WebAXObject&, Factory*);
142
143  virtual v8::Handle<v8::Object> GetChildAtIndex(unsigned index) OVERRIDE;
144  virtual bool IsRoot() const OVERRIDE;
145};
146
147
148// Provides simple lifetime management of the WebAXObjectProxy instances: all
149// WebAXObjectProxys ever created from the controller are stored in a list and
150// cleared explicitly.
151class WebAXObjectProxyList : public WebAXObjectProxy::Factory {
152 public:
153  WebAXObjectProxyList();
154  virtual ~WebAXObjectProxyList();
155
156  void Clear();
157  virtual v8::Handle<v8::Object> GetOrCreate(
158      const blink::WebAXObject&) OVERRIDE;
159  v8::Handle<v8::Object> CreateRoot(const blink::WebAXObject&);
160
161 private:
162  typedef v8::PersistentValueVector<v8::Object> ElementList;
163  ElementList elements_;
164};
165
166}  // namespace content
167
168#endif  // CONTENT_SHELL_RENDERER_TEST_RUNNER_WEB_AX_OBJECT_PROXY_H_
169