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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 386 |
387 AutomationInternalCustomBindings* owner_; | 387 AutomationInternalCustomBindings* owner_; |
388 bool removed_; | 388 bool removed_; |
389 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 389 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
390 | 390 |
391 DISALLOW_COPY_AND_ASSIGN(AutomationMessageFilter); | 391 DISALLOW_COPY_AND_ASSIGN(AutomationMessageFilter); |
392 }; | 392 }; |
393 | 393 |
394 AutomationInternalCustomBindings::AutomationInternalCustomBindings( | 394 AutomationInternalCustomBindings::AutomationInternalCustomBindings( |
395 ScriptContext* context) | 395 ScriptContext* context) |
396 : ObjectBackedNativeHandler(context), is_active_profile_(true) { | 396 : ObjectBackedNativeHandler(context), |
| 397 is_active_profile_(true), |
| 398 tree_change_observer_mask_( |
| 399 api::automation::TREE_CHANGE_OBSERVER_MASK_NOTREECHANGES) { |
397 // It's safe to use base::Unretained(this) here because these bindings | 400 // It's safe to use base::Unretained(this) here because these bindings |
398 // will only be called on a valid AutomationInternalCustomBindings instance | 401 // will only be called on a valid AutomationInternalCustomBindings instance |
399 // and none of the functions have any side effects. | 402 // and none of the functions have any side effects. |
400 #define ROUTE_FUNCTION(FN) \ | 403 #define ROUTE_FUNCTION(FN) \ |
401 RouteFunction(#FN, \ | 404 RouteFunction(#FN, \ |
402 base::Bind(&AutomationInternalCustomBindings::FN, \ | 405 base::Bind(&AutomationInternalCustomBindings::FN, \ |
403 base::Unretained(this))) | 406 base::Unretained(this))) |
404 ROUTE_FUNCTION(IsInteractPermitted); | 407 ROUTE_FUNCTION(IsInteractPermitted); |
405 ROUTE_FUNCTION(GetSchemaAdditions); | 408 ROUTE_FUNCTION(GetSchemaAdditions); |
406 ROUTE_FUNCTION(GetRoutingID); | 409 ROUTE_FUNCTION(GetRoutingID); |
407 ROUTE_FUNCTION(StartCachingAccessibilityTrees); | 410 ROUTE_FUNCTION(StartCachingAccessibilityTrees); |
408 ROUTE_FUNCTION(DestroyAccessibilityTree); | 411 ROUTE_FUNCTION(DestroyAccessibilityTree); |
| 412 ROUTE_FUNCTION(SetTreeChangeObserverMask); |
409 ROUTE_FUNCTION(GetChildIDAtIndex); | 413 ROUTE_FUNCTION(GetChildIDAtIndex); |
410 #undef ROUTE_FUNCTION | 414 #undef ROUTE_FUNCTION |
411 | 415 |
412 // Bindings that take a Tree ID and return a property of the tree. | 416 // Bindings that take a Tree ID and return a property of the tree. |
413 | 417 |
414 RouteTreeIDFunction( | 418 RouteTreeIDFunction( |
415 "GetRootID", [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, | 419 "GetRootID", [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, |
416 TreeCache* cache) { | 420 TreeCache* cache) { |
417 result.Set(v8::Integer::New(isolate, cache->tree.root()->id())); | 421 result.Set(v8::Integer::New(isolate, cache->tree.root()->id())); |
418 }); | 422 }); |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 auto iter = tree_id_to_tree_cache_map_.find(tree_id); | 729 auto iter = tree_id_to_tree_cache_map_.find(tree_id); |
726 if (iter == tree_id_to_tree_cache_map_.end()) | 730 if (iter == tree_id_to_tree_cache_map_.end()) |
727 return; | 731 return; |
728 | 732 |
729 TreeCache* cache = iter->second; | 733 TreeCache* cache = iter->second; |
730 tree_id_to_tree_cache_map_.erase(tree_id); | 734 tree_id_to_tree_cache_map_.erase(tree_id); |
731 axtree_to_tree_cache_map_.erase(&cache->tree); | 735 axtree_to_tree_cache_map_.erase(&cache->tree); |
732 delete cache; | 736 delete cache; |
733 } | 737 } |
734 | 738 |
| 739 void AutomationInternalCustomBindings::SetTreeChangeObserverMask( |
| 740 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 741 if (args.Length() != 1 || !args[0]->IsString()) { |
| 742 ThrowInvalidArgumentsException(this); |
| 743 return; |
| 744 } |
| 745 |
| 746 std::string mask_str = *v8::String::Utf8Value(args[0]); |
| 747 tree_change_observer_mask_ = |
| 748 api::automation::ParseTreeChangeObserverMask(mask_str); |
| 749 } |
| 750 |
735 void AutomationInternalCustomBindings::RouteTreeIDFunction( | 751 void AutomationInternalCustomBindings::RouteTreeIDFunction( |
736 const std::string& name, | 752 const std::string& name, |
737 TreeIDFunction callback) { | 753 TreeIDFunction callback) { |
738 scoped_refptr<TreeIDWrapper> wrapper = new TreeIDWrapper(this, callback); | 754 scoped_refptr<TreeIDWrapper> wrapper = new TreeIDWrapper(this, callback); |
739 RouteFunction(name, base::Bind(&TreeIDWrapper::Run, wrapper)); | 755 RouteFunction(name, base::Bind(&TreeIDWrapper::Run, wrapper)); |
740 } | 756 } |
741 | 757 |
742 void AutomationInternalCustomBindings::RouteNodeIDFunction( | 758 void AutomationInternalCustomBindings::RouteNodeIDFunction( |
743 const std::string& name, | 759 const std::string& name, |
744 NodeIDFunction callback) { | 760 NodeIDFunction callback) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 } | 918 } |
903 | 919 |
904 void AutomationInternalCustomBindings::SendTreeChangeEvent( | 920 void AutomationInternalCustomBindings::SendTreeChangeEvent( |
905 api::automation::TreeChangeType change_type, | 921 api::automation::TreeChangeType change_type, |
906 ui::AXTree* tree, | 922 ui::AXTree* tree, |
907 ui::AXNode* node) { | 923 ui::AXNode* node) { |
908 // Don't send tree change events when it's not the active profile. | 924 // Don't send tree change events when it's not the active profile. |
909 if (!is_active_profile_) | 925 if (!is_active_profile_) |
910 return; | 926 return; |
911 | 927 |
| 928 if (node->data().role != ui::AX_ROLE_EMBEDDED_OBJECT && |
| 929 node->data().role != ui::AX_ROLE_WEB_VIEW) { |
| 930 switch (tree_change_observer_mask_) { |
| 931 case api::automation::TREE_CHANGE_OBSERVER_MASK_NOTREECHANGES: |
| 932 default: |
| 933 return; |
| 934 case api::automation::TREE_CHANGE_OBSERVER_MASK_LIVEREGIONTREECHANGES: |
| 935 if (!node->data().HasStringAttribute( |
| 936 ui::AX_ATTR_CONTAINER_LIVE_STATUS) && |
| 937 node->data().role != ui::AX_ROLE_ALERT) { |
| 938 return; |
| 939 } |
| 940 break; |
| 941 case api::automation::TREE_CHANGE_OBSERVER_MASK_ALLTREECHANGES: |
| 942 break; |
| 943 } |
| 944 } |
| 945 |
912 auto iter = axtree_to_tree_cache_map_.find(tree); | 946 auto iter = axtree_to_tree_cache_map_.find(tree); |
913 if (iter == axtree_to_tree_cache_map_.end()) | 947 if (iter == axtree_to_tree_cache_map_.end()) |
914 return; | 948 return; |
915 | 949 |
916 int tree_id = iter->second->tree_id; | 950 int tree_id = iter->second->tree_id; |
917 | 951 |
918 v8::Isolate* isolate = GetIsolate(); | 952 v8::Isolate* isolate = GetIsolate(); |
919 v8::HandleScope handle_scope(isolate); | 953 v8::HandleScope handle_scope(isolate); |
920 v8::Context::Scope context_scope(context()->v8_context()); | 954 v8::Context::Scope context_scope(context()->v8_context()); |
921 v8::Local<v8::Array> args(v8::Array::New(GetIsolate(), 3U)); | 955 v8::Local<v8::Array> args(v8::Array::New(GetIsolate(), 3U)); |
922 args->Set(0U, v8::Integer::New(GetIsolate(), tree_id)); | 956 args->Set(0U, v8::Integer::New(GetIsolate(), tree_id)); |
923 args->Set(1U, v8::Integer::New(GetIsolate(), node->id())); | 957 args->Set(1U, v8::Integer::New(GetIsolate(), node->id())); |
924 args->Set(2U, CreateV8String(isolate, ToString(change_type))); | 958 args->Set(2U, CreateV8String(isolate, ToString(change_type))); |
925 context()->DispatchEvent("automationInternal.onTreeChange", args); | 959 context()->DispatchEvent("automationInternal.onTreeChange", args); |
926 } | 960 } |
927 | 961 |
928 } // namespace extensions | 962 } // namespace extensions |
OLD | NEW |