Changeset 243970 in webkit
- Timestamp:
- Apr 8, 2019 1:11:19 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 18 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r243962 r243970 1 2019-04-08 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [ATK] Cleanup accessible wrapper base class 4 https://bugs.webkit.org/show_bug.cgi?id=196601 5 6 Reviewed by Mario Sanchez Prada. 7 8 Cleanups: 9 10 - Rename WebKitAccessibleWrapperAtk cpp and header as WebKitAccessible for consistency with the class name. 11 - Use WEBKIT_DEFINE_TYPE instead of custom type registration. This ensures that all CStrings used in private 12 struct are no longer leaked. 13 - Move core object pointer to the private struct. 14 - Remove confusing core() function and simply get the core object from the private struct. 15 - Use nullptr instead of 0 and other coding style issues. 16 - Rename cacheAndReturnAtkProperty as webkitAccessibleCacheAndReturnAtkProperty and use WebKitAccessible as 17 instance parameter. 18 - Make webkitAccessibleGetAccessibilityObject() return a reference, since we use a fallback object on detach it 19 never returns nullptr. 20 - Move objectFocusedAndCaretOffsetUnignored() to WebKitAccessibleUtil. 21 22 * SourcesGTK.txt: 23 * accessibility/atk/AXObjectCacheAtk.cpp: 24 * accessibility/atk/WebKitAccessible.cpp: Renamed from Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp. 25 (webkitAccessibleGetName): 26 (webkitAccessibleGetDescription): 27 (setAtkRelationSetFromCoreObject): 28 (isRootObject): 29 (webkitAccessibleGetParent): 30 (webkitAccessibleGetNChildren): 31 (webkitAccessibleRefChild): 32 (webkitAccessibleGetIndexInParent): 33 (webkitAccessibleGetAttributes): 34 (atkRole): 35 (webkitAccessibleGetRole): 36 (webkitAccessibleRefStateSet): 37 (webkitAccessibleRefRelationSet): 38 (webkitAccessibleInit): 39 (webkitAccessibleGetObjectLocale): 40 (webkit_accessible_class_init): 41 (interfaceMaskFromObject): 42 (uniqueAccessibilityTypeName): 43 (accessibilityTypeFromObject): 44 (webkitAccessibleNew): 45 (webkitAccessibleGetAccessibilityObject): 46 (webkitAccessibleDetach): 47 (webkitAccessibleIsDetached): 48 (webkitAccessibleCacheAndReturnAtkProperty): 49 * accessibility/atk/WebKitAccessible.h: Renamed from Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.h. 50 * accessibility/atk/WebKitAccessibleHyperlink.cpp: 51 (core): 52 * accessibility/atk/WebKitAccessibleInterfaceAction.cpp: 53 (core): 54 (webkitAccessibleActionGetKeybinding): 55 (webkitAccessibleActionGetName): 56 * accessibility/atk/WebKitAccessibleInterfaceComponent.cpp: 57 (core): 58 * accessibility/atk/WebKitAccessibleInterfaceDocument.cpp: 59 (core): 60 (documentAttributeValue): 61 * accessibility/atk/WebKitAccessibleInterfaceEditableText.cpp: 62 (core): 63 * accessibility/atk/WebKitAccessibleInterfaceHypertext.cpp: 64 (core): 65 * accessibility/atk/WebKitAccessibleInterfaceImage.cpp: 66 (core): 67 (webkitAccessibleImageGetImageDescription): 68 * accessibility/atk/WebKitAccessibleInterfaceSelection.cpp: 69 (core): 70 * accessibility/atk/WebKitAccessibleInterfaceTable.cpp: 71 (core): 72 * accessibility/atk/WebKitAccessibleInterfaceTableCell.cpp: 73 (core): 74 * accessibility/atk/WebKitAccessibleInterfaceText.cpp: 75 (core): 76 * accessibility/atk/WebKitAccessibleInterfaceValue.cpp: 77 (core): 78 * accessibility/atk/WebKitAccessibleUtil.cpp: 79 (objectFocusedAndCaretOffsetUnignored): 80 * accessibility/atk/WebKitAccessibleUtil.h: 81 * editing/atk/FrameSelectionAtk.cpp: 82 1 83 2019-04-06 Antti Koivisto <antti@apple.com> 2 84 -
trunk/Source/WebCore/SourcesGTK.txt
r243409 r243970 24 24 accessibility/atk/AXObjectCacheAtk.cpp 25 25 accessibility/atk/AccessibilityObjectAtk.cpp 26 accessibility/atk/WebKitAccessible.cpp 26 27 accessibility/atk/WebKitAccessibleHyperlink.cpp 27 28 accessibility/atk/WebKitAccessibleInterfaceAction.cpp @no-unify … … 38 39 accessibility/atk/WebKitAccessibleInterfaceValue.cpp 39 40 accessibility/atk/WebKitAccessibleUtil.cpp 40 accessibility/atk/WebKitAccessibleWrapperAtk.cpp41 41 42 42 editing/atk/FrameSelectionAtk.cpp -
trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp
r243928 r243970 30 30 #include "Range.h" 31 31 #include "TextIterator.h" 32 #include "WebKitAccessible WrapperAtk.h"32 #include "WebKitAccessible.h" 33 33 #include <wtf/NeverDestroyed.h> 34 34 #include <wtf/glib/GRefPtr.h> -
trunk/Source/WebCore/accessibility/atk/WebKitAccessible.cpp
r243969 r243970 2 2 * Copyright (C) 2008 Nuanti Ltd. 3 3 * Copyright (C) 2009 Jan Alonzo 4 * Copyright (C) 2009, 2010, 2011, 2012 Igalia S.L.4 * Copyright (C) 2009, 2010, 2011, 2012, 2019 Igalia S.L. 5 5 * Copyright (C) 2013 Samsung Electronics 6 6 * … … 31 31 32 32 #include "config.h" 33 #include "WebKitAccessible WrapperAtk.h"33 #include "WebKitAccessible.h" 34 34 35 35 #if HAVE(ACCESSIBILITY) … … 70 70 #include "WebKitAccessibleUtil.h" 71 71 #include <glib/gprintf.h> 72 #include <wtf/glib/WTFGType.h> 72 73 #include <wtf/text/CString.h> 73 74 … … 75 76 76 77 struct _WebKitAccessiblePrivate { 78 AccessibilityObject* object; 79 77 80 // Cached data for AtkObject. 78 81 CString accessibleName; … … 93 96 }; 94 97 95 #define WEBKIT_ACCESSIBLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessiblePrivate))98 WEBKIT_DEFINE_TYPE(WebKitAccessible, webkit_accessible, ATK_TYPE_OBJECT) 96 99 97 100 static AccessibilityObject* fallbackObject() … … 101 104 } 102 105 103 static AccessibilityObject* core(AtkObject* object)104 {105 if (!WEBKIT_IS_ACCESSIBLE(object))106 return 0;107 108 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(object));109 }110 111 106 static const gchar* webkitAccessibleGetName(AtkObject* object) 112 107 { 113 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);114 returnValIfWebKitAccessibleIsInvalid( WEBKIT_ACCESSIBLE(object), 0);108 auto* accessible = WEBKIT_ACCESSIBLE(object); 109 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 115 110 116 111 Vector<AccessibilityText> textOrder; 117 core(object)->accessibilityText(textOrder);112 accessible->priv->object->accessibilityText(textOrder); 118 113 119 114 for (const auto& text : textOrder) { … … 128 123 // does not expose via the AtkObject description. 129 124 if (text.textSource != AccessibilityTextSource::Help && text.textSource != AccessibilityTextSource::Summary) 130 return cacheAndReturnAtkProperty(object, AtkCachedAccessibleName, text.text);131 } 132 133 return cacheAndReturnAtkProperty(object, AtkCachedAccessibleName, "");125 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedAccessibleName, text.text.utf8()); 126 } 127 128 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedAccessibleName, ""); 134 129 } 135 130 136 131 static const gchar* webkitAccessibleGetDescription(AtkObject* object) 137 132 { 138 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);139 returnValIfWebKitAccessibleIsInvalid( WEBKIT_ACCESSIBLE(object), 0);133 auto* accessible = WEBKIT_ACCESSIBLE(object); 134 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 140 135 141 136 Vector<AccessibilityText> textOrder; 142 core(object)->accessibilityText(textOrder);137 accessible->priv->object->accessibilityText(textOrder); 143 138 144 139 bool nameTextAvailable = false; … … 148 143 // does not expose via the AtkObject name. 149 144 if (text.textSource == AccessibilityTextSource::Help || text.textSource == AccessibilityTextSource::Summary) 150 return cacheAndReturnAtkProperty(object, AtkCachedAccessibleDescription, text.text);145 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedAccessibleDescription, text.text.utf8()); 151 146 152 147 // If there is no other text alternative, the title tag contents will have been 153 148 // used for the AtkObject name. We don't want to duplicate it here. 154 149 if (text.textSource == AccessibilityTextSource::TitleTag && nameTextAvailable) 155 return cacheAndReturnAtkProperty(object, AtkCachedAccessibleDescription, text.text);150 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedAccessibleDescription, text.text.utf8()); 156 151 157 152 nameTextAvailable = true; 158 153 } 159 154 160 return cacheAndReturnAtkProperty(object, AtkCachedAccessibleDescription, "");155 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedAccessibleDescription, ""); 161 156 } 162 157 … … 193 188 } 194 189 } 195 } else if (AccessibilityObject* control = coreObject->correspondingControlForLabelElement()) {190 } else if (AccessibilityObject* control = coreObject->correspondingControlForLabelElement()) 196 191 atk_relation_set_add_relation_by_type(relationSet, ATK_RELATION_LABEL_FOR, ATK_OBJECT(control->wrapper())); 197 }else {192 else { 198 193 AccessibilityObject::AccessibilityChildrenVector ariaLabelledByElements; 199 194 coreObject->ariaLabelledByElements(ariaLabelledByElements); … … 295 290 } 296 291 297 static gpointer webkitAccessibleParentClass = nullptr;298 299 292 static bool isRootObject(AccessibilityObject* coreObject) 300 293 { … … 305 298 306 299 AccessibilityObject* firstChild = coreObject->firstChild(); 307 if (!firstChild || !firstChild->isWebArea()) 308 return false; 309 310 return true; 311 } 312 313 static AtkObject* atkParentOfRootObject(AtkObject* object) 314 { 315 AccessibilityObject* coreObject = core(object); 316 AccessibilityObject* coreParent = coreObject->parentObjectUnignored(); 317 318 // The top level object claims to not have a parent. This makes it 319 // impossible for assistive technologies to ascend the accessible 320 // hierarchy all the way to the application. (Bug 30489) 321 if (!coreParent && isRootObject(coreObject)) { 322 Document* document = coreObject->document(); 323 if (!document) 324 return 0; 325 } 326 327 return coreParent ? ATK_OBJECT(coreParent->wrapper()) : nullptr; 300 return firstChild && firstChild->isWebArea(); 328 301 } 329 302 330 303 static AtkObject* webkitAccessibleGetParent(AtkObject* object) 331 304 { 332 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);333 returnValIfWebKitAccessibleIsInvalid( WEBKIT_ACCESSIBLE(object), 0);305 auto* accessible = WEBKIT_ACCESSIBLE(object); 306 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 334 307 335 308 // Check first if the parent has been already set. 336 AtkObject* accessibleParent = ATK_OBJECT_CLASS(webkit AccessibleParentClass)->get_parent(object);309 AtkObject* accessibleParent = ATK_OBJECT_CLASS(webkit_accessible_parent_class)->get_parent(object); 337 310 if (accessibleParent) 338 311 return accessibleParent; 339 312 340 313 // Parent not set yet, so try to find it in the hierarchy. 341 AccessibilityObject* coreObject = core(object); 342 if (!coreObject) 343 return 0; 344 345 AccessibilityObject* coreParent = coreObject->parentObjectUnignored(); 346 347 if (!coreParent && isRootObject(coreObject)) 348 return atkParentOfRootObject(object); 314 auto* coreObject = accessible->priv->object; 315 auto* coreParent = coreObject->parentObjectUnignored(); 316 if (!coreParent && isRootObject(coreObject)) { 317 // The top level object claims to not have a parent. This makes it 318 // impossible for assistive technologies to ascend the accessible 319 // hierarchy all the way to the application. (Bug 30489) 320 if (!coreObject->document()) 321 return nullptr; 322 } 349 323 350 324 return coreParent ? ATK_OBJECT(coreParent->wrapper()) : nullptr; … … 353 327 static gint webkitAccessibleGetNChildren(AtkObject* object) 354 328 { 355 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0); 356 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0); 357 358 AccessibilityObject* coreObject = core(object); 359 360 return coreObject->children().size(); 329 auto* accessible = WEBKIT_ACCESSIBLE(object); 330 returnValIfWebKitAccessibleIsInvalid(accessible, 0); 331 332 return accessible->priv->object->children().size(); 361 333 } 362 334 363 335 static AtkObject* webkitAccessibleRefChild(AtkObject* object, gint index) 364 336 { 365 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);366 returnValIfWebKitAccessibleIsInvalid( WEBKIT_ACCESSIBLE(object), 0);337 auto* accessible = WEBKIT_ACCESSIBLE(object); 338 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 367 339 368 340 if (index < 0) 369 return 0; 370 371 AccessibilityObject* coreObject = core(object); 372 AccessibilityObject* coreChild = nullptr; 373 374 const AccessibilityObject::AccessibilityChildrenVector& children = coreObject->children(); 341 return nullptr; 342 343 const auto& children = accessible->priv->object->children(); 375 344 if (static_cast<size_t>(index) >= children.size()) 376 return 0;377 coreChild = children.at(index).get(); 378 345 return nullptr; 346 347 auto& coreChild = children[index]; 379 348 if (!coreChild) 380 return 0;349 return nullptr; 381 350 382 351 auto* child = ATK_OBJECT(coreChild->wrapper()); … … 389 358 static gint webkitAccessibleGetIndexInParent(AtkObject* object) 390 359 { 391 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), -1); 392 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), -1); 393 394 AccessibilityObject* coreObject = core(object); 395 AccessibilityObject* parent = coreObject->parentObjectUnignored(); 396 360 auto* accessible = WEBKIT_ACCESSIBLE(object); 361 returnValIfWebKitAccessibleIsInvalid(accessible, -1); 362 363 auto* coreObject = accessible->priv->object; 364 auto* parent = coreObject->parentObjectUnignored(); 397 365 if (!parent && isRootObject(coreObject)) { 398 AtkObject* atkParent = atkParentOfRootObject(object); 366 if (!coreObject->document()) 367 return -1; 368 369 auto* atkParent = parent ? ATK_OBJECT(parent->wrapper()) : nullptr; 399 370 if (!atkParent) 400 371 return -1; … … 402 373 unsigned count = atk_object_get_n_accessible_children(atkParent); 403 374 for (unsigned i = 0; i < count; ++i) { 404 AtkObject* child = atk_object_ref_accessible_child(atkParent, i); 405 bool childIsObject = child == object; 406 g_object_unref(child); 407 if (childIsObject) 375 GRefPtr<AtkObject> child = adoptGRef(atk_object_ref_accessible_child(atkParent, i)); 376 if (child.get() == object) 408 377 return i; 409 378 } … … 419 388 static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object) 420 389 { 421 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);422 returnValIfWebKitAccessibleIsInvalid( WEBKIT_ACCESSIBLE(object), 0);390 auto* accessible = WEBKIT_ACCESSIBLE(object); 391 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 423 392 424 393 AtkAttributeSet* attributeSet = nullptr; … … 427 396 #endif 428 397 429 AccessibilityObject* coreObject = core(object); 430 if (!coreObject) 431 return attributeSet; 398 auto* coreObject = accessible->priv->object; 432 399 433 400 // Hack needed for WebKit2 tests because obtaining an element by its ID … … 606 573 static AtkRole atkRole(AccessibilityObject* coreObject) 607 574 { 608 AccessibilityRole role = coreObject->roleValue(); 609 switch (role) { 575 switch (coreObject->roleValue()) { 610 576 case AccessibilityRole::ApplicationAlert: 611 577 return ATK_ROLE_ALERT; … … 877 843 // ATK_ROLE_UNKNOWN should only be applied in cases where there is a valid 878 844 // WebCore accessible object for which the platform role mapping is unknown. 879 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), ATK_ROLE_INVALID); 880 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), ATK_ROLE_INVALID); 881 882 AccessibilityObject* coreObject = core(object); 883 884 if (!coreObject) 885 return ATK_ROLE_INVALID; 845 auto* accessible = WEBKIT_ACCESSIBLE(object); 846 returnValIfWebKitAccessibleIsInvalid(accessible, ATK_ROLE_INVALID); 886 847 887 848 // Note: Why doesn't WebCore have a password field for this 888 if ( coreObject->isPasswordField())849 if (accessible->priv->object->isPasswordField()) 889 850 return ATK_ROLE_PASSWORD_TEXT; 890 851 891 return atkRole( coreObject);852 return atkRole(accessible->priv->object); 892 853 } 893 854 … … 1054 1015 static AtkStateSet* webkitAccessibleRefStateSet(AtkObject* object) 1055 1016 { 1056 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0); 1057 1058 AtkStateSet* stateSet = ATK_OBJECT_CLASS(webkitAccessibleParentClass)->ref_state_set(object); 1059 AccessibilityObject* coreObject = core(object); 1017 auto* accessible = WEBKIT_ACCESSIBLE(object); 1018 AtkStateSet* stateSet = ATK_OBJECT_CLASS(webkit_accessible_parent_class)->ref_state_set(object); 1060 1019 1061 1020 // Make sure the layout is updated to really know whether the object 1062 1021 // is defunct or not, so we can return the proper state. 1063 coreObject->updateBackingStore();1064 1065 if ( coreObject == fallbackObject()) {1022 accessible->priv->object->updateBackingStore(); 1023 1024 if (accessible->priv->object == fallbackObject()) { 1066 1025 atk_state_set_add_state(stateSet, ATK_STATE_DEFUNCT); 1067 1026 return stateSet; … … 1073 1032 atk_state_set_add_state(stateSet, ATK_STATE_FOCUSABLE); 1074 1033 1075 setAtkStateSetFromCoreObject( coreObject, stateSet);1034 setAtkStateSetFromCoreObject(accessible->priv->object, stateSet); 1076 1035 return stateSet; 1077 1036 } … … 1079 1038 static AtkRelationSet* webkitAccessibleRefRelationSet(AtkObject* object) 1080 1039 { 1081 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0); 1082 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0); 1083 1084 AtkRelationSet* relationSet = ATK_OBJECT_CLASS(webkitAccessibleParentClass)->ref_relation_set(object); 1085 AccessibilityObject* coreObject = core(object); 1086 1087 setAtkRelationSetFromCoreObject(coreObject, relationSet); 1088 1040 auto* accessible = WEBKIT_ACCESSIBLE(object); 1041 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 1042 1043 AtkRelationSet* relationSet = ATK_OBJECT_CLASS(webkit_accessible_parent_class)->ref_relation_set(object); 1044 setAtkRelationSetFromCoreObject(accessible->priv->object, relationSet); 1089 1045 return relationSet; 1090 1046 } … … 1092 1048 static void webkitAccessibleInit(AtkObject* object, gpointer data) 1093 1049 { 1094 if (ATK_OBJECT_CLASS(webkit AccessibleParentClass)->initialize)1095 ATK_OBJECT_CLASS(webkit AccessibleParentClass)->initialize(object, data);1050 if (ATK_OBJECT_CLASS(webkit_accessible_parent_class)->initialize) 1051 ATK_OBJECT_CLASS(webkit_accessible_parent_class)->initialize(object, data); 1096 1052 1097 1053 WebKitAccessible* accessible = WEBKIT_ACCESSIBLE(object); 1098 accessible->m_object = reinterpret_cast<AccessibilityObject*>(data); 1099 accessible->priv = WEBKIT_ACCESSIBLE_GET_PRIVATE(accessible); 1054 accessible->priv->object = reinterpret_cast<AccessibilityObject*>(data); 1100 1055 } 1101 1056 1102 1057 static const gchar* webkitAccessibleGetObjectLocale(AtkObject* object) 1103 1058 { 1104 g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0); 1105 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0); 1106 1107 AccessibilityObject* coreObject = core(object); 1108 if (!coreObject) 1109 return 0; 1059 auto* accessible = WEBKIT_ACCESSIBLE(object); 1060 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 1110 1061 1111 1062 if (ATK_IS_DOCUMENT(object)) { 1112 1063 // TODO: Should we fall back on lang xml:lang when the following comes up empty? 1113 String language = coreObject->language();1064 String language = accessible->priv->object->language(); 1114 1065 if (!language.isEmpty()) 1115 return cacheAndReturnAtkProperty(object, AtkCachedDocumentLocale, language);1066 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedDocumentLocale, language.utf8()); 1116 1067 1117 1068 } else if (ATK_IS_TEXT(object)) { … … 1119 1070 1120 1071 AtkAttributeSet* textAttributes = atk_text_get_default_attributes(ATK_TEXT(object)); 1121 for ( AtkAttributeSet* attributes = textAttributes; attributes; attributes = attributes->next) {1122 AtkAttribute* atkAttribute = static_cast<AtkAttribute*>(attributes->data);1072 for (auto* attributes = textAttributes; attributes; attributes = attributes->next) { 1073 auto* atkAttribute = static_cast<AtkAttribute*>(attributes->data); 1123 1074 if (!strcmp(atkAttribute->name, atk_text_attribute_get_name(ATK_TEXT_ATTR_LANGUAGE))) { 1124 locale = cacheAndReturnAtkProperty(object, AtkCachedDocumentLocale, String::fromUTF8(atkAttribute->value));1075 locale = webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedDocumentLocale, atkAttribute->value); 1125 1076 break; 1126 1077 } … … 1131 1082 } 1132 1083 1133 return 0; 1134 } 1135 1136 static void webkitAccessibleFinalize(GObject* object) 1137 { 1138 G_OBJECT_CLASS(webkitAccessibleParentClass)->finalize(object); 1139 } 1140 1141 static void webkitAccessibleClassInit(AtkObjectClass* klass) 1142 { 1143 GObjectClass* gobjectClass = G_OBJECT_CLASS(klass); 1144 1145 webkitAccessibleParentClass = g_type_class_peek_parent(klass); 1146 1147 gobjectClass->finalize = webkitAccessibleFinalize; 1148 1149 klass->initialize = webkitAccessibleInit; 1150 klass->get_name = webkitAccessibleGetName; 1151 klass->get_description = webkitAccessibleGetDescription; 1152 klass->get_parent = webkitAccessibleGetParent; 1153 klass->get_n_children = webkitAccessibleGetNChildren; 1154 klass->ref_child = webkitAccessibleRefChild; 1155 klass->get_role = webkitAccessibleGetRole; 1156 klass->ref_state_set = webkitAccessibleRefStateSet; 1157 klass->get_index_in_parent = webkitAccessibleGetIndexInParent; 1158 klass->get_attributes = webkitAccessibleGetAttributes; 1159 klass->ref_relation_set = webkitAccessibleRefRelationSet; 1160 klass->get_object_locale = webkitAccessibleGetObjectLocale; 1161 1162 g_type_class_add_private(klass, sizeof(WebKitAccessiblePrivate)); 1163 } 1164 1165 GType 1166 webkitAccessibleGetType(void) 1167 { 1168 static volatile gsize typeVolatile = 0; 1169 1170 if (g_once_init_enter(&typeVolatile)) { 1171 static const GTypeInfo tinfo = { 1172 sizeof(WebKitAccessibleClass), 1173 (GBaseInitFunc) 0, 1174 (GBaseFinalizeFunc) 0, 1175 (GClassInitFunc)(GCallback) webkitAccessibleClassInit, 1176 (GClassFinalizeFunc) 0, 1177 0, /* class data */ 1178 sizeof(WebKitAccessible), /* instance size */ 1179 0, /* nb preallocs */ 1180 (GInstanceInitFunc) 0, 1181 0 /* value table */ 1182 }; 1183 1184 GType type = g_type_register_static(ATK_TYPE_OBJECT, "WebKitAccessible", &tinfo, GTypeFlags(0)); 1185 g_once_init_leave(&typeVolatile, type); 1186 } 1187 1188 return typeVolatile; 1189 } 1190 1191 static const GInterfaceInfo AtkInterfacesInitFunctions[] = { 1192 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleActionInterfaceInit)), 0, 0}, 1193 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleSelectionInterfaceInit)), 0, 0}, 1194 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleEditableTextInterfaceInit)), 0, 0}, 1195 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleTextInterfaceInit)), 0, 0}, 1196 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleComponentInterfaceInit)), 0, 0}, 1197 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleImageInterfaceInit)), 0, 0}, 1198 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleTableInterfaceInit)), 0, 0}, 1084 return nullptr; 1085 } 1086 1087 static void webkit_accessible_class_init(WebKitAccessibleClass* klass) 1088 { 1089 auto* atkObjectClass = ATK_OBJECT_CLASS(klass); 1090 atkObjectClass->initialize = webkitAccessibleInit; 1091 atkObjectClass->get_name = webkitAccessibleGetName; 1092 atkObjectClass->get_description = webkitAccessibleGetDescription; 1093 atkObjectClass->get_parent = webkitAccessibleGetParent; 1094 atkObjectClass->get_n_children = webkitAccessibleGetNChildren; 1095 atkObjectClass->ref_child = webkitAccessibleRefChild; 1096 atkObjectClass->get_role = webkitAccessibleGetRole; 1097 atkObjectClass->ref_state_set = webkitAccessibleRefStateSet; 1098 atkObjectClass->get_index_in_parent = webkitAccessibleGetIndexInParent; 1099 atkObjectClass->get_attributes = webkitAccessibleGetAttributes; 1100 atkObjectClass->ref_relation_set = webkitAccessibleRefRelationSet; 1101 atkObjectClass->get_object_locale = webkitAccessibleGetObjectLocale; 1102 } 1103 1104 static const GInterfaceInfo atkInterfacesInitFunctions[] = { 1105 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleActionInterfaceInit)), nullptr, nullptr}, 1106 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleSelectionInterfaceInit)), nullptr, nullptr}, 1107 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleEditableTextInterfaceInit)), nullptr, nullptr}, 1108 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleTextInterfaceInit)), nullptr, nullptr}, 1109 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleComponentInterfaceInit)), nullptr, nullptr}, 1110 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleImageInterfaceInit)), nullptr, nullptr}, 1111 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleTableInterfaceInit)), nullptr, nullptr}, 1199 1112 #if ATK_CHECK_VERSION(2,11,90) 1200 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleTableCellInterfaceInit)), 0, 0},1201 #endif 1202 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleHypertextInterfaceInit)), 0, 0},1203 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleHyperlinkImplInterfaceInit)), 0, 0},1204 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleDocumentInterfaceInit)), 0, 0},1205 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleValueInterfaceInit)), 0, 0}1113 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleTableCellInterfaceInit)), nullptr, nullptr}, 1114 #endif 1115 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleHypertextInterfaceInit)), nullptr, nullptr}, 1116 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleHyperlinkImplInterfaceInit)), nullptr, nullptr}, 1117 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleDocumentInterfaceInit)), nullptr, nullptr}, 1118 {reinterpret_cast<GInterfaceInitFunc>(reinterpret_cast<GCallback>(webkitAccessibleValueInterfaceInit)), nullptr, nullptr} 1206 1119 }; 1207 1120 … … 1223 1136 }; 1224 1137 1225 static GType GetAtkInterfaceTypeFromWAIType(WAIType type)1138 static GType atkInterfaceTypeFromWAIType(WAIType type) 1226 1139 { 1227 1140 switch (type) { … … 1272 1185 } 1273 1186 1274 static guint16 getInterfaceMaskFromObject(AccessibilityObject* coreObject)1187 static guint16 interfaceMaskFromObject(AccessibilityObject* coreObject) 1275 1188 { 1276 1189 guint16 interfaceMask = 0; … … 1319 1232 // first accessible child has a text renderer 1320 1233 if (role == AccessibilityRole::ListItem) { 1321 const AccessibilityObject::AccessibilityChildrenVector& children = coreObject->children(); 1322 if (children.size()) { 1323 AccessibilityObject* axRenderChild = children.at(0).get(); 1324 interfaceMask |= getInterfaceMaskFromObject(axRenderChild); 1325 } 1234 const auto& children = coreObject->children(); 1235 if (!children.isEmpty()) 1236 interfaceMask |= interfaceMaskFromObject(children[0].get()); 1326 1237 } 1327 1238 } … … 1357 1268 } 1358 1269 1359 static const char* getUniqueAccessibilityTypeName(guint16 interfaceMask)1360 { 1361 #define WAI_TYPE_NAME_LEN (30) / * Enough for prefix + 5 hex characters (max) */1270 static const char* uniqueAccessibilityTypeName(guint16 interfaceMask) 1271 { 1272 #define WAI_TYPE_NAME_LEN (30) // Enough for prefix + 5 hex characters (max). 1362 1273 static char name[WAI_TYPE_NAME_LEN + 1]; 1363 1274 … … 1368 1279 } 1369 1280 1370 static GType getAccessibilityTypeFromObject(AccessibilityObject* coreObject)1281 static GType accessibilityTypeFromObject(AccessibilityObject* coreObject) 1371 1282 { 1372 1283 static const GTypeInfo typeInfo = { 1373 1284 sizeof(WebKitAccessibleClass), 1374 (GBaseInitFunc) 0,1375 (GBaseFinalizeFunc) 0,1376 (GClassInitFunc) 0,1377 (GClassFinalizeFunc) 0,1378 0, /* class data */1379 sizeof(WebKitAccessible), / * instance size */1380 0, / * nb preallocs */1381 (GInstanceInitFunc) 0,1382 0 /* value table */1285 nullptr, // GBaseInitFunc 1286 nullptr, // GBaseFinalizeFunc 1287 nullptr, // GClassInitFunc 1288 nullptr, // GClassFinalizeFunc 1289 nullptr, // class data 1290 sizeof(WebKitAccessible), // instance size 1291 0, // nb preallocs 1292 nullptr, // GInstanceInitFunc 1293 nullptr // value table 1383 1294 }; 1384 1295 1385 guint16 interfaceMask = getInterfaceMaskFromObject(coreObject); 1386 const char* atkTypeName = getUniqueAccessibilityTypeName(interfaceMask); 1387 GType type = g_type_from_name(atkTypeName); 1388 if (type) 1296 guint16 interfaceMask = interfaceMaskFromObject(coreObject); 1297 const char* atkTypeName = uniqueAccessibilityTypeName(interfaceMask); 1298 if (GType type = g_type_from_name(atkTypeName)) 1389 1299 return type; 1390 1300 1391 type = g_type_register_static(WEBKIT_TYPE_ACCESSIBLE, atkTypeName, &typeInfo, GTypeFlags(0));1392 for ( guint i = 0; i < G_N_ELEMENTS(AtkInterfacesInitFunctions); i++) {1393 if (interfaceMask & (1 << i)) 1301 GType type = g_type_register_static(WEBKIT_TYPE_ACCESSIBLE, atkTypeName, &typeInfo, static_cast<GTypeFlags>(0)); 1302 for (unsigned i = 0; i < G_N_ELEMENTS(atkInterfacesInitFunctions); ++i) { 1303 if (interfaceMask & (1 << i)) { 1394 1304 g_type_add_interface_static(type, 1395 GetAtkInterfaceTypeFromWAIType(static_cast<WAIType>(i)), 1396 &AtkInterfacesInitFunctions[i]); 1305 atkInterfaceTypeFromWAIType(static_cast<WAIType>(i)), 1306 &atkInterfacesInitFunctions[i]); 1307 } 1397 1308 } 1398 1309 … … 1402 1313 WebKitAccessible* webkitAccessibleNew(AccessibilityObject* coreObject) 1403 1314 { 1404 GType type = getAccessibilityTypeFromObject(coreObject); 1405 AtkObject* object = static_cast<AtkObject*>(g_object_new(type, 0)); 1406 1315 auto* object = ATK_OBJECT(g_object_new(accessibilityTypeFromObject(coreObject), nullptr)); 1407 1316 atk_object_initialize(object, coreObject); 1408 1409 1317 return WEBKIT_ACCESSIBLE(object); 1410 1318 } 1411 1319 1412 AccessibilityObject* webkitAccessibleGetAccessibilityObject(WebKitAccessible* accessible) 1413 { 1414 return accessible->m_object; 1320 AccessibilityObject& webkitAccessibleGetAccessibilityObject(WebKitAccessible* accessible) 1321 { 1322 ASSERT(WEBKIT_IS_ACCESSIBLE(accessible)); 1323 return *accessible->priv->object; 1415 1324 } 1416 1325 1417 1326 void webkitAccessibleDetach(WebKitAccessible* accessible) 1418 1327 { 1419 ASSERT(accessible->m_object); 1420 1421 if (accessible->m_object->roleValue() == AccessibilityRole::WebArea) 1422 atk_object_notify_state_change(ATK_OBJECT(accessible), ATK_STATE_DEFUNCT, true); 1328 ASSERT(WEBKIT_IS_ACCESSIBLE(accessible)); 1329 ASSERT(accessible->priv->object != fallbackObject()); 1330 1331 if (accessible->priv->object->roleValue() == AccessibilityRole::WebArea) 1332 atk_object_notify_state_change(ATK_OBJECT(accessible), ATK_STATE_DEFUNCT, TRUE); 1423 1333 1424 1334 // We replace the WebCore AccessibilityObject with a fallback object that 1425 1335 // provides default implementations to avoid repetitive null-checking after 1426 1336 // detachment. 1427 accessible-> m_object = fallbackObject();1337 accessible->priv->object = fallbackObject(); 1428 1338 } 1429 1339 1430 1340 bool webkitAccessibleIsDetached(WebKitAccessible* accessible) 1431 1341 { 1432 ASSERT(accessible->m_object); 1433 return accessible->m_object == fallbackObject(); 1434 } 1435 1436 AccessibilityObject* objectFocusedAndCaretOffsetUnignored(AccessibilityObject* referenceObject, int& offset) 1437 { 1438 // Indication that something bogus has transpired. 1439 offset = -1; 1440 1441 Document* document = referenceObject->document(); 1442 if (!document) 1443 return 0; 1444 1445 Node* focusedNode = referenceObject->selection().end().containerNode(); 1446 if (!focusedNode) 1447 return 0; 1448 1449 RenderObject* focusedRenderer = focusedNode->renderer(); 1450 if (!focusedRenderer) 1451 return 0; 1452 1453 AccessibilityObject* focusedObject = document->axObjectCache()->getOrCreate(focusedRenderer); 1454 if (!focusedObject) 1455 return 0; 1456 1457 // Look for the actual (not ignoring accessibility) selected object. 1458 AccessibilityObject* firstUnignoredParent = focusedObject; 1459 if (firstUnignoredParent->accessibilityIsIgnored()) 1460 firstUnignoredParent = firstUnignoredParent->parentObjectUnignored(); 1461 if (!firstUnignoredParent) 1462 return 0; 1463 1464 // Don't ignore links if the offset is being requested for a link 1465 // or if the link is a block. 1466 if (!referenceObject->isLink() && firstUnignoredParent->isLink() 1467 && !(firstUnignoredParent->renderer() && !firstUnignoredParent->renderer()->isInline())) 1468 firstUnignoredParent = firstUnignoredParent->parentObjectUnignored(); 1469 if (!firstUnignoredParent) 1470 return 0; 1471 1472 // The reference object must either coincide with the focused 1473 // object being considered, or be a descendant of it. 1474 if (referenceObject->isDescendantOfObject(firstUnignoredParent)) 1475 referenceObject = firstUnignoredParent; 1476 1477 Node* startNode = nullptr; 1478 if (firstUnignoredParent != referenceObject || firstUnignoredParent->isTextControl()) { 1479 // We need to use the first child's node of the reference 1480 // object as the start point to calculate the caret offset 1481 // because we want it to be relative to the object of 1482 // reference, not just to the focused object (which could have 1483 // previous siblings which should be taken into account too). 1484 AccessibilityObject* axFirstChild = referenceObject->firstChild(); 1485 if (axFirstChild) 1486 startNode = axFirstChild->node(); 1487 } 1488 // Getting the Position of a PseudoElement now triggers an assertion. 1489 // This can occur when clicking on empty space in a render block. 1490 if (!startNode || startNode->isPseudoElement()) 1491 startNode = firstUnignoredParent->node(); 1492 1493 // Check if the node for the first parent object not ignoring 1494 // accessibility is null again before using it. This might happen 1495 // with certain kind of accessibility objects, such as the root 1496 // one (the scroller containing the webArea object). 1497 if (!startNode) 1498 return 0; 1499 1500 VisiblePosition startPosition = VisiblePosition(positionBeforeNode(startNode), DOWNSTREAM); 1501 VisiblePosition endPosition = firstUnignoredParent->selection().visibleEnd(); 1502 1503 if (startPosition == endPosition) 1504 offset = 0; 1505 else if (!isStartOfLine(endPosition)) { 1506 RefPtr<Range> range = makeRange(startPosition, endPosition.previous()); 1507 offset = TextIterator::rangeLength(range.get(), true) + 1; 1508 } else { 1509 RefPtr<Range> range = makeRange(startPosition, endPosition); 1510 offset = TextIterator::rangeLength(range.get(), true); 1511 } 1512 1513 return firstUnignoredParent; 1514 } 1515 1516 const char* cacheAndReturnAtkProperty(AtkObject* object, AtkCachedProperty property, String value) 1517 { 1518 WebKitAccessiblePrivate* priv = WEBKIT_ACCESSIBLE(object)->priv; 1342 ASSERT(WEBKIT_IS_ACCESSIBLE(accessible)); 1343 return accessible->priv->object == fallbackObject(); 1344 } 1345 1346 const char* webkitAccessibleCacheAndReturnAtkProperty(WebKitAccessible* accessible, AtkCachedProperty property, CString&& value) 1347 { 1348 ASSERT(WEBKIT_IS_ACCESSIBLE(accessible)); 1349 1350 WebKitAccessiblePrivate* priv = accessible->priv; 1519 1351 CString* propertyPtr = nullptr; 1520 1352 … … 1523 1355 propertyPtr = &priv->accessibleName; 1524 1356 break; 1525 1526 1357 case AtkCachedAccessibleDescription: 1527 1358 propertyPtr = &priv->accessibleDescription; 1528 1359 break; 1529 1530 1360 case AtkCachedActionName: 1531 1361 propertyPtr = &priv->actionName; 1532 1362 break; 1533 1534 1363 case AtkCachedActionKeyBinding: 1535 1364 propertyPtr = &priv->actionKeyBinding; 1536 1365 break; 1537 1538 1366 case AtkCachedDocumentLocale: 1539 1367 propertyPtr = &priv->documentLocale; 1540 1368 break; 1541 1542 1369 case AtkCachedDocumentType: 1543 1370 propertyPtr = &priv->documentType; 1544 1371 break; 1545 1546 1372 case AtkCachedDocumentEncoding: 1547 1373 propertyPtr = &priv->documentEncoding; 1548 1374 break; 1549 1550 1375 case AtkCachedDocumentURI: 1551 1376 propertyPtr = &priv->documentURI; 1552 1377 break; 1553 1554 1378 case AtkCachedImageDescription: 1555 1379 propertyPtr = &priv->imageDescription; 1556 1380 break; 1557 1558 1381 default: 1559 1382 ASSERT_NOT_REACHED(); … … 1562 1385 // Don't invalidate old memory if not stricly needed, since other 1563 1386 // callers might be still holding on to it. 1564 if (*propertyPtr != value .utf8())1565 *propertyPtr = value.utf8();1387 if (*propertyPtr != value) 1388 *propertyPtr = WTFMove(value); 1566 1389 1567 1390 return (*propertyPtr).data(); -
trunk/Source/WebCore/accessibility/atk/WebKitAccessible.h
r243969 r243970 2 2 * Copyright (C) 2008 Nuanti Ltd. 3 3 * Copyright (C) 2009 Jan Alonzo 4 * Copyright (C) 2009, 2010, 2011, 2012 Igalia S.L.4 * Copyright (C) 2009, 2010, 2011, 2012, 2019 Igalia S.L. 5 5 * Copyright (C) 2013 Samsung Electronics 6 6 * … … 34 34 G_BEGIN_DECLS 35 35 36 #define WEBKIT_TYPE_ACCESSIBLE (webkitAccessibleGetType())37 #define WEBKIT_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessible))38 #define WEBKIT_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessibleClass))39 #define WEBKIT_IS_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_ACCESSIBLE))40 #define WEBKIT_IS_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_ACCESSIBLE))41 #define WEBKIT_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessibleClass))36 #define WEBKIT_TYPE_ACCESSIBLE (webkit_accessible_get_type()) 37 #define WEBKIT_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessible)) 38 #define WEBKIT_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessibleClass)) 39 #define WEBKIT_IS_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_ACCESSIBLE)) 40 #define WEBKIT_IS_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_ACCESSIBLE)) 41 #define WEBKIT_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_ACCESSIBLE, WebKitAccessibleClass)) 42 42 43 typedef struct _WebKitAccessible 44 typedef struct _WebKitAccessibleClass 45 typedef struct _WebKitAccessiblePrivate 43 typedef struct _WebKitAccessible WebKitAccessible; 44 typedef struct _WebKitAccessibleClass WebKitAccessibleClass; 45 typedef struct _WebKitAccessiblePrivate WebKitAccessiblePrivate; 46 46 47 47 48 48 struct _WebKitAccessible { 49 49 AtkObject parent; 50 WebCore::AccessibilityObject* m_object;51 50 52 51 WebKitAccessiblePrivate *priv; … … 69 68 }; 70 69 71 GType webkit AccessibleGetType(void) G_GNUC_CONST;70 GType webkit_accessible_get_type(void); 72 71 73 72 WebKitAccessible* webkitAccessibleNew(WebCore::AccessibilityObject*); 74 73 75 WebCore::AccessibilityObject *webkitAccessibleGetAccessibilityObject(WebKitAccessible*);74 WebCore::AccessibilityObject& webkitAccessibleGetAccessibilityObject(WebKitAccessible*); 76 75 77 76 void webkitAccessibleDetach(WebKitAccessible*); … … 79 78 bool webkitAccessibleIsDetached(WebKitAccessible*); 80 79 81 WebCore::AccessibilityObject* objectFocusedAndCaretOffsetUnignored(WebCore::AccessibilityObject*, int& offset); 82 83 const char* cacheAndReturnAtkProperty(AtkObject*, AtkCachedProperty, String value); 80 const char* webkitAccessibleCacheAndReturnAtkProperty(WebKitAccessible*, AtkCachedProperty, CString&&); 84 81 85 82 G_END_DECLS -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleHyperlink.cpp
r239535 r243970 33 33 #include "RenderObject.h" 34 34 #include "TextIterator.h" 35 #include "WebKitAccessible.h" 35 36 #include "WebKitAccessibleUtil.h" 36 #include "WebKitAccessibleWrapperAtk.h"37 37 #include <wtf/text/CString.h> 38 38 … … 65 65 return 0; 66 66 67 return webkitAccessibleGetAccessibilityObject(accessible);67 return &webkitAccessibleGetAccessibilityObject(accessible); 68 68 } 69 69 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceAction.cpp
r156532 r243970 37 37 #include "AccessibilityObject.h" 38 38 #include "NotImplemented.h" 39 #include "WebKitAccessible.h" 39 40 #include "WebKitAccessibleUtil.h" 40 #include "WebKitAccessibleWrapperAtk.h"41 41 42 42 using namespace WebCore; … … 47 47 return 0; 48 48 49 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(action));49 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(action)); 50 50 } 51 51 … … 78 78 } 79 79 80 static const gchar* webkitAccessibleActionGetKeybinding(AtkAction* action, gint index)80 static const gchar* webkitAccessibleActionGetKeybinding(AtkAction* action, gint) 81 81 { 82 g_return_val_if_fail(ATK_IS_ACTION(action), 0); 83 g_return_val_if_fail(!index, 0); 84 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), 0); 82 auto* accessible = WEBKIT_ACCESSIBLE(action); 83 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 85 84 86 85 // FIXME: Construct a proper keybinding string. 87 return cacheAndReturnAtkProperty(ATK_OBJECT(action), AtkCachedActionKeyBinding, core(action)->accessKey().string());86 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedActionKeyBinding, core(action)->accessKey().string().utf8()); 88 87 } 89 88 90 static const gchar* webkitAccessibleActionGetName(AtkAction* action, gint index)89 static const gchar* webkitAccessibleActionGetName(AtkAction* action, gint) 91 90 { 92 g_return_val_if_fail(ATK_IS_ACTION(action), 0); 93 g_return_val_if_fail(!index, 0); 94 returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), 0); 91 auto* accessible = WEBKIT_ACCESSIBLE(action); 92 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 95 93 96 return cacheAndReturnAtkProperty(ATK_OBJECT(action), AtkCachedActionName, core(action)->actionVerb());94 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedActionName, core(action)->actionVerb().utf8()); 97 95 } 98 96 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceComponent.cpp
r243928 r243970 37 37 #include "FrameView.h" 38 38 #include "IntRect.h" 39 #include "WebKitAccessible.h" 39 40 #include "WebKitAccessibleUtil.h" 40 #include "WebKitAccessibleWrapperAtk.h"41 41 42 42 using namespace WebCore; … … 47 47 return 0; 48 48 49 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(component));49 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(component)); 50 50 } 51 51 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceDocument.cpp
r184979 r243970 38 38 #include "Document.h" 39 39 #include "DocumentType.h" 40 #include "WebKitAccessible.h" 40 41 #include "WebKitAccessibleUtil.h" 41 #include "WebKitAccessibleWrapperAtk.h"42 42 43 43 using namespace WebCore; … … 48 48 return 0; 49 49 50 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(document));50 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(document)); 51 51 } 52 52 … … 57 57 return 0; 58 58 59 String value = String();59 String value; 60 60 AtkCachedProperty atkCachedProperty; 61 61 … … 72 72 73 73 if (!value.isEmpty()) 74 return cacheAndReturnAtkProperty(ATK_OBJECT(document), atkCachedProperty, value);74 return webkitAccessibleCacheAndReturnAtkProperty(WEBKIT_ACCESSIBLE(document), atkCachedProperty, value.utf8()); 75 75 76 76 return 0; -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceEditableText.cpp
r156532 r243970 39 39 #include "Frame.h" 40 40 #include "NotImplemented.h" 41 #include "WebKitAccessible.h" 41 42 #include "WebKitAccessibleUtil.h" 42 #include "WebKitAccessibleWrapperAtk.h"43 43 44 44 using namespace WebCore; … … 49 49 return 0; 50 50 51 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(text));51 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(text)); 52 52 } 53 53 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceHypertext.cpp
r243928 r243970 24 24 25 25 #include "AccessibilityObject.h" 26 #include "WebKitAccessible.h" 26 27 #include "WebKitAccessibleUtil.h" 27 #include "WebKitAccessibleWrapperAtk.h"28 28 29 29 using namespace WebCore; … … 34 34 return 0; 35 35 36 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(hypertext));36 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(hypertext)); 37 37 } 38 38 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceImage.cpp
r188433 r243970 37 37 #include "AccessibilityObject.h" 38 38 #include "IntRect.h" 39 #include "WebKitAccessible.h" 39 40 #include "WebKitAccessibleUtil.h" 40 #include "WebKitAccessibleWrapperAtk.h"41 41 42 42 using namespace WebCore; … … 47 47 return 0; 48 48 49 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(image));49 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(image)); 50 50 } 51 51 … … 61 61 static const gchar* webkitAccessibleImageGetImageDescription(AtkImage* image) 62 62 { 63 g_return_val_if_fail(ATK_IMAGE(image), 0);64 returnValIfWebKitAccessibleIsInvalid( WEBKIT_ACCESSIBLE(image), 0);63 auto* accessible = WEBKIT_ACCESSIBLE(image); 64 returnValIfWebKitAccessibleIsInvalid(accessible, nullptr); 65 65 66 return cacheAndReturnAtkProperty(ATK_OBJECT(image), AtkCachedImageDescription, accessibilityDescription(core(image)));66 return webkitAccessibleCacheAndReturnAtkProperty(accessible, AtkCachedImageDescription, accessibilityDescription(core(image)).utf8()); 67 67 } 68 68 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceSelection.cpp
r243928 r243970 38 38 #include "HTMLSelectElement.h" 39 39 #include "RenderObject.h" 40 #include "WebKitAccessible.h" 40 41 #include "WebKitAccessibleUtil.h" 41 #include "WebKitAccessibleWrapperAtk.h"42 42 43 43 using namespace WebCore; … … 48 48 return nullptr; 49 49 50 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(selection));50 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(selection)); 51 51 } 52 52 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceTable.cpp
r243928 r243970 41 41 #include "HTMLTableElement.h" 42 42 #include "RenderElement.h" 43 #include "WebKitAccessible.h" 43 44 #include "WebKitAccessibleInterfaceText.h" 44 45 #include "WebKitAccessibleUtil.h" 45 #include "WebKitAccessibleWrapperAtk.h"46 46 47 47 using namespace WebCore; … … 52 52 return nullptr; 53 53 54 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(table));54 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(table)); 55 55 } 56 56 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceTableCell.cpp
r243928 r243970 26 26 #include "AccessibilityTable.h" 27 27 #include "AccessibilityTableCell.h" 28 #include "WebKitAccessible.h" 28 29 #include "WebKitAccessibleUtil.h" 29 #include "WebKitAccessibleWrapperAtk.h"30 30 31 31 using namespace WebCore; … … 46 46 return nullptr; 47 47 48 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(cell));48 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(cell)); 49 49 } 50 50 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceText.cpp
r243928 r243970 50 50 #include "TextIterator.h" 51 51 #include "VisibleUnits.h" 52 #include "WebKitAccessible.h" 52 53 #include "WebKitAccessibleUtil.h" 53 #include "WebKitAccessibleWrapperAtk.h"54 54 #include <wtf/glib/GUniquePtr.h> 55 55 #include <wtf/text/CString.h> … … 67 67 return 0; 68 68 69 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(text));69 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(text)); 70 70 } 71 71 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp
r176163 r243970 25 25 #include "AccessibilityObject.h" 26 26 #include "HTMLNames.h" 27 #include "WebKitAccessible.h" 27 28 #include "WebKitAccessibleUtil.h" 28 #include "WebKitAccessibleWrapperAtk.h"29 29 #include <wtf/text/CString.h> 30 30 … … 36 36 return 0; 37 37 38 return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(value));38 return &webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(value)); 39 39 } 40 40 -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp
r238082 r243970 34 34 #if HAVE(ACCESSIBILITY) 35 35 36 #include "AXObjectCache.h" 36 37 #include "AccessibilityObject.h" 37 38 #include "FrameView.h" … … 39 40 #include "Node.h" 40 41 #include "Range.h" 42 #include "RenderObject.h" 43 #include "TextIterator.h" 41 44 #include "VisibleSelection.h" 42 45 … … 174 177 } 175 178 179 AccessibilityObject* objectFocusedAndCaretOffsetUnignored(AccessibilityObject* referenceObject, int& offset) 180 { 181 // Indication that something bogus has transpired. 182 offset = -1; 183 184 Document* document = referenceObject->document(); 185 if (!document) 186 return nullptr; 187 188 Node* focusedNode = referenceObject->selection().end().containerNode(); 189 if (!focusedNode) 190 return nullptr; 191 192 RenderObject* focusedRenderer = focusedNode->renderer(); 193 if (!focusedRenderer) 194 return nullptr; 195 196 AccessibilityObject* focusedObject = document->axObjectCache()->getOrCreate(focusedRenderer); 197 if (!focusedObject) 198 return nullptr; 199 200 // Look for the actual (not ignoring accessibility) selected object. 201 AccessibilityObject* firstUnignoredParent = focusedObject; 202 if (firstUnignoredParent->accessibilityIsIgnored()) 203 firstUnignoredParent = firstUnignoredParent->parentObjectUnignored(); 204 if (!firstUnignoredParent) 205 return nullptr; 206 207 // Don't ignore links if the offset is being requested for a link 208 // or if the link is a block. 209 if (!referenceObject->isLink() && firstUnignoredParent->isLink() 210 && !(firstUnignoredParent->renderer() && !firstUnignoredParent->renderer()->isInline())) 211 firstUnignoredParent = firstUnignoredParent->parentObjectUnignored(); 212 if (!firstUnignoredParent) 213 return nullptr; 214 215 // The reference object must either coincide with the focused 216 // object being considered, or be a descendant of it. 217 if (referenceObject->isDescendantOfObject(firstUnignoredParent)) 218 referenceObject = firstUnignoredParent; 219 220 Node* startNode = nullptr; 221 if (firstUnignoredParent != referenceObject || firstUnignoredParent->isTextControl()) { 222 // We need to use the first child's node of the reference 223 // object as the start point to calculate the caret offset 224 // because we want it to be relative to the object of 225 // reference, not just to the focused object (which could have 226 // previous siblings which should be taken into account too). 227 AccessibilityObject* axFirstChild = referenceObject->firstChild(); 228 if (axFirstChild) 229 startNode = axFirstChild->node(); 230 } 231 // Getting the Position of a PseudoElement now triggers an assertion. 232 // This can occur when clicking on empty space in a render block. 233 if (!startNode || startNode->isPseudoElement()) 234 startNode = firstUnignoredParent->node(); 235 236 // Check if the node for the first parent object not ignoring 237 // accessibility is null again before using it. This might happen 238 // with certain kind of accessibility objects, such as the root 239 // one (the scroller containing the webArea object). 240 if (!startNode) 241 return nullptr; 242 243 VisiblePosition startPosition = VisiblePosition(positionBeforeNode(startNode), DOWNSTREAM); 244 VisiblePosition endPosition = firstUnignoredParent->selection().visibleEnd(); 245 246 if (startPosition == endPosition) 247 offset = 0; 248 else if (!isStartOfLine(endPosition)) { 249 RefPtr<Range> range = makeRange(startPosition, endPosition.previous()); 250 offset = TextIterator::rangeLength(range.get(), true) + 1; 251 } else { 252 RefPtr<Range> range = makeRange(startPosition, endPosition); 253 offset = TextIterator::rangeLength(range.get(), true); 254 } 255 256 return firstUnignoredParent; 257 } 258 176 259 #endif -
trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.h
r208179 r243970 36 36 // detached or if it's not but just updating the layout will detach it anyway. 37 37 #define returnIfWebKitAccessibleIsInvalid(webkitAccessible) G_STMT_START { \ 38 if (!webkitAccessible || webkitAccessibleIsDetached(webkitAccessible)) {\38 if (!webkitAccessible || webkitAccessibleIsDetached(webkitAccessible)) \ 39 39 return; \ 40 } else { \ 41 AccessibilityObject* coreObject = webkitAccessibleGetAccessibilityObject(webkitAccessible); \ 42 if (!coreObject || !coreObject->document()) \ 43 return; \ 44 coreObject->updateBackingStore(); \ 45 if (webkitAccessibleIsDetached(webkitAccessible)) \ 46 return; \ 47 }; } G_STMT_END 40 auto& coreObject = webkitAccessibleGetAccessibilityObject(webkitAccessible); \ 41 if (!coreObject.document()) \ 42 return; \ 43 coreObject.updateBackingStore(); \ 44 if (webkitAccessibleIsDetached(webkitAccessible)) \ 45 return; \ 46 ; } G_STMT_END 48 47 49 48 #define returnValIfWebKitAccessibleIsInvalid(webkitAccessible, val) G_STMT_START { \ 50 if (!webkitAccessible || webkitAccessibleIsDetached(webkitAccessible)) { \ 51 return (val); \ 52 } else { \ 53 AccessibilityObject* coreObject = webkitAccessibleGetAccessibilityObject(webkitAccessible); \ 54 if (!coreObject || !coreObject->document()) \ 55 return (val); \ 56 coreObject->updateBackingStore(); \ 57 if (webkitAccessibleIsDetached(webkitAccessible)) \ 58 return (val); \ 59 }; } G_STMT_END 49 if (!webkitAccessible || webkitAccessibleIsDetached(webkitAccessible)) \ 50 return (val); \ 51 auto& coreObject = webkitAccessibleGetAccessibilityObject(webkitAccessible); \ 52 if (!coreObject.document()) \ 53 return (val); \ 54 coreObject.updateBackingStore(); \ 55 if (webkitAccessibleIsDetached(webkitAccessible)) \ 56 return (val); \ 57 ; } G_STMT_END 60 58 61 59 AtkAttributeSet* addToAtkAttributeSet(AtkAttributeSet*, const char* name, const char* value); … … 69 67 bool selectionBelongsToObject(WebCore::AccessibilityObject*, WebCore::VisibleSelection&); 70 68 69 WebCore::AccessibilityObject* objectFocusedAndCaretOffsetUnignored(WebCore::AccessibilityObject*, int& offset); 70 71 71 #endif // HAVE(ACCESSIBILITY) -
trunk/Source/WebCore/editing/atk/FrameSelectionAtk.cpp
r243928 r243970 27 27 #include "Frame.h" 28 28 #include "RenderListItem.h" 29 #include "WebKitAccessibleWrapperAtk.h" 29 #include "WebKitAccessible.h" 30 #include "WebKitAccessibleUtil.h" 30 31 #include <glib.h> 31 32 #include <wtf/NeverDestroyed.h>
Note: See TracChangeset
for help on using the changeset viewer.