1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/autocomplete/autocomplete_accessibility.h" 6 7 #include "chrome/browser/autocomplete/autocomplete_edit.h" 8 #include "chrome/browser/autocomplete/autocomplete_edit_view_win.h" 9 #include "grit/generated_resources.h" 10 #include "ui/base/l10n/l10n_util.h" 11 #include "views/accessibility/native_view_accessibility_win.h" 12 #include "views/view.h" 13 14 HRESULT AutocompleteAccessibility::Initialize( 15 const AutocompleteEditViewWin* edit_box) { 16 if (edit_box == NULL) { 17 return E_INVALIDARG; 18 } 19 20 edit_box_ = edit_box; 21 22 // Create a default accessible object for this instance. 23 return CreateStdAccessibleObject(edit_box_->m_hWnd, OBJID_CLIENT, 24 IID_IAccessible, 25 reinterpret_cast<void **>(default_accessibility_server_.Receive())); 26 } 27 28 STDMETHODIMP AutocompleteAccessibility::get_accChildCount(LONG* child_count) { 29 if (!child_count) { 30 return E_INVALIDARG; 31 } 32 33 DCHECK(default_accessibility_server_); 34 return default_accessibility_server_->get_accChildCount(child_count); 35 } 36 37 STDMETHODIMP AutocompleteAccessibility::get_accChild(VARIANT var_child, 38 IDispatch** disp_child) { 39 if (var_child.vt != VT_I4 || !disp_child) { 40 return E_INVALIDARG; 41 } 42 43 // If var_child is the parent, remain with the same IDispatch 44 if (var_child.lVal == CHILDID_SELF) 45 return S_OK; 46 47 *disp_child = NULL; 48 return S_FALSE; 49 } 50 51 STDMETHODIMP AutocompleteAccessibility::get_accParent(IDispatch** disp_parent) { 52 if (!disp_parent) { 53 return E_INVALIDARG; 54 } 55 56 if (edit_box_->parent_view() == NULL) { 57 *disp_parent = NULL; 58 return S_FALSE; 59 } 60 61 // Retrieve the IDispatch interface for the parent view. 62 *disp_parent = NativeViewAccessibilityWin::GetAccessibleForView( 63 edit_box_->parent_view()); 64 // Increment the reference count for the retrieved interface. 65 (*disp_parent)->AddRef(); 66 return S_OK; 67 } 68 69 STDMETHODIMP AutocompleteAccessibility::accNavigate(LONG nav_dir, VARIANT start, 70 VARIANT* end) { 71 if (start.vt != VT_I4 || !end) { 72 return E_INVALIDARG; 73 } 74 75 DCHECK(default_accessibility_server_); 76 return default_accessibility_server_->accNavigate(nav_dir, start, end); 77 } 78 79 STDMETHODIMP AutocompleteAccessibility::get_accFocus(VARIANT* focus_child) { 80 if (!focus_child) { 81 return E_INVALIDARG; 82 } 83 84 DCHECK(default_accessibility_server_); 85 return default_accessibility_server_->get_accFocus(focus_child); 86 } 87 88 STDMETHODIMP AutocompleteAccessibility::get_accName(VARIANT var_id, 89 BSTR* name) { 90 if (var_id.vt != VT_I4 || !name) { 91 return E_INVALIDARG; 92 } 93 94 string16 temp_name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION); 95 96 if (!temp_name.empty()) { 97 // Return name retrieved. 98 *name = SysAllocString(temp_name.c_str()); 99 } else { 100 // If no name is found, return S_FALSE. 101 return S_FALSE; 102 } 103 DCHECK(*name); 104 105 return S_OK; 106 } 107 108 STDMETHODIMP AutocompleteAccessibility::get_accDescription(VARIANT var_id, 109 BSTR* desc) { 110 if (var_id.vt != VT_I4 || !desc) { 111 return E_INVALIDARG; 112 } 113 114 return S_FALSE; 115 } 116 117 STDMETHODIMP AutocompleteAccessibility::get_accValue(VARIANT var_id, 118 BSTR* value) { 119 if (var_id.vt != VT_I4 || !value) { 120 return E_INVALIDARG; 121 } 122 123 string16 temp_value; 124 125 if (var_id.lVal != CHILDID_SELF) 126 return E_INVALIDARG; 127 128 // Edit box has no children, only handle self. 129 temp_value = edit_box_->GetText(); 130 if (temp_value.empty()) 131 return S_FALSE; 132 133 // Return value retrieved. 134 *value = SysAllocString(temp_value.c_str()); 135 136 DCHECK(*value); 137 138 return S_OK; 139 } 140 141 STDMETHODIMP AutocompleteAccessibility::get_accState(VARIANT var_id, 142 VARIANT* state) { 143 if (var_id.vt != VT_I4 || !state) { 144 return E_INVALIDARG; 145 } 146 147 DCHECK(default_accessibility_server_); 148 HRESULT hr = default_accessibility_server_->get_accState(var_id, state); 149 150 if (hr != S_OK) 151 return hr; 152 153 // Adding on state to convey the fact that there is a dropdown. 154 state->lVal |= STATE_SYSTEM_HASPOPUP; 155 return S_OK; 156 } 157 158 STDMETHODIMP AutocompleteAccessibility::get_accRole(VARIANT var_id, 159 VARIANT* role) { 160 if (var_id.vt != VT_I4 || !role) { 161 return E_INVALIDARG; 162 } 163 164 role->vt = VT_I4; 165 166 // Need to override the default role, which is ROLE_SYSTEM_CLIENT. 167 if (var_id.lVal == CHILDID_SELF) { 168 role->lVal = ROLE_SYSTEM_TEXT; 169 } else { 170 return S_FALSE; 171 } 172 173 return S_OK; 174 } 175 176 STDMETHODIMP AutocompleteAccessibility::get_accDefaultAction(VARIANT var_id, 177 BSTR* def_action) { 178 if (var_id.vt != VT_I4 || !def_action) { 179 return E_INVALIDARG; 180 } 181 182 return S_FALSE; 183 } 184 185 STDMETHODIMP AutocompleteAccessibility::accLocation(LONG* x_left, LONG* y_top, 186 LONG* width, LONG* height, 187 VARIANT var_id) { 188 if (var_id.vt != VT_I4 || !x_left || !y_top || !width || !height) { 189 return E_INVALIDARG; 190 } 191 192 DCHECK(default_accessibility_server_); 193 return default_accessibility_server_->accLocation(x_left, y_top, width, 194 height, var_id); 195 } 196 197 STDMETHODIMP AutocompleteAccessibility::accHitTest(LONG x_left, LONG y_top, 198 VARIANT* child) { 199 if (!child) { 200 return E_INVALIDARG; 201 } 202 203 DCHECK(default_accessibility_server_); 204 return default_accessibility_server_->accHitTest(x_left, y_top, child); 205 } 206 207 STDMETHODIMP AutocompleteAccessibility::get_accKeyboardShortcut(VARIANT var_id, 208 BSTR* acc_key) { 209 if (var_id.vt != VT_I4 || !acc_key) { 210 return E_INVALIDARG; 211 } 212 213 return S_FALSE; 214 } 215 216 // IAccessible functions not supported. 217 218 HRESULT AutocompleteAccessibility::accDoDefaultAction(VARIANT var_id) { 219 return DISP_E_MEMBERNOTFOUND; 220 } 221 222 STDMETHODIMP AutocompleteAccessibility::get_accSelection(VARIANT* selected) { 223 if (selected) 224 selected->vt = VT_EMPTY; 225 return DISP_E_MEMBERNOTFOUND; 226 } 227 228 STDMETHODIMP AutocompleteAccessibility::accSelect(LONG flagsSelect, 229 VARIANT var_id) { 230 return DISP_E_MEMBERNOTFOUND; 231 } 232 233 STDMETHODIMP AutocompleteAccessibility::get_accHelp(VARIANT var_id, 234 BSTR* help) { 235 if (help) 236 *help = NULL; 237 return DISP_E_MEMBERNOTFOUND; 238 } 239 240 STDMETHODIMP AutocompleteAccessibility::get_accHelpTopic(BSTR* help_file, 241 VARIANT var_id, 242 LONG* topic_id) { 243 if (help_file) { 244 *help_file = NULL; 245 } 246 if (topic_id) { 247 *topic_id = static_cast<LONG>(-1); 248 } 249 return DISP_E_MEMBERNOTFOUND; 250 } 251 252 STDMETHODIMP AutocompleteAccessibility::put_accName(VARIANT var_id, 253 BSTR put_name) { 254 // Deprecated. 255 return DISP_E_MEMBERNOTFOUND; 256 } 257 258 STDMETHODIMP AutocompleteAccessibility::put_accValue(VARIANT var_id, 259 BSTR put_val) { 260 // Deprecated. 261 return DISP_E_MEMBERNOTFOUND; 262 } 263