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 "chrome/renderer/extensions/automation_internal_custom_bindings.h" | 5 #include "chrome/renderer/extensions/automation_internal_custom_bindings.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 | 258 |
259 AutomationInternalCustomBindings* owner_; | 259 AutomationInternalCustomBindings* owner_; |
260 bool removed_; | 260 bool removed_; |
261 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 261 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
262 | 262 |
263 DISALLOW_COPY_AND_ASSIGN(AutomationMessageFilter); | 263 DISALLOW_COPY_AND_ASSIGN(AutomationMessageFilter); |
264 }; | 264 }; |
265 | 265 |
266 AutomationInternalCustomBindings::AutomationInternalCustomBindings( | 266 AutomationInternalCustomBindings::AutomationInternalCustomBindings( |
267 ScriptContext* context) | 267 ScriptContext* context) |
268 : ObjectBackedNativeHandler(context), is_active_profile_(true) { | 268 : ObjectBackedNativeHandler(context), |
269 is_active_profile_(true), | |
270 tree_change_observer_mask_( | |
271 api::automation::TREE_CHANGE_OBSERVER_MASK_NOTREECHANGES) { | |
269 // It's safe to use base::Unretained(this) here because these bindings | 272 // It's safe to use base::Unretained(this) here because these bindings |
270 // will only be called on a valid AutomationInternalCustomBindings instance | 273 // will only be called on a valid AutomationInternalCustomBindings instance |
271 // and none of the functions have any side effects. | 274 // and none of the functions have any side effects. |
272 #define ROUTE_FUNCTION(FN) \ | 275 #define ROUTE_FUNCTION(FN) \ |
273 RouteFunction(#FN, \ | 276 RouteFunction(#FN, \ |
274 base::Bind(&AutomationInternalCustomBindings::FN, \ | 277 base::Bind(&AutomationInternalCustomBindings::FN, \ |
275 base::Unretained(this))) | 278 base::Unretained(this))) |
276 ROUTE_FUNCTION(IsInteractPermitted); | 279 ROUTE_FUNCTION(IsInteractPermitted); |
277 ROUTE_FUNCTION(GetSchemaAdditions); | 280 ROUTE_FUNCTION(GetSchemaAdditions); |
278 ROUTE_FUNCTION(GetRoutingID); | 281 ROUTE_FUNCTION(GetRoutingID); |
279 ROUTE_FUNCTION(StartCachingAccessibilityTrees); | 282 ROUTE_FUNCTION(StartCachingAccessibilityTrees); |
280 ROUTE_FUNCTION(DestroyAccessibilityTree); | 283 ROUTE_FUNCTION(DestroyAccessibilityTree); |
284 ROUTE_FUNCTION(SetTreeChangeObserverMask); | |
281 ROUTE_FUNCTION(GetChildIDAtIndex); | 285 ROUTE_FUNCTION(GetChildIDAtIndex); |
282 #undef ROUTE_FUNCTION | 286 #undef ROUTE_FUNCTION |
283 | 287 |
284 // Bindings that take a Tree ID and return a property of the tree. | 288 // Bindings that take a Tree ID and return a property of the tree. |
285 | 289 |
286 RouteTreeIDFunction( | 290 RouteTreeIDFunction( |
287 "GetRootID", [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, | 291 "GetRootID", [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, |
288 TreeCache* cache) { | 292 TreeCache* cache) { |
289 result.Set(v8::Integer::New(isolate, cache->tree.root()->id())); | 293 result.Set(v8::Integer::New(isolate, cache->tree.root()->id())); |
290 }); | 294 }); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
563 auto iter = tree_id_to_tree_cache_map_.find(tree_id); | 567 auto iter = tree_id_to_tree_cache_map_.find(tree_id); |
564 if (iter == tree_id_to_tree_cache_map_.end()) | 568 if (iter == tree_id_to_tree_cache_map_.end()) |
565 return; | 569 return; |
566 | 570 |
567 TreeCache* cache = iter->second; | 571 TreeCache* cache = iter->second; |
568 tree_id_to_tree_cache_map_.erase(tree_id); | 572 tree_id_to_tree_cache_map_.erase(tree_id); |
569 axtree_to_tree_cache_map_.erase(&cache->tree); | 573 axtree_to_tree_cache_map_.erase(&cache->tree); |
570 delete cache; | 574 delete cache; |
571 } | 575 } |
572 | 576 |
577 void AutomationInternalCustomBindings::SetTreeChangeObserverMask( | |
578 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
579 if (args.Length() != 1 || !args[0]->IsString()) { | |
580 ThrowInvalidArgumentsException(this); | |
581 return; | |
582 } | |
583 | |
584 std::string mask_str = *v8::String::Utf8Value(args[0]); | |
585 tree_change_observer_mask_ = | |
Peter Lundblad
2015/11/20 13:42:59
What catches invalid values?
dmazzoni
2015/11/23 20:16:50
ParseTreeChangeObserverMask is autogenerated, it t
| |
586 api::automation::ParseTreeChangeObserverMask(mask_str); | |
587 } | |
588 | |
573 void AutomationInternalCustomBindings::RouteTreeIDFunction( | 589 void AutomationInternalCustomBindings::RouteTreeIDFunction( |
574 const std::string& name, | 590 const std::string& name, |
575 TreeIDFunction callback) { | 591 TreeIDFunction callback) { |
576 scoped_refptr<TreeIDWrapper> wrapper = new TreeIDWrapper(this, callback); | 592 scoped_refptr<TreeIDWrapper> wrapper = new TreeIDWrapper(this, callback); |
577 RouteFunction(name, base::Bind(&TreeIDWrapper::Run, wrapper)); | 593 RouteFunction(name, base::Bind(&TreeIDWrapper::Run, wrapper)); |
578 } | 594 } |
579 | 595 |
580 void AutomationInternalCustomBindings::RouteNodeIDFunction( | 596 void AutomationInternalCustomBindings::RouteNodeIDFunction( |
581 const std::string& name, | 597 const std::string& name, |
582 NodeIDFunction callback) { | 598 NodeIDFunction callback) { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
732 } | 748 } |
733 | 749 |
734 void AutomationInternalCustomBindings::SendTreeChangeEvent( | 750 void AutomationInternalCustomBindings::SendTreeChangeEvent( |
735 api::automation::TreeChangeType change_type, | 751 api::automation::TreeChangeType change_type, |
736 ui::AXTree* tree, | 752 ui::AXTree* tree, |
737 ui::AXNode* node) { | 753 ui::AXNode* node) { |
738 // Don't send tree change events when it's not the active profile. | 754 // Don't send tree change events when it's not the active profile. |
739 if (!is_active_profile_) | 755 if (!is_active_profile_) |
740 return; | 756 return; |
741 | 757 |
758 if (node->data().role != ui::AX_ROLE_EMBEDDED_OBJECT && | |
759 node->data().role != ui::AX_ROLE_WEB_VIEW) { | |
760 switch (tree_change_observer_mask_) { | |
761 case api::automation::TREE_CHANGE_OBSERVER_MASK_NOTREECHANGES: | |
762 default: | |
763 return; | |
764 case api::automation::TREE_CHANGE_OBSERVER_MASK_LIVEREGIONTREECHANGES: | |
765 if (!node->data().HasStringAttribute( | |
766 ui::AX_ATTR_CONTAINER_LIVE_STATUS) && | |
767 node->data().role != ui::AX_ROLE_ALERT) { | |
768 return; | |
769 } | |
770 break; | |
771 case api::automation::TREE_CHANGE_OBSERVER_MASK_ALLTREECHANGES: | |
772 break; | |
773 } | |
774 } | |
775 | |
742 auto iter = axtree_to_tree_cache_map_.find(tree); | 776 auto iter = axtree_to_tree_cache_map_.find(tree); |
743 if (iter == axtree_to_tree_cache_map_.end()) | 777 if (iter == axtree_to_tree_cache_map_.end()) |
744 return; | 778 return; |
745 | 779 |
746 int tree_id = iter->second->tree_id; | 780 int tree_id = iter->second->tree_id; |
747 | 781 |
748 v8::Isolate* isolate = GetIsolate(); | 782 v8::Isolate* isolate = GetIsolate(); |
749 v8::HandleScope handle_scope(isolate); | 783 v8::HandleScope handle_scope(isolate); |
750 v8::Context::Scope context_scope(context()->v8_context()); | 784 v8::Context::Scope context_scope(context()->v8_context()); |
751 v8::Local<v8::Array> args(v8::Array::New(GetIsolate(), 3U)); | 785 v8::Local<v8::Array> args(v8::Array::New(GetIsolate(), 3U)); |
752 args->Set(0U, v8::Integer::New(GetIsolate(), tree_id)); | 786 args->Set(0U, v8::Integer::New(GetIsolate(), tree_id)); |
753 args->Set(1U, v8::Integer::New(GetIsolate(), node->id())); | 787 args->Set(1U, v8::Integer::New(GetIsolate(), node->id())); |
754 args->Set(2U, CreateV8String(isolate, ToString(change_type))); | 788 args->Set(2U, CreateV8String(isolate, ToString(change_type))); |
755 context()->DispatchEvent("automationInternal.onTreeChange", args); | 789 context()->DispatchEvent("automationInternal.onTreeChange", args); |
756 } | 790 } |
757 | 791 |
758 } // namespace extensions | 792 } // namespace extensions |
OLD | NEW |