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

Unified Diff: ui/accessibility/platform/ax_platform_node_win.cc

Issue 2933353002: Forward four more BrowserAccessibility APIs to AXPlatformNode. (Closed)
Patch Set: Use SkColor.h instead 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 side-by-side diff with in-line comments
Download patch
Index: ui/accessibility/platform/ax_platform_node_win.cc
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 7fd3d70e4156564d6adfb513bd3f718ddc6c0fcd..5cb972b0b43322fdd3638b7c531f0cee1e105880 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -10,13 +10,17 @@
#include "base/containers/hash_tables.h"
#include "base/lazy_instance.h"
+#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/win/scoped_comptr.h"
#include "base/win/scoped_variant.h"
#include "third_party/iaccessible2/ia2_api_all.h"
+#include "third_party/skia/include/core/SkColor.h"
#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_text_utils.h"
+#include "ui/accessibility/ax_tree_data.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
#include "ui/accessibility/platform/ax_platform_node_win.h"
#include "ui/base/win/atl_module.h"
@@ -536,7 +540,86 @@ STDMETHODIMP AXPlatformNodeWin::get_accHelp(
STDMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) {
AXPlatformNodeWin* target;
COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, value, target);
- return target->GetStringAttributeAsBstr(ui::AX_ATTR_VALUE, value);
+
+ // get_accValue() has two sets of special cases depending on the node's role.
+ // The first set apply without regard for the nodes |value| attribute. That is
+ // the nodes value attribute isn't consider for the first set of special
+ // cases. For example, if the node role is AX_ROLE_COLOR_WELL, we do not care
+ // at all about the node's AX_ATTR_VALUE attribute. The second set of special
+ // cases only apply if the value attribute for the node is empty. That is, if
+ // AX_ATTR_VALUE is empty, we do something special.
+
+ base::string16 result;
+
+ //
+ // Color Well special case (Use AX_ATTR_COLOR_VALUE)
+ //
+ if (target->GetData().role == ui::AX_ROLE_COLOR_WELL) {
+ unsigned int color = static_cast<unsigned int>(target->GetIntAttribute(
+ ui::AX_ATTR_COLOR_VALUE)); // todo, why the static cast?
+
+ unsigned int red = SkColorGetR(color);
+ unsigned int green = SkColorGetG(color);
+ unsigned int blue = SkColorGetB(color);
+ base::string16 value_text;
+ value_text = base::UintToString16(red * 100 / 255) + L"% red " +
+ base::UintToString16(green * 100 / 255) + L"% green " +
+ base::UintToString16(blue * 100 / 255) + L"% blue";
+ *value = SysAllocString(value_text.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+
+ //
+ // Document special case (Use the document's url)
+ //
+ if (target->GetData().role == ui::AX_ROLE_ROOT_WEB_AREA ||
+ target->GetData().role == ui::AX_ROLE_WEB_AREA) {
+ result = base::UTF8ToUTF16(target->delegate_->GetTreeData().url);
+ *value = SysAllocString(result.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+
+ //
+ // Links (Use AX_ATTR_URL)
+ //
+ if (target->GetData().role == ui::AX_ROLE_LINK ||
+ target->GetData().role == ui::AX_ROLE_IMAGE_MAP_LINK) {
+ result = target->GetString16Attribute(ui::AX_ATTR_URL);
+ *value = SysAllocString(result.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+
+ // After this point, the role based special cases should test for an empty
+ // result.
+
+ result = target->GetString16Attribute(ui::AX_ATTR_VALUE);
+
+ //
+ // RangeValue (Use AX_ATTR_VALUE_FOR_RANGE)
+ //
+ if (result.empty() && target->IsRangeValueSupported()) {
+ float fval;
+ if (target->GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) {
+ result = base::UTF8ToUTF16(base::DoubleToString(fval));
+ *value = SysAllocString(result.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+ }
+
+ // Last resort (Use innerText)
+ if (result.empty() &&
+ (target->IsSimpleTextControl() || target->IsRichTextControl()) &&
+ !target->IsNativeTextControl()) {
+ result = target->GetInnerText();
+ }
+
+ *value = SysAllocString(result.c_str());
+ DCHECK(*value);
+ return S_OK;
}
STDMETHODIMP AXPlatformNodeWin::put_accValue(VARIANT var_id,
« 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