OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/test_runner/accessibility_controller.h" | 5 #include "content/shell/test_runner/accessibility_controller.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "components/test_runner/web_view_test_proxy.h" | 8 #include "content/shell/test_runner/web_view_test_proxy.h" |
9 #include "gin/handle.h" | 9 #include "gin/handle.h" |
10 #include "gin/object_template_builder.h" | 10 #include "gin/object_template_builder.h" |
11 #include "gin/wrappable.h" | 11 #include "gin/wrappable.h" |
12 #include "third_party/WebKit/public/web/WebDocument.h" | 12 #include "third_party/WebKit/public/web/WebDocument.h" |
13 #include "third_party/WebKit/public/web/WebElement.h" | 13 #include "third_party/WebKit/public/web/WebElement.h" |
14 #include "third_party/WebKit/public/web/WebFrame.h" | 14 #include "third_party/WebKit/public/web/WebFrame.h" |
15 #include "third_party/WebKit/public/web/WebKit.h" | 15 #include "third_party/WebKit/public/web/WebKit.h" |
16 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 16 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
17 #include "third_party/WebKit/public/web/WebSettings.h" | 17 #include "third_party/WebKit/public/web/WebSettings.h" |
18 #include "third_party/WebKit/public/web/WebView.h" | 18 #include "third_party/WebKit/public/web/WebView.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 base::WeakPtr<AccessibilityController> controller, | 56 base::WeakPtr<AccessibilityController> controller, |
57 blink::WebLocalFrame* frame) { | 57 blink::WebLocalFrame* frame) { |
58 v8::Isolate* isolate = blink::mainThreadIsolate(); | 58 v8::Isolate* isolate = blink::mainThreadIsolate(); |
59 v8::HandleScope handle_scope(isolate); | 59 v8::HandleScope handle_scope(isolate); |
60 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); | 60 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); |
61 if (context.IsEmpty()) | 61 if (context.IsEmpty()) |
62 return; | 62 return; |
63 | 63 |
64 v8::Context::Scope context_scope(context); | 64 v8::Context::Scope context_scope(context); |
65 | 65 |
66 gin::Handle<AccessibilityControllerBindings> bindings = | 66 gin::Handle<AccessibilityControllerBindings> bindings = gin::CreateHandle( |
67 gin::CreateHandle(isolate, | 67 isolate, new AccessibilityControllerBindings(controller)); |
68 new AccessibilityControllerBindings(controller)); | |
69 if (bindings.IsEmpty()) | 68 if (bindings.IsEmpty()) |
70 return; | 69 return; |
71 v8::Local<v8::Object> global = context->Global(); | 70 v8::Local<v8::Object> global = context->Global(); |
72 global->Set(gin::StringToV8(isolate, "accessibilityController"), | 71 global->Set(gin::StringToV8(isolate, "accessibilityController"), |
73 bindings.ToV8()); | 72 bindings.ToV8()); |
74 } | 73 } |
75 | 74 |
76 AccessibilityControllerBindings::AccessibilityControllerBindings( | 75 AccessibilityControllerBindings::AccessibilityControllerBindings( |
77 base::WeakPtr<AccessibilityController> controller) | 76 base::WeakPtr<AccessibilityController> controller) |
78 : controller_(controller) { | 77 : controller_(controller) {} |
79 } | |
80 | 78 |
81 AccessibilityControllerBindings::~AccessibilityControllerBindings() { | 79 AccessibilityControllerBindings::~AccessibilityControllerBindings() {} |
82 } | |
83 | 80 |
84 gin::ObjectTemplateBuilder | 81 gin::ObjectTemplateBuilder |
85 AccessibilityControllerBindings::GetObjectTemplateBuilder( | 82 AccessibilityControllerBindings::GetObjectTemplateBuilder( |
86 v8::Isolate* isolate) { | 83 v8::Isolate* isolate) { |
87 return gin::Wrappable<AccessibilityControllerBindings>:: | 84 return gin::Wrappable< |
88 GetObjectTemplateBuilder(isolate) | 85 AccessibilityControllerBindings>::GetObjectTemplateBuilder(isolate) |
89 .SetMethod("logAccessibilityEvents", | 86 .SetMethod("logAccessibilityEvents", |
90 &AccessibilityControllerBindings::LogAccessibilityEvents) | 87 &AccessibilityControllerBindings::LogAccessibilityEvents) |
91 .SetMethod("setNotificationListener", | 88 .SetMethod("setNotificationListener", |
92 &AccessibilityControllerBindings::SetNotificationListener) | 89 &AccessibilityControllerBindings::SetNotificationListener) |
93 .SetMethod("unsetNotificationListener", | 90 .SetMethod("unsetNotificationListener", |
94 &AccessibilityControllerBindings::UnsetNotificationListener) | 91 &AccessibilityControllerBindings::UnsetNotificationListener) |
95 .SetProperty("focusedElement", | 92 .SetProperty("focusedElement", |
96 &AccessibilityControllerBindings::FocusedElement) | 93 &AccessibilityControllerBindings::FocusedElement) |
97 .SetProperty("rootElement", | 94 .SetProperty("rootElement", &AccessibilityControllerBindings::RootElement) |
98 &AccessibilityControllerBindings::RootElement) | |
99 .SetMethod("accessibleElementById", | 95 .SetMethod("accessibleElementById", |
100 &AccessibilityControllerBindings::AccessibleElementById) | 96 &AccessibilityControllerBindings::AccessibleElementById) |
101 // TODO(hajimehoshi): These are for backward compatibility. Remove them. | 97 // TODO(hajimehoshi): These are for backward compatibility. Remove them. |
102 .SetMethod("addNotificationListener", | 98 .SetMethod("addNotificationListener", |
103 &AccessibilityControllerBindings::SetNotificationListener) | 99 &AccessibilityControllerBindings::SetNotificationListener) |
104 .SetMethod("removeNotificationListener", | 100 .SetMethod("removeNotificationListener", |
105 &AccessibilityControllerBindings::UnsetNotificationListener); | 101 &AccessibilityControllerBindings::UnsetNotificationListener); |
106 } | 102 } |
107 | 103 |
108 void AccessibilityControllerBindings::LogAccessibilityEvents() { | 104 void AccessibilityControllerBindings::LogAccessibilityEvents() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 frame->view()->settings()->setInlineTextBoxAccessibilityEnabled(true); | 150 frame->view()->settings()->setInlineTextBoxAccessibilityEnabled(true); |
155 | 151 |
156 AccessibilityControllerBindings::Install(weak_factory_.GetWeakPtr(), frame); | 152 AccessibilityControllerBindings::Install(weak_factory_.GetWeakPtr(), frame); |
157 } | 153 } |
158 | 154 |
159 bool AccessibilityController::ShouldLogAccessibilityEvents() { | 155 bool AccessibilityController::ShouldLogAccessibilityEvents() { |
160 return log_accessibility_events_; | 156 return log_accessibility_events_; |
161 } | 157 } |
162 | 158 |
163 void AccessibilityController::NotificationReceived( | 159 void AccessibilityController::NotificationReceived( |
164 const blink::WebAXObject& target, const std::string& notification_name) { | 160 const blink::WebAXObject& target, |
| 161 const std::string& notification_name) { |
165 v8::Isolate* isolate = blink::mainThreadIsolate(); | 162 v8::Isolate* isolate = blink::mainThreadIsolate(); |
166 v8::HandleScope handle_scope(isolate); | 163 v8::HandleScope handle_scope(isolate); |
167 | 164 |
168 blink::WebFrame* frame = web_view()->mainFrame(); | 165 blink::WebFrame* frame = web_view()->mainFrame(); |
169 if (!frame || frame->isWebRemoteFrame()) | 166 if (!frame || frame->isWebRemoteFrame()) |
170 return; | 167 return; |
171 | 168 |
172 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); | 169 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); |
173 if (context.IsEmpty()) | 170 if (context.IsEmpty()) |
174 return; | 171 return; |
175 | 172 |
176 v8::Context::Scope context_scope(context); | 173 v8::Context::Scope context_scope(context); |
177 | 174 |
178 // Call notification listeners on the element. | 175 // Call notification listeners on the element. |
179 v8::Local<v8::Object> element_handle = elements_.GetOrCreate(target); | 176 v8::Local<v8::Object> element_handle = elements_.GetOrCreate(target); |
180 if (element_handle.IsEmpty()) | 177 if (element_handle.IsEmpty()) |
181 return; | 178 return; |
182 | 179 |
183 WebAXObjectProxy* element; | 180 WebAXObjectProxy* element; |
184 bool result = gin::ConvertFromV8(isolate, element_handle, &element); | 181 bool result = gin::ConvertFromV8(isolate, element_handle, &element); |
185 DCHECK(result); | 182 DCHECK(result); |
186 element->NotificationReceived(frame, notification_name); | 183 element->NotificationReceived(frame, notification_name); |
187 | 184 |
188 if (notification_callback_.IsEmpty()) | 185 if (notification_callback_.IsEmpty()) |
189 return; | 186 return; |
190 | 187 |
191 // Call global notification listeners. | 188 // Call global notification listeners. |
192 v8::Local<v8::Value> argv[] = { | 189 v8::Local<v8::Value> argv[] = { |
193 element_handle, | 190 element_handle, v8::String::NewFromUtf8(isolate, notification_name.data(), |
194 v8::String::NewFromUtf8(isolate, notification_name.data(), | 191 v8::String::kNormalString, |
195 v8::String::kNormalString, | 192 notification_name.size()), |
196 notification_name.size()), | |
197 }; | 193 }; |
198 frame->callFunctionEvenIfScriptDisabled( | 194 frame->callFunctionEvenIfScriptDisabled( |
199 v8::Local<v8::Function>::New(isolate, notification_callback_), | 195 v8::Local<v8::Function>::New(isolate, notification_callback_), |
200 context->Global(), | 196 context->Global(), arraysize(argv), argv); |
201 arraysize(argv), | |
202 argv); | |
203 } | 197 } |
204 | 198 |
205 void AccessibilityController::LogAccessibilityEvents() { | 199 void AccessibilityController::LogAccessibilityEvents() { |
206 log_accessibility_events_ = true; | 200 log_accessibility_events_ = true; |
207 } | 201 } |
208 | 202 |
209 void AccessibilityController::SetNotificationListener( | 203 void AccessibilityController::SetNotificationListener( |
210 v8::Local<v8::Function> callback) { | 204 v8::Local<v8::Function> callback) { |
211 v8::Isolate* isolate = blink::mainThreadIsolate(); | 205 v8::Isolate* isolate = blink::mainThreadIsolate(); |
212 notification_callback_.Reset(isolate, callback); | 206 notification_callback_.Reset(isolate, callback); |
(...skipping 13 matching lines...) Expand all Loading... |
226 if (focused_element.isNull()) | 220 if (focused_element.isNull()) |
227 focused_element = web_view()->accessibilityObject(); | 221 focused_element = web_view()->accessibilityObject(); |
228 return elements_.GetOrCreate(focused_element); | 222 return elements_.GetOrCreate(focused_element); |
229 } | 223 } |
230 | 224 |
231 v8::Local<v8::Object> AccessibilityController::RootElement() { | 225 v8::Local<v8::Object> AccessibilityController::RootElement() { |
232 blink::WebAXObject root_element = web_view()->accessibilityObject(); | 226 blink::WebAXObject root_element = web_view()->accessibilityObject(); |
233 return elements_.GetOrCreate(root_element); | 227 return elements_.GetOrCreate(root_element); |
234 } | 228 } |
235 | 229 |
236 v8::Local<v8::Object> | 230 v8::Local<v8::Object> AccessibilityController::AccessibleElementById( |
237 AccessibilityController::AccessibleElementById(const std::string& id) { | 231 const std::string& id) { |
238 blink::WebAXObject root_element = web_view()->accessibilityObject(); | 232 blink::WebAXObject root_element = web_view()->accessibilityObject(); |
239 | 233 |
240 if (!root_element.updateLayoutAndCheckValidity()) | 234 if (!root_element.updateLayoutAndCheckValidity()) |
241 return v8::Local<v8::Object>(); | 235 return v8::Local<v8::Object>(); |
242 | 236 |
243 return FindAccessibleElementByIdRecursive( | 237 return FindAccessibleElementByIdRecursive( |
244 root_element, blink::WebString::fromUTF8(id.c_str())); | 238 root_element, blink::WebString::fromUTF8(id.c_str())); |
245 } | 239 } |
246 | 240 |
247 v8::Local<v8::Object> | 241 v8::Local<v8::Object> |
248 AccessibilityController::FindAccessibleElementByIdRecursive( | 242 AccessibilityController::FindAccessibleElementByIdRecursive( |
249 const blink::WebAXObject& obj, const blink::WebString& id) { | 243 const blink::WebAXObject& obj, |
| 244 const blink::WebString& id) { |
250 if (obj.isNull() || obj.isDetached()) | 245 if (obj.isNull() || obj.isDetached()) |
251 return v8::Local<v8::Object>(); | 246 return v8::Local<v8::Object>(); |
252 | 247 |
253 blink::WebNode node = obj.node(); | 248 blink::WebNode node = obj.node(); |
254 if (!node.isNull() && node.isElementNode()) { | 249 if (!node.isNull() && node.isElementNode()) { |
255 blink::WebElement element = node.to<blink::WebElement>(); | 250 blink::WebElement element = node.to<blink::WebElement>(); |
256 element.getAttribute("id"); | 251 element.getAttribute("id"); |
257 if (element.getAttribute("id") == id) | 252 if (element.getAttribute("id") == id) |
258 return elements_.GetOrCreate(obj); | 253 return elements_.GetOrCreate(obj); |
259 } | 254 } |
260 | 255 |
261 unsigned childCount = obj.childCount(); | 256 unsigned childCount = obj.childCount(); |
262 for (unsigned i = 0; i < childCount; i++) { | 257 for (unsigned i = 0; i < childCount; i++) { |
263 v8::Local<v8::Object> result = | 258 v8::Local<v8::Object> result = |
264 FindAccessibleElementByIdRecursive(obj.childAt(i), id); | 259 FindAccessibleElementByIdRecursive(obj.childAt(i), id); |
265 if (*result) | 260 if (*result) |
266 return result; | 261 return result; |
267 } | 262 } |
268 | 263 |
269 return v8::Local<v8::Object>(); | 264 return v8::Local<v8::Object>(); |
270 } | 265 } |
271 | 266 |
272 blink::WebView* AccessibilityController::web_view() { | 267 blink::WebView* AccessibilityController::web_view() { |
273 return web_view_test_proxy_base_->web_view(); | 268 return web_view_test_proxy_base_->web_view(); |
274 } | 269 } |
275 | 270 |
276 } // namespace test_runner | 271 } // namespace test_runner |
OLD | NEW |