1 // Copyright (c) 2012 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/accessibility/accessibility_events.h" 6 7 #include "base/values.h" 8 #include "chrome/browser/accessibility/accessibility_extension_api.h" 9 #include "chrome/browser/accessibility/accessibility_extension_api_constants.h" 10 #include "chrome/browser/chrome_notification_types.h" 11 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile_manager.h" 13 #include "content/public/browser/notification_service.h" 14 #include "content/public/browser/notification_types.h" 15 16 namespace keys = extension_accessibility_api_constants; 17 18 void SendControlAccessibilityNotification( 19 ui::AXEvent event, 20 AccessibilityControlInfo* info) { 21 Profile* profile = info->profile(); 22 if (profile->ShouldSendAccessibilityEvents()) { 23 ExtensionAccessibilityEventRouter::GetInstance()->HandleControlEvent( 24 event, 25 info); 26 } 27 } 28 29 void SendMenuAccessibilityNotification( 30 ui::AXEvent event, 31 AccessibilityMenuInfo* info) { 32 Profile* profile = info->profile(); 33 if (profile->ShouldSendAccessibilityEvents()) { 34 ExtensionAccessibilityEventRouter::GetInstance()->HandleMenuEvent( 35 event, 36 info); 37 } 38 } 39 40 void SendWindowAccessibilityNotification( 41 ui::AXEvent event, 42 AccessibilityWindowInfo* info) { 43 Profile* profile = info->profile(); 44 if (profile->ShouldSendAccessibilityEvents()) { 45 ExtensionAccessibilityEventRouter::GetInstance()->HandleWindowEvent( 46 event, 47 info); 48 } 49 } 50 51 AccessibilityControlInfo::AccessibilityControlInfo( 52 Profile* profile, const std::string& name) 53 : AccessibilityEventInfo(profile), 54 name_(name) { 55 } 56 57 AccessibilityControlInfo::~AccessibilityControlInfo() { 58 } 59 60 void AccessibilityControlInfo::SerializeToDict( 61 base::DictionaryValue *dict) const { 62 dict->SetString(keys::kNameKey, name_); 63 dict->SetString(keys::kTypeKey, type()); 64 if (!context_.empty()) 65 dict->SetString(keys::kContextKey, context_); 66 if (!bounds_.IsEmpty()) { 67 base::DictionaryValue* bounds_value = new base::DictionaryValue(); 68 bounds_value->SetInteger(keys::kLeft, bounds_.x()); 69 bounds_value->SetInteger(keys::kTop, bounds_.y()); 70 bounds_value->SetInteger(keys::kWidth, bounds_.width()); 71 bounds_value->SetInteger(keys::kHeight, bounds_.height()); 72 dict->Set(keys::kBoundsKey, bounds_value); 73 } 74 } 75 76 AccessibilityWindowInfo::AccessibilityWindowInfo(Profile* profile, 77 const std::string& window_name) 78 : AccessibilityControlInfo(profile, window_name) { 79 } 80 81 const char* AccessibilityWindowInfo::type() const { 82 return keys::kTypeWindow; 83 } 84 85 AccessibilityButtonInfo::AccessibilityButtonInfo(Profile* profile, 86 const std::string& button_name, 87 const std::string& context) 88 : AccessibilityControlInfo(profile, button_name) { 89 set_context(context); 90 } 91 92 const char* AccessibilityButtonInfo::type() const { 93 return keys::kTypeButton; 94 } 95 96 AccessibilityStaticTextInfo::AccessibilityStaticTextInfo(Profile* profile, 97 const std::string& text, 98 const std::string& context) 99 : AccessibilityControlInfo(profile, text) { 100 set_context(context); 101 } 102 103 const char* AccessibilityStaticTextInfo::type() const { 104 return keys::kTypeStaticText; 105 } 106 107 AccessibilityLinkInfo::AccessibilityLinkInfo(Profile* profile, 108 const std::string& link_name, 109 const std::string& context) 110 : AccessibilityControlInfo(profile, link_name) { 111 set_context(context); 112 } 113 114 const char* AccessibilityLinkInfo::type() const { 115 return keys::kTypeLink; 116 } 117 118 AccessibilityRadioButtonInfo::AccessibilityRadioButtonInfo( 119 Profile* profile, 120 const std::string& name, 121 const std::string& context, 122 bool checked, 123 int item_index, 124 int item_count) 125 : AccessibilityControlInfo(profile, name), 126 checked_(checked), 127 item_index_(item_index), 128 item_count_(item_count) { 129 set_context(context); 130 } 131 132 const char* AccessibilityRadioButtonInfo::type() const { 133 return keys::kTypeRadioButton; 134 } 135 136 void AccessibilityRadioButtonInfo::SerializeToDict( 137 base::DictionaryValue *dict) const { 138 AccessibilityControlInfo::SerializeToDict(dict); 139 dict->SetBoolean(keys::kCheckedKey, checked_); 140 dict->SetInteger(keys::kItemIndexKey, item_index_); 141 dict->SetInteger(keys::kItemCountKey, item_count_); 142 } 143 144 AccessibilityCheckboxInfo::AccessibilityCheckboxInfo(Profile* profile, 145 const std::string& name, 146 const std::string& context, 147 bool checked) 148 : AccessibilityControlInfo(profile, name), 149 checked_(checked) { 150 set_context(context); 151 } 152 153 const char* AccessibilityCheckboxInfo::type() const { 154 return keys::kTypeCheckbox; 155 } 156 157 void AccessibilityCheckboxInfo::SerializeToDict( 158 base::DictionaryValue *dict) const { 159 AccessibilityControlInfo::SerializeToDict(dict); 160 dict->SetBoolean(keys::kCheckedKey, checked_); 161 } 162 163 AccessibilityTabInfo::AccessibilityTabInfo(Profile* profile, 164 const std::string& tab_name, 165 const std::string& context, 166 int tab_index, 167 int tab_count) 168 : AccessibilityControlInfo(profile, tab_name), 169 tab_index_(tab_index), 170 tab_count_(tab_count) { 171 set_context(context); 172 } 173 174 const char* AccessibilityTabInfo::type() const { 175 return keys::kTypeTab; 176 } 177 178 void AccessibilityTabInfo::SerializeToDict(base::DictionaryValue *dict) const { 179 AccessibilityControlInfo::SerializeToDict(dict); 180 dict->SetInteger(keys::kItemIndexKey, tab_index_); 181 dict->SetInteger(keys::kItemCountKey, tab_count_); 182 } 183 184 AccessibilityComboBoxInfo::AccessibilityComboBoxInfo(Profile* profile, 185 const std::string& name, 186 const std::string& context, 187 const std::string& value, 188 int item_index, 189 int item_count) 190 : AccessibilityControlInfo(profile, name), 191 value_(value), 192 item_index_(item_index), 193 item_count_(item_count) { 194 set_context(context); 195 } 196 197 const char* AccessibilityComboBoxInfo::type() const { 198 return keys::kTypeComboBox; 199 } 200 201 void AccessibilityComboBoxInfo::SerializeToDict( 202 base::DictionaryValue *dict) const { 203 AccessibilityControlInfo::SerializeToDict(dict); 204 dict->SetString(keys::kValueKey, value_); 205 dict->SetInteger(keys::kItemIndexKey, item_index_); 206 dict->SetInteger(keys::kItemCountKey, item_count_); 207 } 208 209 AccessibilityTextBoxInfo::AccessibilityTextBoxInfo(Profile* profile, 210 const std::string& name, 211 const std::string& context, 212 bool password) 213 : AccessibilityControlInfo(profile, name), 214 password_(password), 215 selection_start_(0), 216 selection_end_(0) { 217 set_context(context); 218 } 219 220 const char* AccessibilityTextBoxInfo::type() const { 221 return keys::kTypeTextBox; 222 } 223 224 void AccessibilityTextBoxInfo::SerializeToDict( 225 base::DictionaryValue *dict) const { 226 AccessibilityControlInfo::SerializeToDict(dict); 227 dict->SetString(keys::kValueKey, value_); 228 dict->SetBoolean(keys::kPasswordKey, password_); 229 dict->SetInteger(keys::kSelectionStartKey, selection_start_); 230 dict->SetInteger(keys::kSelectionEndKey, selection_end_); 231 } 232 233 AccessibilityListBoxInfo::AccessibilityListBoxInfo(Profile* profile, 234 const std::string& name, 235 const std::string& context, 236 const std::string& value, 237 int item_index, 238 int item_count) 239 : AccessibilityControlInfo(profile, name), 240 value_(value), 241 item_index_(item_index), 242 item_count_(item_count) { 243 set_context(context); 244 } 245 246 const char* AccessibilityListBoxInfo::type() const { 247 return keys::kTypeListBox; 248 } 249 250 void AccessibilityListBoxInfo::SerializeToDict( 251 base::DictionaryValue *dict) const { 252 AccessibilityControlInfo::SerializeToDict(dict); 253 dict->SetString(keys::kValueKey, value_); 254 dict->SetInteger(keys::kItemIndexKey, item_index_); 255 dict->SetInteger(keys::kItemCountKey, item_count_); 256 } 257 258 AccessibilityMenuInfo::AccessibilityMenuInfo(Profile* profile, 259 const std::string& menu_name) 260 : AccessibilityControlInfo(profile, menu_name) { 261 } 262 263 const char* AccessibilityMenuInfo::type() const { 264 return keys::kTypeMenu; 265 } 266 267 AccessibilityMenuItemInfo::AccessibilityMenuItemInfo(Profile* profile, 268 const std::string& name, 269 const std::string& context, 270 bool has_submenu, 271 int item_index, 272 int item_count) 273 : AccessibilityControlInfo(profile, name), 274 has_submenu_(has_submenu), 275 item_index_(item_index), 276 item_count_(item_count) { 277 set_context(context); 278 } 279 280 const char* AccessibilityMenuItemInfo::type() const { 281 return keys::kTypeMenuItem; 282 } 283 284 void AccessibilityMenuItemInfo::SerializeToDict( 285 base::DictionaryValue *dict) const { 286 AccessibilityControlInfo::SerializeToDict(dict); 287 dict->SetBoolean(keys::kHasSubmenuKey, has_submenu_); 288 dict->SetInteger(keys::kItemIndexKey, item_index_); 289 dict->SetInteger(keys::kItemCountKey, item_count_); 290 } 291 292 AccessibilityTreeInfo::AccessibilityTreeInfo(Profile* profile, 293 const std::string& menu_name) 294 : AccessibilityControlInfo(profile, menu_name) { 295 } 296 297 const char* AccessibilityTreeInfo::type() const { 298 return keys::kTypeTree; 299 } 300 301 AccessibilityTreeItemInfo::AccessibilityTreeItemInfo(Profile* profile, 302 const std::string& name, 303 const std::string& context, 304 int item_depth, 305 int item_index, 306 int item_count, 307 int children_count, 308 bool is_expanded) 309 : AccessibilityControlInfo(profile, name), 310 item_depth_(item_depth), 311 item_index_(item_index), 312 item_count_(item_count), 313 children_count_(children_count), 314 is_expanded_(is_expanded) { 315 set_context(context); 316 } 317 318 const char* AccessibilityTreeItemInfo::type() const { 319 return keys::kTypeTreeItem; 320 } 321 322 void AccessibilityTreeItemInfo::SerializeToDict( 323 base::DictionaryValue *dict) const { 324 AccessibilityControlInfo::SerializeToDict(dict); 325 dict->SetInteger(keys::kItemDepthKey, item_depth_); 326 dict->SetInteger(keys::kItemIndexKey, item_index_); 327 dict->SetInteger(keys::kItemCountKey, item_count_); 328 dict->SetInteger(keys::kChildrenCountKey, children_count_); 329 dict->SetBoolean(keys::kItemExpandedKey, is_expanded_); 330 } 331 332 AccessibilitySliderInfo::AccessibilitySliderInfo(Profile* profile, 333 const std::string& name, 334 const std::string& context, 335 const std::string& value) 336 : AccessibilityControlInfo(profile, name), 337 value_(value) { 338 set_context(context); 339 } 340 341 const char* AccessibilitySliderInfo::type() const { 342 return keys::kTypeSlider; 343 } 344 345 void AccessibilitySliderInfo::SerializeToDict( 346 base::DictionaryValue *dict) const { 347 AccessibilityControlInfo::SerializeToDict(dict); 348 dict->SetString(keys::kStringValueKey, value_); 349 } 350 351 AccessibilityAlertInfo::AccessibilityAlertInfo(Profile* profile, 352 const std::string& name) 353 : AccessibilityControlInfo(profile, name) { 354 } 355 356 const char* AccessibilityAlertInfo::type() const { 357 return keys::kTypeAlert; 358 } 359