Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Side by Side Diff: ui/accessibility/platform/ax_platform_node_win.cc

Issue 2933353002: Forward four more BrowserAccessibility APIs to AXPlatformNode. (Closed)
Patch Set: linux testing via try Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <atlbase.h> 5 #include <atlbase.h>
6 #include <atlcom.h> 6 #include <atlcom.h>
7 #include <limits.h> 7 #include <limits.h>
8 #include <oleacc.h> 8 #include <oleacc.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
11 #include "base/containers/hash_tables.h" 11 #include "base/containers/hash_tables.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
15 #include "base/strings/utf_string_conversions.h"
14 #include "base/win/scoped_comptr.h" 16 #include "base/win/scoped_comptr.h"
15 #include "base/win/scoped_variant.h" 17 #include "base/win/scoped_variant.h"
16 #include "third_party/iaccessible2/ia2_api_all.h" 18 #include "third_party/iaccessible2/ia2_api_all.h"
17 #include "ui/accessibility/ax_action_data.h" 19 #include "ui/accessibility/ax_action_data.h"
18 #include "ui/accessibility/ax_node_data.h" 20 #include "ui/accessibility/ax_node_data.h"
19 #include "ui/accessibility/ax_text_utils.h" 21 #include "ui/accessibility/ax_text_utils.h"
22 #include "ui/accessibility/ax_tree_data.h"
20 #include "ui/accessibility/platform/ax_platform_node_delegate.h" 23 #include "ui/accessibility/platform/ax_platform_node_delegate.h"
21 #include "ui/accessibility/platform/ax_platform_node_win.h" 24 #include "ui/accessibility/platform/ax_platform_node_win.h"
22 #include "ui/base/win/atl_module.h" 25 #include "ui/base/win/atl_module.h"
23 #include "ui/gfx/geometry/rect_conversions.h" 26 #include "ui/gfx/geometry/rect_conversions.h"
24 27
25 // 28 //
26 // Macros to use at the top of any AXPlatformNodeWin function that implements 29 // Macros to use at the top of any AXPlatformNodeWin function that implements
27 // a COM interface. Because COM objects are reference counted and clients 30 // a COM interface. Because COM objects are reference counted and clients
28 // are completely untrusted, it's important to always first check that our 31 // are completely untrusted, it's important to always first check that our
29 // object is still valid, and then check that all pointer arguments are 32 // object is still valid, and then check that all pointer arguments are
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 532
530 STDMETHODIMP AXPlatformNodeWin::get_accHelp( 533 STDMETHODIMP AXPlatformNodeWin::get_accHelp(
531 VARIANT var_id, BSTR* help) { 534 VARIANT var_id, BSTR* help) {
532 COM_OBJECT_VALIDATE_1_ARG(help); 535 COM_OBJECT_VALIDATE_1_ARG(help);
533 return S_FALSE; 536 return S_FALSE;
534 } 537 }
535 538
536 STDMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) { 539 STDMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) {
537 AXPlatformNodeWin* target; 540 AXPlatformNodeWin* target;
538 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, value, target); 541 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, value, target);
539 return target->GetStringAttributeAsBstr(ui::AX_ATTR_VALUE, value); 542
543 // get_accValue() has two sets of special cases depending on the node's role.
544 // The first set apply without regard for the nodes |value| attribute. That is
545 // the nodes value attribute isn't consider for the first set of special
546 // cases. For example, if the node role is AX_ROLE_COLOR_WELL, we do not care
547 // at all about the node's AX_ATTR_VALUE attribute. The second set of special
548 // cases only apply if the value attribute for the node is empty. That is, if
549 // AX_ATTR_VALUE is empty, we do something special.
550
551 base::string16 result;
552
553 //
554 // Color Well special case (Use AX_ATTR_COLOR_VALUE)
555 //
556 if (target->GetData().role == ui::AX_ROLE_COLOR_WELL) {
557 unsigned int color = static_cast<unsigned int>(target->GetIntAttribute(
558 ui::AX_ATTR_COLOR_VALUE)); // todo, why the static cast?
559
560 // To avoid a dependency on third_party/skia, we will just
dmazzoni 2017/06/15 06:24:48 We already depend on //skia, I'd just add the depe
561 // duplicate these macros here:
562 /** return the red byte from a SkColor value */
563 #define SkColorGetR(color) (((color) >> 16) & 0xFF)
564 /** return the green byte from a SkColor value */
565 #define SkColorGetG(color) (((color) >> 8) & 0xFF)
566 /** return the blue byte from a SkColor value */
567 #define SkColorGetB(color) (((color) >> 0) & 0xFF)
568
569 unsigned int red = SkColorGetR(color);
570 unsigned int green = SkColorGetG(color);
571 unsigned int blue = SkColorGetB(color);
572 base::string16 value_text;
573 value_text = base::UintToString16(red * 100 / 255) + L"% red " +
574 base::UintToString16(green * 100 / 255) + L"% green " +
575 base::UintToString16(blue * 100 / 255) + L"% blue";
576 *value = SysAllocString(value_text.c_str());
577 DCHECK(*value);
578 return S_OK;
579 }
580
581 //
582 // Document special case (Use the document's url)
583 //
584 if (target->GetData().role == ui::AX_ROLE_ROOT_WEB_AREA ||
585 target->GetData().role == ui::AX_ROLE_WEB_AREA) {
586 result = base::UTF8ToUTF16(target->delegate_->GetTreeData().url);
587 *value = SysAllocString(result.c_str());
588 DCHECK(*value);
589 return S_OK;
590 }
591
592 //
593 // Links (Use AX_ATTR_URL)
594 //
595 if (target->GetData().role == ui::AX_ROLE_LINK ||
596 target->GetData().role == ui::AX_ROLE_IMAGE_MAP_LINK) {
597 result = target->GetString16Attribute(ui::AX_ATTR_URL);
598 *value = SysAllocString(result.c_str());
599 DCHECK(*value);
600 return S_OK;
601 }
602
603 // After this point, the role based special cases should test for an empty
604 // result.
605
606 result = target->GetString16Attribute(ui::AX_ATTR_VALUE);
607
608 //
609 // RangeValue (Use AX_ATTR_VALUE_FOR_RANGE)
610 //
611 if (result.empty() && target->IsRangeValueSupported()) {
612 float fval;
613 if (target->GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) {
614 result = base::UTF8ToUTF16(base::DoubleToString(fval));
615 *value = SysAllocString(result.c_str());
616 DCHECK(*value);
617 return S_OK;
618 }
619 }
620
621 // Last resort (Use innerText)
622 if (result.empty() &&
623 (target->IsSimpleTextControl() || target->IsRichTextControl()) &&
624 !target->IsNativeTextControl()) {
625 result = target->GetInnerText();
626 }
627
628 *value = SysAllocString(result.c_str());
629 DCHECK(*value);
630 return S_OK;
540 } 631 }
541 632
542 STDMETHODIMP AXPlatformNodeWin::put_accValue(VARIANT var_id, 633 STDMETHODIMP AXPlatformNodeWin::put_accValue(VARIANT var_id,
543 BSTR new_value) { 634 BSTR new_value) {
544 AXPlatformNodeWin* target; 635 AXPlatformNodeWin* target;
545 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target); 636 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target);
546 637
547 AXActionData data; 638 AXActionData data;
548 data.action = ui::AX_ACTION_SET_VALUE; 639 data.action = ui::AX_ACTION_SET_VALUE;
549 data.value = new_value; 640 data.value = new_value;
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 1806
1716 AXPlatformNodeBase* base = 1807 AXPlatformNodeBase* base =
1717 FromNativeViewAccessible(node->GetNativeViewAccessible()); 1808 FromNativeViewAccessible(node->GetNativeViewAccessible());
1718 if (base && !IsDescendant(base)) 1809 if (base && !IsDescendant(base))
1719 base = nullptr; 1810 base = nullptr;
1720 1811
1721 return static_cast<AXPlatformNodeWin*>(base); 1812 return static_cast<AXPlatformNodeWin*>(base);
1722 } 1813 }
1723 1814
1724 } // namespace ui 1815 } // namespace ui
OLDNEW
« no previous file with comments | « ui/accessibility/platform/ax_platform_node_delegate.h ('k') | ui/accessibility/platform/test_ax_node_wrapper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698