Changeset 285996 in webkit
- Timestamp:
- Nov 18, 2021, 3:46:10 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 14 edited
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityAtspi.h (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h (modified) (4 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp (modified) (2 diffs)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h (modified) (4 diffs)
-
Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp (modified) (5 diffs)
-
Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp (modified) (5 diffs)
-
Tools/WebKitTestRunner/gtk/main.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r285994 r285996 1 2021-10-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Add initial WTR accessibility support when building with ATSPI 4 https://bugs.webkit.org/show_bug.cgi?id=230259 5 6 Reviewed by Adrian Perez de Castro. 7 8 Export symbols required by WTR. 9 10 * accessibility/atspi/AccessibilityAtspi.cpp: 11 (WebCore::AccessibilityAtspi::runLoop const): 12 * accessibility/atspi/AccessibilityAtspi.h: 13 * accessibility/atspi/AccessibilityObjectAtspi.h: 14 * accessibility/atspi/AccessibilityRootAtspi.cpp: 15 (WebCore::AccessibilityRootAtspi::focusedObject const): 16 * accessibility/atspi/AccessibilityRootAtspi.h: 17 1 18 2021-11-18 Carlos Garcia Campos <cgarcia@igalia.com> 2 19 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp
r284676 r285996 47 47 g_warning("Can't connect to a11y bus: %s", error->message); 48 48 }); 49 } 50 51 RunLoop& AccessibilityAtspi::runLoop() const 52 { 53 return m_queue->runLoop(); 49 54 } 50 55 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h
r284675 r285996 44 44 ~AccessibilityAtspi() = default; 45 45 46 WEBCORE_EXPORT RunLoop& runLoop() const; 47 46 48 const char* uniqueName() const; 47 49 GVariant* nullReference() const; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h
r284675 r285996 51 51 52 52 void setRoot(AccessibilityRootAtspi*); 53 AccessibilityRootAtspi* root() const;53 WEBCORE_EXPORT AccessibilityRootAtspi* root() const; 54 54 void setParent(std::optional<AccessibilityObjectAtspi*>); 55 std::optional<AccessibilityObjectAtspi*> parent() const;56 void updateBackingStore();55 WEBCORE_EXPORT std::optional<AccessibilityObjectAtspi*> parent() const; 56 WEBCORE_EXPORT void updateBackingStore(); 57 57 58 58 void attach(AXCoreObject*); … … 67 67 void serialize(GVariantBuilder*) const; 68 68 69 String id() const;70 CString name() const;71 CString description() const;72 unsigned role() const;73 unsigned childCount() const;74 Vector<RefPtr<AccessibilityObjectAtspi>> children() const;75 AccessibilityObjectAtspi* childAt(unsigned) const;76 uint64_t state() const;69 WEBCORE_EXPORT String id() const; 70 WEBCORE_EXPORT CString name() const; 71 WEBCORE_EXPORT CString description() const; 72 WEBCORE_EXPORT unsigned role() const; 73 WEBCORE_EXPORT unsigned childCount() const; 74 WEBCORE_EXPORT Vector<RefPtr<AccessibilityObjectAtspi>> children() const; 75 WEBCORE_EXPORT AccessibilityObjectAtspi* childAt(unsigned) const; 76 WEBCORE_EXPORT uint64_t state() const; 77 77 void stateChanged(const char*, bool); 78 HashMap<String, String> attributes() const;79 HashMap<uint32_t, Vector<RefPtr<AccessibilityObjectAtspi>>> relationMap() const;78 WEBCORE_EXPORT HashMap<String, String> attributes() const; 79 WEBCORE_EXPORT HashMap<uint32_t, Vector<RefPtr<AccessibilityObjectAtspi>>> relationMap() const; 80 80 81 AccessibilityObjectAtspi* hitTest(const IntPoint&, uint32_t) const;82 IntRect elementRect(uint32_t) const;83 void scrollToMakeVisible(uint32_t) const;84 void scrollToPoint(const IntPoint&, uint32_t) const;81 WEBCORE_EXPORT AccessibilityObjectAtspi* hitTest(const IntPoint&, uint32_t) const; 82 WEBCORE_EXPORT IntRect elementRect(uint32_t) const; 83 WEBCORE_EXPORT void scrollToMakeVisible(uint32_t) const; 84 WEBCORE_EXPORT void scrollToPoint(const IntPoint&, uint32_t) const; 85 85 86 String text() const;86 WEBCORE_EXPORT String text() const; 87 87 enum class TextGranularity { 88 88 Character, … … 95 95 Paragraph 96 96 }; 97 IntPoint boundaryOffset(unsigned, TextGranularity) const;98 IntRect boundsForRange(unsigned, unsigned, uint32_t) const;97 WEBCORE_EXPORT IntPoint boundaryOffset(unsigned, TextGranularity) const; 98 WEBCORE_EXPORT IntRect boundsForRange(unsigned, unsigned, uint32_t) const; 99 99 struct TextAttributes { 100 100 HashMap<String, String> attributes; … … 102 102 int endOffset; 103 103 }; 104 TextAttributes textAttributes(std::optional<unsigned> = std::nullopt, bool = false) const;105 IntPoint selectedRange() const;106 void setSelectedRange(unsigned, unsigned);104 WEBCORE_EXPORT TextAttributes textAttributes(std::optional<unsigned> = std::nullopt, bool = false) const; 105 WEBCORE_EXPORT IntPoint selectedRange() const; 106 WEBCORE_EXPORT void setSelectedRange(unsigned, unsigned); 107 107 void textInserted(const String&, const VisiblePosition&); 108 108 void textDeleted(const String&, const VisiblePosition&); -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp
r284367 r285996 26 26 #include "AccessibilityAtspiInterfaces.h" 27 27 #include "Document.h" 28 #include "FocusController.h" 28 29 #include "Frame.h" 29 30 #include "Page.h" … … 221 222 wrapper->setRoot(const_cast<AccessibilityRootAtspi*>(this)); 222 223 wrapper->setParent(nullptr); // nullptr parent means root. 224 225 return wrapper; 226 } 227 228 AccessibilityObjectAtspi* AccessibilityRootAtspi::focusedObject() const 229 { 230 RELEASE_ASSERT(isMainThread()); 231 if (!AXObjectCache::accessibilityEnabled()) 232 AXObjectCache::enableAccessibility(); 233 234 if (!m_page) 235 return nullptr; 236 237 auto* focusedDocument = m_page->focusController().focusedOrMainFrame().document(); 238 if (!focusedDocument) 239 return nullptr; 240 241 auto* cache = focusedDocument->axObjectCache(); 242 if (!cache) 243 return nullptr; 244 245 auto* focusedObject = cache->focusedObjectForPage(m_page.get()); 246 if (!focusedObject) 247 return nullptr; 248 249 auto* wrapper = focusedObject->wrapper(); 250 if (!wrapper) 251 return nullptr; 252 253 wrapper->setRoot(const_cast<AccessibilityRootAtspi*>(this)); 223 254 224 255 return wrapper; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h
r284367 r285996 50 50 AccessibilityAtspi& atspi() const { return m_atspi; } 51 51 AccessibilityObjectAtspi* child() const; 52 AccessibilityObjectAtspi* focusedObject() const; 52 53 53 54 void serialize(GVariantBuilder*) const; -
trunk/Source/WebKit/ChangeLog
r285993 r285996 1 2021-10-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Add initial WTR accessibility support when building with ATSPI 4 https://bugs.webkit.org/show_bug.cgi?id=230259 5 6 Reviewed by Adrian Perez de Castro. 7 8 In case of ATSPI we need the web page accessibility object to get the root and focused object wrappers. 9 10 * WebProcess/InjectedBundle/API/c/WKBundlePage.cpp: 11 (WKAccessibilityRootObject): 12 (WKAccessibilityFocusedObject): 13 1 14 2021-11-18 Youenn Fablet <youenn@apple.com> 2 15 -
trunk/Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp
r285399 r285996 247 247 if (!pageRef) 248 248 return 0; 249 249 250 #if USE(ATSPI) 251 return WebKit::toImpl(pageRef)->accessibilityRootObject().child(); 252 #endif 253 250 254 WebCore::Page* page = WebKit::toImpl(pageRef)->corePage(); 251 255 if (!page) … … 274 278 if (!pageRef) 275 279 return 0; 280 281 #if USE(ATSPI) 282 return WebKit::toImpl(pageRef)->accessibilityRootObject().focusedObject(); 283 #endif 276 284 277 285 WebCore::Page* page = WebKit::toImpl(pageRef)->corePage(); -
trunk/Tools/ChangeLog
r285993 r285996 1 2021-10-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Add initial WTR accessibility support when building with ATSPI 4 https://bugs.webkit.org/show_bug.cgi?id=230259 5 6 Reviewed by Adrian Perez de Castro. 7 8 * WebKitTestRunner/InjectedBundle/AccessibilityController.h: 9 * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h: 10 * WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp: 11 (WTR::findAccessibleObjectById): 12 (WTR::AccessibilityController::accessibleElementById): 13 (WTR::AccessibilityController::platformName): 14 (WTR::AccessibilityController::axRunLoop): 15 (WTR::AccessibilityController::executeOnAXThreadAndWait): 16 (WTR::AccessibilityController::executeOnAXThread): 17 (WTR::AccessibilityController::executeOnMainThread): 18 * WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp: 19 (WTR::AccessibilityUIElement::AccessibilityUIElement): 20 (WTR::AccessibilityUIElement::isEqual): 21 (WTR::AccessibilityUIElement::childrenCount): 22 (WTR::AccessibilityUIElement::elementAtPoint): 23 (WTR::AccessibilityUIElement::childAtIndex): 24 (WTR::elementForRelationAtIndex): 25 (WTR::AccessibilityUIElement::ariaOwnsElementAtIndex): 26 (WTR::AccessibilityUIElement::ariaFlowToElementAtIndex): 27 (WTR::AccessibilityUIElement::ariaControlsElementAtIndex): 28 (WTR::AccessibilityUIElement::titleUIElement): 29 (WTR::AccessibilityUIElement::parentElement): 30 (WTR::attributesOfElement): 31 (WTR::attributesOfElements): 32 (WTR::AccessibilityUIElement::attributesOfChildren): 33 (WTR::AccessibilityUIElement::allAttributes): 34 (WTR::AccessibilityUIElement::stringAttributeValue): 35 (WTR::AccessibilityUIElement::numberAttributeValue): 36 (WTR::checkElementState): 37 (WTR::AccessibilityUIElement::boolAttributeValue): 38 (WTR::AccessibilityUIElement::isAttributeSupported): 39 (WTR::roleValueToString): 40 (WTR::AccessibilityUIElement::role): 41 (WTR::AccessibilityUIElement::roleDescription): 42 (WTR::AccessibilityUIElement::computedRoleString): 43 (WTR::AccessibilityUIElement::title): 44 (WTR::AccessibilityUIElement::description): 45 (WTR::AccessibilityUIElement::orientation const): 46 (WTR::AccessibilityUIElement::stringValue): 47 (WTR::AccessibilityUIElement::helpText const): 48 (WTR::AccessibilityUIElement::x): 49 (WTR::AccessibilityUIElement::y): 50 (WTR::AccessibilityUIElement::width): 51 (WTR::AccessibilityUIElement::height): 52 (WTR::AccessibilityUIElement::clickPointX): 53 (WTR::AccessibilityUIElement::clickPointY): 54 (WTR::AccessibilityUIElement::isEnabled): 55 (WTR::AccessibilityUIElement::isRequired const): 56 (WTR::AccessibilityUIElement::isFocused const): 57 (WTR::AccessibilityUIElement::isSelected const): 58 (WTR::AccessibilityUIElement::isSelectedOptionActive const): 59 (WTR::AccessibilityUIElement::isExpanded const): 60 (WTR::AccessibilityUIElement::isChecked const): 61 (WTR::AccessibilityUIElement::isIndeterminate const): 62 (WTR::AccessibilityUIElement::hierarchicalLevel const): 63 (WTR::AccessibilityUIElement::ariaIsGrabbed const): 64 (WTR::AccessibilityUIElement::ariaDropEffects const): 65 (WTR::AccessibilityUIElement::lineForIndex): 66 (WTR::AccessibilityUIElement::rangeForLine): 67 (WTR::AccessibilityUIElement::boundsForRange): 68 (WTR::AccessibilityUIElement::stringForRange): 69 (WTR::AccessibilityUIElement::attributedStringForRange): 70 (WTR::AccessibilityUIElement::selectedTextRange): 71 (WTR::AccessibilityUIElement::setSelectedTextRange): 72 (WTR::AccessibilityUIElement::isFocusable const): 73 (WTR::AccessibilityUIElement::isSelectable const): 74 (WTR::AccessibilityUIElement::isMultiSelectable const): 75 (WTR::AccessibilityUIElement::isVisible const): 76 (WTR::AccessibilityUIElement::isOffScreen const): 77 (WTR::AccessibilityUIElement::isCollapsed const): 78 (WTR::AccessibilityUIElement::isSingleLine const): 79 (WTR::AccessibilityUIElement::isMultiLine const): 80 (WTR::AccessibilityUIElement::hasPopup const): 81 (WTR::AccessibilityUIElement::scrollToMakeVisible): 82 (WTR::AccessibilityUIElement::scrollToGlobalPoint): 83 (WTR::stringAtOffset): 84 (WTR::AccessibilityUIElement::characterAtOffset): 85 (WTR::AccessibilityUIElement::wordAtOffset): 86 (WTR::AccessibilityUIElement::lineAtOffset): 87 (WTR::AccessibilityUIElement::sentenceAtOffset): 88 * WebKitTestRunner/gtk/main.cpp: 89 (main): 90 1 91 2021-11-18 Youenn Fablet <youenn@apple.com> 2 92 -
trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h
r285859 r285996 35 35 #include <wtf/RetainPtr.h> 36 36 #endif 37 #include <wtf/RunLoop.h> 37 38 #include <wtf/Threading.h> 38 39 … … 69 70 RefPtr<AccessibilityUIElement> accessibleElementById(JSStringRef idAttribute); 70 71 71 #if PLATFORM(COCOA) 72 #if PLATFORM(COCOA) || USE(ATSPI) 72 73 void executeOnAXThreadAndWait(Function<void()>&&); 73 74 void executeOnAXThread(Function<void()>&&); … … 104 105 void updateIsolatedTreeMode(); 105 106 107 #if USE(ATSPI) 108 RunLoop& axRunLoop(); 109 #endif 110 106 111 #if PLATFORM(COCOA) 107 112 void spinMainRunLoop() const; … … 113 118 #endif 114 119 bool m_accessibilityIsolatedTreeMode { false }; 120 #if USE(ATSPI) 121 RunLoop* m_axRunLoop { nullptr }; 122 #endif 115 123 #endif 116 124 }; -
trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h
r285589 r285996 431 431 RefPtr<AccessibilityNotificationHandler> m_notificationHandler; 432 432 #elif USE(ATSPI) 433 static RefPtr<AccessibilityController> s_controller; 433 434 RefPtr<WebCore::AccessibilityObjectAtspi> m_element; 434 435 #endif -
trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp
r282643 r285996 33 33 #include "InjectedBundle.h" 34 34 #include "InjectedBundlePage.h" 35 #include "StringFunctions.h" 35 36 #include <WebCore/AccessibilityObjectAtspi.h> 37 #include <WebCore/AccessibilityRootAtspi.h> 36 38 #include <WebKit/WKBundlePagePrivate.h> 37 39 … … 42 44 } 43 45 46 static WebCore::AccessibilityObjectAtspi* findAccessibleObjectById(WebCore::AccessibilityObjectAtspi& axObject, const String& elementID) 47 { 48 axObject.updateBackingStore(); 49 if (axObject.id() == elementID) 50 return &axObject; 51 52 Vector<RefPtr<WebCore::AccessibilityObjectAtspi>> children; 53 InjectedBundle::singleton().accessibilityController()->executeOnAXThreadAndWait([axObject = Ref { axObject }, &children] { 54 axObject->updateBackingStore(); 55 children = axObject->children(); 56 }); 57 for (const auto& child : children) { 58 if (auto* element = findAccessibleObjectById(*child, elementID)) 59 return element; 60 } 61 62 return nullptr; 63 } 64 44 65 RefPtr<AccessibilityUIElement> AccessibilityController::accessibleElementById(JSStringRef id) 45 66 { 67 WKBundlePageRef page = InjectedBundle::singleton().page()->page(); 68 auto* rootObject = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page)); 69 if (!rootObject) 70 return nullptr; 71 72 String elementID = toWTFString(id); 73 if (auto* element = findAccessibleObjectById(*rootObject, elementID)) 74 return AccessibilityUIElement::create(element); 46 75 return nullptr; 47 76 } … … 49 78 JSRetainPtr<JSStringRef> AccessibilityController::platformName() 50 79 { 51 JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("atspi")); 80 // FIXME: Use atk as platform name for now, because the expected behavior is the same. 81 // Once we replace the atk implementation with the atspi one we can use atspi and 82 // update the tests helper scripts. https://bugs.webkit.org/show_bug.cgi?id=232227. 83 JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("atk")); 52 84 return platformName; 53 85 } … … 61 93 WKBundlePageRef page = InjectedBundle::singleton().page()->page(); 62 94 auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page)); 63 64 95 return AccessibilityUIElement::create(element); 65 96 } 66 97 67 Ref <AccessibilityUIElement> AccessibilityController::focusedElement()98 RefPtr<AccessibilityUIElement> AccessibilityController::focusedElement() 68 99 { 69 100 WKBundlePageRef page = InjectedBundle::singleton().page()->page(); 70 auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityFocusedObject(page));71 72 return AccessibilityUIElement::create(element);101 if (auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityFocusedObject(page))) 102 return AccessibilityUIElement::create(element); 103 return nullptr; 73 104 } 74 105 … … 87 118 } 88 119 120 RunLoop& AccessibilityController::axRunLoop() 121 { 122 if (!m_axRunLoop) { 123 WKBundlePageRef page = InjectedBundle::singleton().page()->page(); 124 auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page)); 125 RELEASE_ASSERT(element); 126 m_axRunLoop = &element->root()->atspi().runLoop(); 127 } 128 129 return *m_axRunLoop; 130 } 131 132 void AccessibilityController::executeOnAXThreadAndWait(Function<void()>&& function) 133 { 134 RELEASE_ASSERT(isMainThread()); 135 std::atomic<bool> done = false; 136 axRunLoop().dispatch([this, function = WTFMove(function), &done] { 137 function(); 138 done.store(true); 139 }); 140 while (!done.load()) 141 g_main_context_iteration(nullptr, FALSE); 142 } 143 144 void AccessibilityController::executeOnAXThread(Function<void()>&& function) 145 { 146 axRunLoop().dispatch([this, function = WTFMove(function)] { 147 function(); 148 }); 149 } 150 151 void AccessibilityController::executeOnMainThread(Function<void()>&& function) 152 { 153 if (isMainThread()) { 154 function(); 155 return; 156 } 157 158 axRunLoop().dispatch([this, function = WTFMove(function)]() mutable { 159 callOnMainThread(WTFMove(function)); 160 }); 161 } 162 89 163 } // namespace WTR 90 164 -
trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp
r282643 r285996 32 32 #include <JavaScriptCore/JSStringRef.h> 33 33 #include <JavaScriptCore/OpaqueJSString.h> 34 #include <WebCore/AccessibilityAtspiEnums.h> 34 35 #include <WebCore/AccessibilityObjectAtspi.h> 35 36 #include <WebKit/WKBundleFrame.h> 37 #include <wtf/text/CString.h> 38 #include <wtf/text/StringBuilder.h> 39 #include <wtf/text/StringToIntegerConversion.h> 40 #include <wtf/unicode/CharacterNames.h> 36 41 37 42 namespace WTR { 43 44 RefPtr<AccessibilityController> AccessibilityUIElement::s_controller; 38 45 39 46 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element) 40 47 : m_element(element) 41 48 { 49 if (!s_controller) 50 s_controller = InjectedBundle::singleton().accessibilityController(); 42 51 } 43 52 … … 54 63 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement) 55 64 { 56 return m_element.get() == otherElement->platformUIElement();65 return otherElement && m_element.get() == otherElement->platformUIElement(); 57 66 } 58 67 … … 72 81 int AccessibilityUIElement::childrenCount() 73 82 { 83 unsigned childCount; 84 s_controller->executeOnAXThreadAndWait([this, &childCount] { 85 m_element->updateBackingStore(); 86 childCount = m_element->childCount(); 87 }); 88 return childCount; 89 } 90 91 RefPtr<AccessibilityUIElement> AccessibilityUIElement::elementAtPoint(int x, int y) 92 { 93 auto* element = m_element->hitTest({ x, y }, WebCore::Atspi::CoordinateType::WindowCoordinates); 94 return AccessibilityUIElement::create(element ? element : m_element.get()); 95 } 96 97 unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element) 98 { 74 99 return 0; 75 100 } 76 101 77 RefPtr<AccessibilityUIElement> AccessibilityUIElement::elementAtPoint(int x, int y) 78 { 79 return nullptr; 80 } 81 82 unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element) 102 RefPtr<AccessibilityUIElement> AccessibilityUIElement::childAtIndex(unsigned index) 103 { 104 m_element->updateBackingStore(); 105 106 RefPtr<WebCore::AccessibilityObjectAtspi> child; 107 s_controller->executeOnAXThreadAndWait([this, &child, index] { 108 m_element->updateBackingStore(); 109 child = m_element->childAt(index); 110 }); 111 if (!child) 112 return nullptr; 113 114 return AccessibilityUIElement::create(child.get()); 115 } 116 117 static RefPtr<AccessibilityUIElement> elementForRelationAtIndex(WebCore::AccessibilityObjectAtspi* element, WebCore::Atspi::Relation relation, unsigned index) 118 { 119 auto relationMap = element->relationMap(); 120 auto targets = relationMap.get(relation); 121 if (targets.isEmpty() || index >= targets.size()) 122 return nullptr; 123 124 auto target = targets[index]; 125 if (!target) 126 return nullptr; 127 128 return AccessibilityUIElement::create(target.get()); 129 } 130 131 RefPtr<AccessibilityUIElement> AccessibilityUIElement::linkedUIElementAtIndex(unsigned index) 132 { 133 return nullptr; 134 } 135 136 RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index) 137 { 138 return elementForRelationAtIndex(m_element.get(), WebCore::Atspi::Relation::NodeParentOf, index); 139 } 140 141 RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index) 142 { 143 return elementForRelationAtIndex(m_element.get(), WebCore::Atspi::Relation::FlowsTo, index); 144 } 145 146 RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaControlsElementAtIndex(unsigned index) 147 { 148 return elementForRelationAtIndex(m_element.get(), WebCore::Atspi::Relation::ControllerFor, index); 149 } 150 151 RefPtr<AccessibilityUIElement> AccessibilityUIElement::disclosedRowAtIndex(unsigned index) 152 { 153 return nullptr; 154 } 155 156 RefPtr<AccessibilityUIElement> AccessibilityUIElement::rowAtIndex(unsigned index) 157 { 158 return nullptr; 159 } 160 161 RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedChildAtIndex(unsigned index) const 162 { 163 return nullptr; 164 } 165 166 unsigned AccessibilityUIElement::selectedChildrenCount() const 83 167 { 84 168 return 0; 85 169 } 86 170 87 RefPtr<AccessibilityUIElement> AccessibilityUIElement::childAtIndex(unsigned index) 88 { 89 return nullptr; 90 } 91 92 RefPtr<AccessibilityUIElement> AccessibilityUIElement::linkedUIElementAtIndex(unsigned index) 93 { 94 return nullptr; 95 } 96 97 RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index) 98 { 99 return nullptr; 100 } 101 102 RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index) 103 { 104 return nullptr; 105 } 106 107 RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaControlsElementAtIndex(unsigned index) 108 { 109 return nullptr; 110 } 111 112 RefPtr<AccessibilityUIElement> AccessibilityUIElement::disclosedRowAtIndex(unsigned index) 113 { 114 return nullptr; 115 } 116 117 RefPtr<AccessibilityUIElement> AccessibilityUIElement::rowAtIndex(unsigned index) 118 { 119 return nullptr; 120 } 121 122 RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedChildAtIndex(unsigned index) const 123 { 124 return nullptr; 125 } 126 127 unsigned AccessibilityUIElement::selectedChildrenCount() const 128 { 171 RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedRowAtIndex(unsigned index) 172 { 173 return nullptr; 174 } 175 176 RefPtr<AccessibilityUIElement> AccessibilityUIElement::titleUIElement() 177 { 178 return elementForRelationAtIndex(m_element.get(), WebCore::Atspi::Relation::LabelledBy, 0); 179 } 180 181 RefPtr<AccessibilityUIElement> AccessibilityUIElement::parentElement() 182 { 183 m_element->updateBackingStore(); 184 185 RefPtr<WebCore::AccessibilityObjectAtspi> parent; 186 s_controller->executeOnAXThreadAndWait([this, &parent] { 187 m_element->updateBackingStore(); 188 auto parentWrapper = m_element->parent(); 189 if (parentWrapper) 190 parent = parentWrapper.value(); 191 }); 192 if (!parent) 193 return nullptr; 194 195 return AccessibilityUIElement::create(parent.get()); 196 } 197 198 RefPtr<AccessibilityUIElement> AccessibilityUIElement::disclosedByRow() 199 { 200 return nullptr; 201 } 202 203 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfLinkedUIElements() 204 { 205 return JSStringCreateWithCharacters(0, 0); 206 } 207 208 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfDocumentLinks() 209 { 210 return JSStringCreateWithCharacters(0, 0); 211 } 212 213 static String attributesOfElement(AccessibilityUIElement& element) 214 { 215 StringBuilder builder; 216 217 builder.append(element.role()->string(), '\n'); 218 219 builder.append("AXParent: "); 220 if (auto parent = element.parentElement()) { 221 builder.append(parent->role()->string().substring(8)); 222 auto parentName = parent->title()->string().substring(9); 223 if (!parentName.isEmpty()) 224 builder.append(": ", parentName); 225 } else 226 builder.append("(null)"); 227 builder.append('\n'); 228 229 builder.append("AXChildren: ", element.childrenCount(), '\n'); 230 231 builder.append("AXPosition: { ", FormattedNumber::fixedPrecision(element.x(), 6, KeepTrailingZeros)); 232 builder.append(", ", FormattedNumber::fixedPrecision(element.y(), 6, KeepTrailingZeros)); 233 builder.append(" }\n"); 234 235 builder.append("AXSize: { ", FormattedNumber::fixedPrecision(element.width(), 6, KeepTrailingZeros)); 236 builder.append(", ", FormattedNumber::fixedPrecision(element.height(), 6, KeepTrailingZeros)); 237 builder.append(" }\n"); 238 239 String title = element.title()->string(); 240 if (!title.isEmpty()) { 241 builder.append(title); 242 builder.append('\n'); 243 } 244 245 String description = element.description()->string(); 246 if (!description.isEmpty()) 247 builder.append(description.utf8().data(), '\n'); 248 249 String value = element.stringValue()->string(); 250 if (!value.isEmpty()) 251 builder.append(value, '\n'); 252 253 builder.append("AXFocusable: ", element.isFocusable(), '\n'); 254 builder.append("AXFocused: ", element.isFocused(), '\n'); 255 builder.append("AXSelectable: ", element.isSelectable(), '\n'); 256 builder.append("AXSelected: ", element.isSelected(), '\n'); 257 builder.append("AXMultiSelectable: ", element.isMultiSelectable(), '\n'); 258 builder.append("AXEnabled: ", element.isEnabled(), '\n'); 259 builder.append("AXExpanded: ", element.isExpanded(), '\n'); 260 builder.append("AXRequired: ", element.isRequired(), '\n'); 261 builder.append("AXChecked: ", element.isChecked(), '\n'); 262 263 String url = element.url()->string(); 264 if (!url.isEmpty()) 265 builder.append(url, '\n'); 266 267 // We append the platform attributes as a single line at the end. 268 builder.append("AXPlatformAttributes: "); 269 auto attributes = element.platformUIElement()->attributes(); 270 bool isFirst = true; 271 for (const auto& it : attributes) { 272 if (!isFirst) 273 builder.append(", "); 274 isFirst = false; 275 builder.append(it.key, ':', it.value); 276 } 277 builder.append('\n'); 278 279 return builder.toString(); 280 } 281 282 static String attributesOfElements(Vector<RefPtr<AccessibilityUIElement>>& elements) 283 { 284 StringBuilder builder; 285 for (auto& element : elements) 286 builder.append(attributesOfElement(*element), "\n------------\n"); 287 return builder.toString(); 288 } 289 290 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfChildren() 291 { 292 m_element->updateBackingStore(); 293 294 Vector<RefPtr<WebCore::AccessibilityObjectAtspi>> children; 295 s_controller->executeOnAXThreadAndWait([this, &children] { 296 m_element->updateBackingStore(); 297 children = m_element->children(); 298 }); 299 300 Vector<RefPtr<AccessibilityUIElement>> elements; 301 elements.reserveInitialCapacity(children.size()); 302 for (auto& child : children) 303 elements.uncheckedAppend(AccessibilityUIElement::create(child.get())); 304 305 return OpaqueJSString::tryCreate(attributesOfElements(elements)).leakRef(); 306 } 307 308 JSRetainPtr<JSStringRef> AccessibilityUIElement::allAttributes() 309 { 310 return OpaqueJSString::tryCreate(attributesOfElement(*this)).leakRef(); 311 } 312 313 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringDescriptionOfAttributeValue(JSStringRef attribute) 314 { 315 return JSStringCreateWithCharacters(0, 0); 316 } 317 318 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringAttributeValue(JSStringRef attribute) 319 { 320 String attributeName = toWTFString(attribute); 321 if (attributeName == "AXSelectedText") { 322 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 323 return JSStringCreateWithCharacters(0, 0); 324 325 m_element->updateBackingStore(); 326 auto text = m_element->text(); 327 auto offset = m_element->selectedRange(); 328 return OpaqueJSString::tryCreate(text.substring(offset.x(), offset.y() - offset.x())).leakRef(); 329 } 330 331 auto attributes = m_element->attributes(); 332 if (attributeName == "AXPlaceholderValue") 333 return OpaqueJSString::tryCreate(attributes.get("placeholder-text")).leakRef(); 334 335 return JSStringCreateWithCharacters(0, 0); 336 } 337 338 double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute) 339 { 340 String attributeName = toWTFString(attribute); 341 auto attributes = m_element->attributes(); 342 if (attributeName == "AXARIASetSize") 343 return attributes.get("setsize").toDouble(); 344 if (attributeName == "AXARIAPosInSet") 345 return attributes.get("posinset").toDouble(); 346 129 347 return 0; 130 348 } 131 349 132 RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedRowAtIndex(unsigned index) 133 { 134 return nullptr; 135 } 136 137 RefPtr<AccessibilityUIElement> AccessibilityUIElement::titleUIElement() 138 { 139 return nullptr; 140 } 141 142 RefPtr<AccessibilityUIElement> AccessibilityUIElement::parentElement() 143 { 144 return nullptr; 145 } 146 147 RefPtr<AccessibilityUIElement> AccessibilityUIElement::disclosedByRow() 148 { 149 return nullptr; 150 } 151 152 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfLinkedUIElements() 153 { 154 return JSStringCreateWithCharacters(0, 0); 155 } 156 157 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfDocumentLinks() 158 { 159 return JSStringCreateWithCharacters(0, 0); 160 } 161 162 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfChildren() 163 { 164 return JSStringCreateWithCharacters(0, 0); 165 } 166 167 JSRetainPtr<JSStringRef> AccessibilityUIElement::allAttributes() 168 { 169 return JSStringCreateWithCharacters(0, 0); 170 } 171 172 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringDescriptionOfAttributeValue(JSStringRef attribute) 173 { 174 return JSStringCreateWithCharacters(0, 0); 175 } 176 177 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringAttributeValue(JSStringRef attribute) 178 { 179 return JSStringCreateWithCharacters(0, 0); 180 } 181 182 double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute) 350 JSValueRef AccessibilityUIElement::uiElementArrayAttributeValue(JSStringRef attribute) const 351 { 352 return nullptr; 353 } 354 355 JSValueRef AccessibilityUIElement::rowHeaders() const 356 { 357 return nullptr; 358 } 359 360 JSValueRef AccessibilityUIElement::columnHeaders() const 361 { 362 return nullptr; 363 } 364 365 RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementAttributeValue(JSStringRef attribute) const 366 { 367 return nullptr; 368 } 369 370 static bool checkElementState(WebCore::AccessibilityObjectAtspi* element, WebCore::Atspi::State state) 371 { 372 return element->state() & (G_GUINT64_CONSTANT(1) << state); 373 } 374 375 bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute) 376 { 377 String attributeName = toWTFString(attribute); 378 if (attributeName == "AXElementBusy") 379 return checkElementState(m_element.get(), WebCore::Atspi::State::Busy); 380 381 return false; 382 } 383 384 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute) 385 { 386 return false; 387 } 388 389 bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute) 390 { 391 String attributeName = toWTFString(attribute); 392 auto attributes = m_element->attributes(); 393 if (attributeName == "AXARIASetSize") 394 return attributes.contains("setsize"); 395 if (attributeName == "AXARIAPosInSet") 396 return attributes.contains("posinset"); 397 398 return false; 399 } 400 401 JSRetainPtr<JSStringRef> AccessibilityUIElement::parameterizedAttributeNames() 402 { 403 return JSStringCreateWithCharacters(0, 0); 404 } 405 406 static String roleValueToString(unsigned roleValue) 407 { 408 switch (roleValue) { 409 case WebCore::Atspi::Role::Alert: 410 return "AXAlert"_s; 411 case WebCore::Atspi::Role::Article: 412 return "AXArticle"_s; 413 case WebCore::Atspi::Role::Audio: 414 return "AXAudio"_s; 415 case WebCore::Atspi::Role::BlockQuote: 416 return "AXBlockquote"_s; 417 case WebCore::Atspi::Role::Canvas: 418 return "AXCanvas"_s; 419 case WebCore::Atspi::Role::Caption: 420 return "AXCaption"_s; 421 case WebCore::Atspi::Role::CheckBox: 422 return "AXCheckBox"_s; 423 case WebCore::Atspi::Role::CheckMenuItem: 424 return "AXCheckMenuItem"_s; 425 case WebCore::Atspi::Role::ColorChooser: 426 return "AXColorWell"_s; 427 case WebCore::Atspi::Role::ColumnHeader: 428 case WebCore::Atspi::Role::TableColumnHeader: 429 return "AXColumnHeader"_s; 430 case WebCore::Atspi::Role::ComboBox: 431 return "AXComboBox"_s; 432 case WebCore::Atspi::Role::Comment: 433 return "AXComment"_s; 434 case WebCore::Atspi::Role::ContentDeletion: 435 return "AXDeletion"_s; 436 case WebCore::Atspi::Role::ContentInsertion: 437 return "AXInsertion"_s; 438 case WebCore::Atspi::Role::Definition: 439 return "AXDefinition"_s; 440 case WebCore::Atspi::Role::DescriptionList: 441 return "AXDescriptionList"_s; 442 case WebCore::Atspi::Role::DescriptionTerm: 443 return "AXDescriptionTerm"_s; 444 case WebCore::Atspi::Role::DescriptionValue: 445 return "AXDescriptionValue"_s; 446 case WebCore::Atspi::Role::Dialog: 447 return "AXDialog"_s; 448 case WebCore::Atspi::Role::DocumentFrame: 449 return "AXDocument"_s; 450 case WebCore::Atspi::Role::DocumentWeb: 451 return "AXWebArea"_s; 452 case WebCore::Atspi::Role::Embedded: 453 return "AXEmbedded"_s; 454 case WebCore::Atspi::Role::Entry: 455 return "AXTextField"_s; 456 case WebCore::Atspi::Role::Footer: 457 return "AXFooter"_s; 458 case WebCore::Atspi::Role::Footnote: 459 return "AXFootnote"_s; 460 case WebCore::Atspi::Role::Form: 461 return "AXForm"_s; 462 case WebCore::Atspi::Role::Grouping: 463 case WebCore::Atspi::Role::Panel: 464 return "AXGroup"_s; 465 case WebCore::Atspi::Role::Heading: 466 return "AXHeading"_s; 467 case WebCore::Atspi::Role::Image: 468 return "AXImage"_s; 469 case WebCore::Atspi::Role::ImageMap: 470 return "AXImageMap"_s; 471 case WebCore::Atspi::Role::InvalidRole: 472 return "AXInvalid"_s; 473 case WebCore::Atspi::Role::Label: 474 return "AXLabel"_s; 475 case WebCore::Atspi::Role::LevelBar: 476 return "AXLevelIndicator"_s; 477 case WebCore::Atspi::Role::Link: 478 return "AXLink"_s; 479 case WebCore::Atspi::Role::ListBox: 480 return "AXListBox"_s; 481 case WebCore::Atspi::Role::List: 482 return "AXList"_s; 483 case WebCore::Atspi::Role::ListItem: 484 return "AXListItem"_s; 485 case WebCore::Atspi::Role::Log: 486 return "AXLog"_s; 487 case WebCore::Atspi::Role::Marquee: 488 return "AXMarquee"_s; 489 case WebCore::Atspi::Role::Math: 490 return "AXMath"_s; 491 case WebCore::Atspi::Role::MathFraction: 492 return "AXMathFraction"_s; 493 case WebCore::Atspi::Role::MathRoot: 494 return "AXMathRoot"_s; 495 case WebCore::Atspi::Role::Menu: 496 return "AXMenu"_s; 497 case WebCore::Atspi::Role::MenuBar: 498 return "AXMenuBar"_s; 499 case WebCore::Atspi::Role::MenuItem: 500 return "AXMenuItem"_s; 501 case WebCore::Atspi::Role::Notification: 502 return "AXNotification"_s; 503 case WebCore::Atspi::Role::PageTab: 504 return "AXTab"_s; 505 case WebCore::Atspi::Role::PageTabList: 506 return "AXTabGroup"_s; 507 case WebCore::Atspi::Role::Paragraph: 508 return "AXParagraph"_s; 509 case WebCore::Atspi::Role::PasswordText: 510 return "AXPasswordField"_s; 511 case WebCore::Atspi::Role::ProgressBar: 512 return "AXProgressIndicator"_s; 513 case WebCore::Atspi::Role::PushButton: 514 return "AXButton"_s; 515 case WebCore::Atspi::Role::RadioButton: 516 return "AXRadioButton"_s; 517 case WebCore::Atspi::Role::RadioMenuItem: 518 return "AXRadioMenuItem"_s; 519 case WebCore::Atspi::Role::RowHeader: 520 case WebCore::Atspi::Role::TableRowHeader: 521 return "AXRowHeader"_s; 522 case WebCore::Atspi::Role::Ruler: 523 return "AXRuler"_s; 524 case WebCore::Atspi::Role::ScrollBar: 525 return "AXScrollBar"_s; 526 case WebCore::Atspi::Role::ScrollPane: 527 return "AXScrollArea"; 528 case WebCore::Atspi::Role::Section: 529 return "AXSection"_s; 530 case WebCore::Atspi::Role::Separator: 531 return "AXSeparator"_s; 532 case WebCore::Atspi::Role::Slider: 533 return "AXSlider"_s; 534 case WebCore::Atspi::Role::SpinButton: 535 return "AXSpinButton"_s; 536 case WebCore::Atspi::Role::Static: 537 return "AXStatic"_s; 538 case WebCore::Atspi::Role::StatusBar: 539 return "AXStatusBar"_s; 540 case WebCore::Atspi::Role::Subscript: 541 return "AXSubscript"_s; 542 case WebCore::Atspi::Role::Superscript: 543 return "AXSuperscript"_s; 544 case WebCore::Atspi::Role::Table: 545 return "AXTable"_s; 546 case WebCore::Atspi::Role::TableCell: 547 return "AXCell"_s; 548 case WebCore::Atspi::Role::TableRow: 549 return "AXRow"_s; 550 case WebCore::Atspi::Role::Timer: 551 return "AXTimer"_s; 552 case WebCore::Atspi::Role::ToggleButton: 553 return "AXToggleButton"_s; 554 case WebCore::Atspi::Role::ToolBar: 555 return "AXToolbar"_s; 556 case WebCore::Atspi::Role::ToolTip: 557 return "AXUserInterfaceTooltip"_s; 558 case WebCore::Atspi::Role::Tree: 559 return "AXTree"_s; 560 case WebCore::Atspi::Role::TreeTable: 561 return "AXTreeGrid"_s; 562 case WebCore::Atspi::Role::TreeItem: 563 return "AXTreeItem"_s; 564 case WebCore::Atspi::Role::Unknown: 565 return "AXUnknown"_s; 566 case WebCore::Atspi::Role::Video: 567 return "AXVideo"_s; 568 case WebCore::Atspi::Role::Window: 569 return "AXWindow"_s; 570 default: 571 break; 572 } 573 574 return { }; 575 } 576 577 JSRetainPtr<JSStringRef> AccessibilityUIElement::role() 578 { 579 unsigned roleValue; 580 s_controller->executeOnAXThreadAndWait([this, &roleValue] { 581 m_element->updateBackingStore(); 582 roleValue = m_element->role(); 583 }); 584 auto roleValueString = roleValueToString(roleValue); 585 if (roleValueString.isEmpty()) 586 return JSStringCreateWithCharacters(0, 0); 587 588 return OpaqueJSString::tryCreate(makeString("AXRole: ", roleValueString)).leakRef(); 589 } 590 591 JSRetainPtr<JSStringRef> AccessibilityUIElement::subrole() 592 { 593 return JSStringCreateWithCharacters(0, 0); 594 } 595 596 JSRetainPtr<JSStringRef> AccessibilityUIElement::roleDescription() 597 { 598 auto roleDescription = m_element->attributes().get("roledescription"); 599 return OpaqueJSString::tryCreate(makeString("AXRoleDescription: ", roleDescription)).leakRef(); 600 } 601 602 JSRetainPtr<JSStringRef> AccessibilityUIElement::computedRoleString() 603 { 604 auto computedRole = m_element->attributes().get("computed-role"); 605 if (computedRole.isEmpty()) 606 return JSStringCreateWithCharacters(0, 0); 607 608 return OpaqueJSString::tryCreate(computedRole).leakRef(); 609 } 610 611 JSRetainPtr<JSStringRef> AccessibilityUIElement::title() 612 { 613 String name; 614 s_controller->executeOnAXThreadAndWait([this, &name] { 615 m_element->updateBackingStore(); 616 name = String::fromUTF8(m_element->name().data()); 617 }); 618 619 auto titleValue = makeString("AXTitle: ", name); 620 return OpaqueJSString::tryCreate(titleValue).leakRef(); 621 } 622 623 JSRetainPtr<JSStringRef> AccessibilityUIElement::description() 624 { 625 String description; 626 s_controller->executeOnAXThreadAndWait([this, &description] { 627 m_element->updateBackingStore(); 628 description = String::fromUTF8(m_element->description().data()); 629 }); 630 631 auto descriptionValue = makeString("AXDescription: ", description); 632 return OpaqueJSString::tryCreate(descriptionValue).leakRef(); 633 } 634 635 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const 636 { 637 const char* orientation = nullptr; 638 if (checkElementState(m_element.get(), WebCore::Atspi::State::Horizontal)) 639 orientation = "AXHorizontalOrientation"; 640 else if (checkElementState(m_element.get(), WebCore::Atspi::State::Vertical)) 641 orientation = "AXVerticalOrientation"; 642 else 643 orientation = "AXUnknownOrientation"; 644 645 auto orientationValue = makeString("AXOrientation: ", orientation); 646 return OpaqueJSString::tryCreate(orientationValue).leakRef(); 647 } 648 649 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringValue() 650 { 651 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 652 return JSStringCreateWithCharacters(0, 0); 653 654 m_element->updateBackingStore(); 655 auto value = makeString("AXValue: ", m_element->text().replace("\n", "<\\n>").replace(objectReplacementCharacter, "<obj>")); 656 return OpaqueJSString::tryCreate(value).leakRef(); 657 } 658 659 JSRetainPtr<JSStringRef> AccessibilityUIElement::language() 660 { 661 return JSStringCreateWithCharacters(0, 0); 662 } 663 664 JSRetainPtr<JSStringRef> AccessibilityUIElement::helpText() const 665 { 666 auto relationMap = m_element->relationMap(); 667 auto targets = relationMap.get(WebCore::Atspi::Relation::DescribedBy); 668 if (targets.isEmpty()) 669 return JSStringCreateWithCharacters(0, 0); 670 671 StringBuilder builder; 672 builder.append("AXHelp: "); 673 674 bool isFirst = true; 675 for (const auto& target : targets) { 676 if (!isFirst) 677 builder.append(' '); 678 isFirst = false; 679 target->updateBackingStore(); 680 builder.append(target->text()); 681 } 682 683 return OpaqueJSString::tryCreate(builder.toString()).leakRef(); 684 } 685 686 double AccessibilityUIElement::x() 687 { 688 return m_element->elementRect(WebCore::Atspi::CoordinateType::ScreenCoordinates).x(); 689 } 690 691 double AccessibilityUIElement::y() 692 { 693 return m_element->elementRect(WebCore::Atspi::CoordinateType::ScreenCoordinates).y(); 694 } 695 696 double AccessibilityUIElement::width() 697 { 698 return m_element->elementRect(WebCore::Atspi::CoordinateType::ScreenCoordinates).width(); 699 } 700 701 double AccessibilityUIElement::height() 702 { 703 return m_element->elementRect(WebCore::Atspi::CoordinateType::ScreenCoordinates).height(); 704 } 705 706 double AccessibilityUIElement::clickPointX() 707 { 708 auto rect = m_element->elementRect(WebCore::Atspi::CoordinateType::WindowCoordinates); 709 return rect.center().x(); 710 } 711 712 double AccessibilityUIElement::clickPointY() 713 { 714 auto rect = m_element->elementRect(WebCore::Atspi::CoordinateType::WindowCoordinates); 715 return rect.center().y(); 716 } 717 718 double AccessibilityUIElement::intValue() const 183 719 { 184 720 return 0; 185 721 } 186 722 187 JSValueRef AccessibilityUIElement::uiElementArrayAttributeValue(JSStringRef attribute) const 188 { 189 return nullptr;190 } 191 192 JSValueRef AccessibilityUIElement::rowHeaders() const 193 { 194 return nullptr;195 } 196 197 JS ValueRef AccessibilityUIElement::columnHeaders() const198 { 199 return nullptr;200 } 201 202 RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementAttributeValue(JSStringRef attribute) const 203 { 204 return nullptr;205 } 206 207 bool AccessibilityUIElement:: boolAttributeValue(JSStringRef attribute)723 double AccessibilityUIElement::minValue() 724 { 725 return 0; 726 } 727 728 double AccessibilityUIElement::maxValue() 729 { 730 return 0; 731 } 732 733 JSRetainPtr<JSStringRef> AccessibilityUIElement::valueDescription() 734 { 735 return JSStringCreateWithCharacters(0, 0); 736 } 737 738 int AccessibilityUIElement::insertionPointLineNumber() 739 { 740 return -1; 741 } 742 743 bool AccessibilityUIElement::isPressActionSupported() 208 744 { 209 745 return false; 210 746 } 211 747 212 bool AccessibilityUIElement::is AttributeSettable(JSStringRef attribute)748 bool AccessibilityUIElement::isIncrementActionSupported() 213 749 { 214 750 return false; 215 751 } 216 752 217 bool AccessibilityUIElement::is AttributeSupported(JSStringRef attribute)753 bool AccessibilityUIElement::isDecrementActionSupported() 218 754 { 219 755 return false; 220 756 } 221 757 222 JSRetainPtr<JSStringRef> AccessibilityUIElement::parameterizedAttributeNames() 223 { 224 return JSStringCreateWithCharacters(0, 0); 225 } 226 227 JSRetainPtr<JSStringRef> AccessibilityUIElement::role() 228 { 229 return JSStringCreateWithCharacters(0, 0); 230 } 231 232 JSRetainPtr<JSStringRef> AccessibilityUIElement::subrole() 233 { 234 return JSStringCreateWithCharacters(0, 0); 235 } 236 237 JSRetainPtr<JSStringRef> AccessibilityUIElement::roleDescription() 238 { 239 return JSStringCreateWithCharacters(0, 0); 240 } 241 242 JSRetainPtr<JSStringRef> AccessibilityUIElement::computedRoleString() 243 { 244 return JSStringCreateWithCharacters(0, 0); 245 } 246 247 JSRetainPtr<JSStringRef> AccessibilityUIElement::title() 248 { 249 return JSStringCreateWithCharacters(0, 0); 250 } 251 252 JSRetainPtr<JSStringRef> AccessibilityUIElement::description() 253 { 254 return JSStringCreateWithCharacters(0, 0); 255 } 256 257 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const 258 { 259 return JSStringCreateWithCharacters(0, 0); 260 } 261 262 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringValue() 263 { 264 return JSStringCreateWithCharacters(0, 0); 265 } 266 267 JSRetainPtr<JSStringRef> AccessibilityUIElement::language() 268 { 269 return JSStringCreateWithCharacters(0, 0); 270 } 271 272 JSRetainPtr<JSStringRef> AccessibilityUIElement::helpText() const 273 { 274 return JSStringCreateWithCharacters(0, 0); 275 } 276 277 double AccessibilityUIElement::x() 758 bool AccessibilityUIElement::isEnabled() 759 { 760 return checkElementState(m_element.get(), WebCore::Atspi::State::Enabled); 761 } 762 763 bool AccessibilityUIElement::isRequired() const 764 { 765 return checkElementState(m_element.get(), WebCore::Atspi::State::Required); 766 } 767 768 bool AccessibilityUIElement::isFocused() const 769 { 770 return checkElementState(m_element.get(), WebCore::Atspi::State::Focused); 771 } 772 773 bool AccessibilityUIElement::isSelected() const 774 { 775 return checkElementState(m_element.get(), WebCore::Atspi::State::Selected); 776 } 777 778 bool AccessibilityUIElement::isSelectedOptionActive() const 779 { 780 return checkElementState(m_element.get(), WebCore::Atspi::State::Active); 781 } 782 783 bool AccessibilityUIElement::isExpanded() const 784 { 785 return checkElementState(m_element.get(), WebCore::Atspi::State::Expanded); 786 } 787 788 bool AccessibilityUIElement::isChecked() const 789 { 790 return checkElementState(m_element.get(), WebCore::Atspi::State::Checked); 791 } 792 793 bool AccessibilityUIElement::isIndeterminate() const 794 { 795 return checkElementState(m_element.get(), WebCore::Atspi::State::Indeterminate); 796 } 797 798 int AccessibilityUIElement::hierarchicalLevel() const 799 { 800 auto level = m_element->attributes().get("level"); 801 if (level.isEmpty()) 802 return 0; 803 804 return parseIntegerAllowingTrailingJunk<int>(level).value_or(0); 805 } 806 807 JSRetainPtr<JSStringRef> AccessibilityUIElement::speakAs() 808 { 809 return JSStringCreateWithCharacters(0, 0); 810 } 811 812 bool AccessibilityUIElement::ariaIsGrabbed() const 813 { 814 return m_element->attributes().get("grabbed") == "true"; 815 } 816 817 JSRetainPtr<JSStringRef> AccessibilityUIElement::ariaDropEffects() const 818 { 819 auto dropEffects = m_element->attributes().get("dropeffect"); 820 if (dropEffects.isEmpty()) 821 return JSStringCreateWithCharacters(0, 0); 822 return OpaqueJSString::tryCreate(dropEffects).leakRef(); 823 } 824 825 int AccessibilityUIElement::lineForIndex(int index) 826 { 827 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 828 return -1; 829 830 m_element->updateBackingStore(); 831 auto text = m_element->text(); 832 if (index < 0 || index > static_cast<int>(text.length())) 833 return -1; 834 835 int lineNumber = 0; 836 for (int i = 0; i < index; ++i) { 837 if (text[i] == '\n') 838 lineNumber++; 839 } 840 841 return lineNumber; 842 } 843 844 JSRetainPtr<JSStringRef> AccessibilityUIElement::rangeForLine(int line) 845 { 846 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 847 return JSStringCreateWithCharacters(0, 0); 848 849 WebCore::IntPoint offset; 850 for (int i = 0; i <= line; ++i) 851 offset = m_element->boundaryOffset(offset.y(), WebCore::AccessibilityObjectAtspi::TextGranularity::LineStart); 852 853 auto range = makeString('{', offset.x(), ", ", offset.y() - offset.x(), '}'); 854 return OpaqueJSString::tryCreate(range).leakRef(); 855 } 856 857 JSRetainPtr<JSStringRef> AccessibilityUIElement::rangeForPosition(int x, int y) 858 { 859 return JSStringCreateWithCharacters(0, 0); 860 } 861 862 JSRetainPtr<JSStringRef> AccessibilityUIElement::boundsForRange(unsigned location, unsigned length) 863 { 864 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 865 return JSStringCreateWithCharacters(0, 0); 866 867 auto rect = m_element->boundsForRange(location, length, WebCore::Atspi::CoordinateType::WindowCoordinates); 868 auto bounds = makeString('{', rect.x(), ", ", rect.y(), ", ", rect.width(), ", ", rect.height(), '}'); 869 return OpaqueJSString::tryCreate(bounds).leakRef(); 870 } 871 872 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringForRange(unsigned location, unsigned length) 873 { 874 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 875 return JSStringCreateWithCharacters(0, 0); 876 877 m_element->updateBackingStore(); 878 return OpaqueJSString::tryCreate(m_element->text().substring(location, length)).leakRef(); 879 } 880 881 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributedStringForRange(unsigned location, unsigned length) 882 { 883 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 884 return JSStringCreateWithCharacters(0, 0); 885 886 StringBuilder builder; 887 888 auto buildAttributes = [&](const WebCore::AccessibilityObjectAtspi::TextAttributes& attributes) { 889 for (const auto& it : attributes.attributes) { 890 builder.append("\n\t\t"); 891 builder.append(it.key, ':', it.value); 892 } 893 }; 894 895 builder.append("\n\tDefault text attributes:"); 896 buildAttributes(m_element->textAttributes()); 897 898 auto text = m_element->text(); 899 int endOffset = 0; 900 for (unsigned i = location; i < location + length; i = endOffset) { 901 auto attributes = m_element->textAttributes(i); 902 auto rangeStart = std::max<int>(location, attributes.startOffset); 903 auto rangeEnd = std::min<int>(location + length, attributes.endOffset); 904 builder.append("\n\tRange attributes for '", text.substring(rangeStart, rangeEnd - rangeStart).replace("\n", "<\\n>").replace(objectReplacementCharacter, "<obj>"), "':"); 905 buildAttributes(attributes); 906 endOffset = attributes.endOffset; 907 } 908 909 return OpaqueJSString::tryCreate(builder.toString()).leakRef(); 910 } 911 912 bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned location, unsigned length) 913 { 914 return false; 915 } 916 917 unsigned AccessibilityUIElement::uiElementCountForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly) 278 918 { 279 919 return 0; 280 920 } 281 921 282 double AccessibilityUIElement::y() 922 RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly) 923 { 924 return nullptr; 925 } 926 927 JSRetainPtr<JSStringRef> AccessibilityUIElement::selectTextWithCriteria(JSContextRef context, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity) 928 { 929 return nullptr; 930 } 931 932 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfColumnHeaders() 933 { 934 return JSStringCreateWithCharacters(0, 0); 935 } 936 937 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfRowHeaders() 938 { 939 return JSStringCreateWithCharacters(0, 0); 940 } 941 942 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfColumns() 943 { 944 return JSStringCreateWithCharacters(0, 0); 945 } 946 947 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfRows() 948 { 949 return JSStringCreateWithCharacters(0, 0); 950 } 951 952 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfVisibleCells() 953 { 954 return JSStringCreateWithCharacters(0, 0); 955 } 956 957 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfHeader() 958 { 959 return JSStringCreateWithCharacters(0, 0); 960 } 961 962 int AccessibilityUIElement::rowCount() 283 963 { 284 964 return 0; 285 965 } 286 966 287 double AccessibilityUIElement::width()967 int AccessibilityUIElement::columnCount() 288 968 { 289 969 return 0; 290 970 } 291 971 292 double AccessibilityUIElement::height() 293 { 294 return 0; 295 } 296 297 double AccessibilityUIElement::clickPointX() 298 { 299 return 0; 300 } 301 302 double AccessibilityUIElement::clickPointY() 303 { 304 return 0; 305 } 306 307 double AccessibilityUIElement::intValue() const 308 { 309 return 0; 310 } 311 312 double AccessibilityUIElement::minValue() 313 { 314 return 0; 315 } 316 317 double AccessibilityUIElement::maxValue() 318 { 319 return 0; 320 } 321 322 JSRetainPtr<JSStringRef> AccessibilityUIElement::valueDescription() 323 { 324 return JSStringCreateWithCharacters(0, 0); 325 } 326 327 int AccessibilityUIElement::insertionPointLineNumber() 972 int AccessibilityUIElement::indexInTable() 328 973 { 329 974 return -1; 330 975 } 331 976 332 bool AccessibilityUIElement::isPressActionSupported() 977 JSRetainPtr<JSStringRef> AccessibilityUIElement::rowIndexRange() 978 { 979 return JSStringCreateWithCharacters(0, 0); 980 } 981 982 JSRetainPtr<JSStringRef> AccessibilityUIElement::columnIndexRange() 983 { 984 return JSStringCreateWithCharacters(0, 0); 985 } 986 987 RefPtr<AccessibilityUIElement> AccessibilityUIElement::cellForColumnAndRow(unsigned col, unsigned row) 988 { 989 return nullptr; 990 } 991 992 RefPtr<AccessibilityUIElement> AccessibilityUIElement::horizontalScrollbar() const 993 { 994 return nullptr; 995 } 996 997 RefPtr<AccessibilityUIElement> AccessibilityUIElement::verticalScrollbar() const 998 { 999 return nullptr; 1000 } 1001 1002 JSRetainPtr<JSStringRef> AccessibilityUIElement::selectedTextRange() 1003 { 1004 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 1005 return JSStringCreateWithCharacters(0, 0); 1006 1007 auto offset = m_element->selectedRange(); 1008 auto range = makeString('{', offset.x(), ", ", offset.y() - offset.x(), '}'); 1009 return OpaqueJSString::tryCreate(range).leakRef(); 1010 } 1011 1012 bool AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length) 1013 { 1014 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 1015 return false; 1016 1017 m_element->updateBackingStore(); 1018 auto textLength = m_element->text().length(); 1019 m_element->setSelectedRange(std::min(location, textLength), std::min(length, textLength)); 1020 return true; 1021 } 1022 1023 void AccessibilityUIElement::increment() 1024 { 1025 } 1026 1027 void AccessibilityUIElement::decrement() 1028 { 1029 } 1030 1031 void AccessibilityUIElement::showMenu() 1032 { 1033 } 1034 1035 void AccessibilityUIElement::press() 1036 { 1037 } 1038 1039 void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement* element) const 1040 { 1041 } 1042 1043 void AccessibilityUIElement::setSelectedChildAtIndex(unsigned index) const 1044 { 1045 } 1046 1047 void AccessibilityUIElement::removeSelectionAtIndex(unsigned index) const 1048 { 1049 } 1050 1051 void AccessibilityUIElement::clearSelectedChildren() const 1052 { 1053 } 1054 1055 JSRetainPtr<JSStringRef> AccessibilityUIElement::accessibilityValue() const 1056 { 1057 return JSStringCreateWithCharacters(0, 0); 1058 } 1059 1060 JSRetainPtr<JSStringRef> AccessibilityUIElement::documentEncoding() 1061 { 1062 return JSStringCreateWithCharacters(0, 0); 1063 } 1064 1065 JSRetainPtr<JSStringRef> AccessibilityUIElement::documentURI() 1066 { 1067 return JSStringCreateWithCharacters(0, 0); 1068 } 1069 1070 JSRetainPtr<JSStringRef> AccessibilityUIElement::url() 1071 { 1072 return JSStringCreateWithCharacters(0, 0); 1073 } 1074 1075 bool AccessibilityUIElement::addNotificationListener(JSValueRef functionCallback) 333 1076 { 334 1077 return false; 335 1078 } 336 1079 337 bool AccessibilityUIElement::isIncrementActionSupported() 1080 bool AccessibilityUIElement::removeNotificationListener() 1081 { 1082 return true; 1083 } 1084 1085 bool AccessibilityUIElement::isFocusable() const 1086 { 1087 return checkElementState(m_element.get(), WebCore::Atspi::State::Focusable); 1088 } 1089 1090 bool AccessibilityUIElement::isSelectable() const 1091 { 1092 return checkElementState(m_element.get(), WebCore::Atspi::State::Selectable); 1093 } 1094 1095 bool AccessibilityUIElement::isMultiSelectable() const 1096 { 1097 return checkElementState(m_element.get(), WebCore::Atspi::State::Multiselectable); 1098 } 1099 1100 bool AccessibilityUIElement::isVisible() const 1101 { 1102 return checkElementState(m_element.get(), WebCore::Atspi::State::Visible); 1103 } 1104 1105 bool AccessibilityUIElement::isOffScreen() const 1106 { 1107 return !checkElementState(m_element.get(), WebCore::Atspi::State::Showing); 1108 } 1109 1110 bool AccessibilityUIElement::isCollapsed() const 1111 { 1112 return checkElementState(m_element.get(), WebCore::Atspi::State::Collapsed); 1113 } 1114 1115 bool AccessibilityUIElement::isIgnored() const 338 1116 { 339 1117 return false; 340 1118 } 341 1119 342 bool AccessibilityUIElement::isDecrementActionSupported()343 {344 return false;345 }346 347 bool AccessibilityUIElement::isEnabled()348 {349 return false;350 }351 352 bool AccessibilityUIElement::isRequired() const353 {354 return false;355 }356 357 bool AccessibilityUIElement::isFocused() const358 {359 return false;360 }361 362 bool AccessibilityUIElement::isSelected() const363 {364 return false;365 }366 367 bool AccessibilityUIElement::isSelectedOptionActive() const368 {369 return false;370 }371 372 bool AccessibilityUIElement::isExpanded() const373 {374 return false;375 }376 377 bool AccessibilityUIElement::isChecked() const378 {379 return false;380 }381 382 bool AccessibilityUIElement::isIndeterminate() const383 {384 return false;385 }386 387 int AccessibilityUIElement::hierarchicalLevel() const388 {389 return false;390 }391 392 JSRetainPtr<JSStringRef> AccessibilityUIElement::speakAs()393 {394 return JSStringCreateWithCharacters(0, 0);395 }396 397 bool AccessibilityUIElement::ariaIsGrabbed() const398 {399 return false;400 }401 402 JSRetainPtr<JSStringRef> AccessibilityUIElement::ariaDropEffects() const403 {404 return JSStringCreateWithCharacters(0, 0);405 }406 407 int AccessibilityUIElement::lineForIndex(int index)408 {409 return -1;410 }411 412 JSRetainPtr<JSStringRef> AccessibilityUIElement::rangeForLine(int line)413 {414 return JSStringCreateWithCharacters(0, 0);415 }416 417 JSRetainPtr<JSStringRef> AccessibilityUIElement::rangeForPosition(int x, int y)418 {419 return JSStringCreateWithCharacters(0, 0);420 }421 422 JSRetainPtr<JSStringRef> AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)423 {424 return JSStringCreateWithCharacters(0, 0);425 }426 427 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringForRange(unsigned location, unsigned length)428 {429 return JSStringCreateWithCharacters(0, 0);430 }431 432 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributedStringForRange(unsigned location, unsigned length)433 {434 return JSStringCreateWithCharacters(0, 0);435 }436 437 bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned location, unsigned length)438 {439 return false;440 }441 442 unsigned AccessibilityUIElement::uiElementCountForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)443 {444 return 0;445 }446 447 RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)448 {449 return nullptr;450 }451 452 JSRetainPtr<JSStringRef> AccessibilityUIElement::selectTextWithCriteria(JSContextRef context, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)453 {454 return nullptr;455 }456 457 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfColumnHeaders()458 {459 return JSStringCreateWithCharacters(0, 0);460 }461 462 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfRowHeaders()463 {464 return JSStringCreateWithCharacters(0, 0);465 }466 467 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfColumns()468 {469 return JSStringCreateWithCharacters(0, 0);470 }471 472 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfRows()473 {474 return JSStringCreateWithCharacters(0, 0);475 }476 477 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfVisibleCells()478 {479 return JSStringCreateWithCharacters(0, 0);480 }481 482 JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfHeader()483 {484 return JSStringCreateWithCharacters(0, 0);485 }486 487 int AccessibilityUIElement::rowCount()488 {489 return 0;490 }491 492 int AccessibilityUIElement::columnCount()493 {494 return 0;495 }496 497 int AccessibilityUIElement::indexInTable()498 {499 return -1;500 }501 502 JSRetainPtr<JSStringRef> AccessibilityUIElement::rowIndexRange()503 {504 return JSStringCreateWithCharacters(0, 0);505 }506 507 JSRetainPtr<JSStringRef> AccessibilityUIElement::columnIndexRange()508 {509 return JSStringCreateWithCharacters(0, 0);510 }511 512 RefPtr<AccessibilityUIElement> AccessibilityUIElement::cellForColumnAndRow(unsigned col, unsigned row)513 {514 return nullptr;515 }516 517 RefPtr<AccessibilityUIElement> AccessibilityUIElement::horizontalScrollbar() const518 {519 return nullptr;520 }521 522 RefPtr<AccessibilityUIElement> AccessibilityUIElement::verticalScrollbar() const523 {524 return nullptr;525 }526 527 JSRetainPtr<JSStringRef> AccessibilityUIElement::selectedTextRange()528 {529 return JSStringCreateWithCharacters(0, 0);530 }531 532 bool AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)533 {534 return false;535 }536 537 void AccessibilityUIElement::increment()538 {539 }540 541 void AccessibilityUIElement::decrement()542 {543 }544 545 void AccessibilityUIElement::showMenu()546 {547 }548 549 void AccessibilityUIElement::press()550 {551 }552 553 void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement* element) const554 {555 }556 557 void AccessibilityUIElement::setSelectedChildAtIndex(unsigned index) const558 {559 }560 561 void AccessibilityUIElement::removeSelectionAtIndex(unsigned index) const562 {563 }564 565 void AccessibilityUIElement::clearSelectedChildren() const566 {567 }568 569 JSRetainPtr<JSStringRef> AccessibilityUIElement::accessibilityValue() const570 {571 return JSStringCreateWithCharacters(0, 0);572 }573 574 JSRetainPtr<JSStringRef> AccessibilityUIElement::documentEncoding()575 {576 return JSStringCreateWithCharacters(0, 0);577 }578 579 JSRetainPtr<JSStringRef> AccessibilityUIElement::documentURI()580 {581 return JSStringCreateWithCharacters(0, 0);582 }583 584 JSRetainPtr<JSStringRef> AccessibilityUIElement::url()585 {586 return JSStringCreateWithCharacters(0, 0);587 }588 589 bool AccessibilityUIElement::addNotificationListener(JSValueRef functionCallback)590 {591 return false;592 }593 594 bool AccessibilityUIElement::removeNotificationListener()595 {596 return true;597 }598 599 bool AccessibilityUIElement::isFocusable() const600 {601 return false;602 }603 604 bool AccessibilityUIElement::isSelectable() const605 {606 return false;607 }608 609 bool AccessibilityUIElement::isMultiSelectable() const610 {611 return false;612 }613 614 bool AccessibilityUIElement::isVisible() const615 {616 return false;617 }618 619 bool AccessibilityUIElement::isOffScreen() const620 {621 return false;622 }623 624 bool AccessibilityUIElement::isCollapsed() const625 {626 return false;627 }628 629 bool AccessibilityUIElement::isIgnored() const630 {631 return false;632 }633 634 1120 bool AccessibilityUIElement::isSingleLine() const 635 1121 { 636 return false;1122 return checkElementState(m_element.get(), WebCore::Atspi::State::SingleLine); 637 1123 } 638 1124 639 1125 bool AccessibilityUIElement::isMultiLine() const 640 1126 { 641 return false;1127 return checkElementState(m_element.get(), WebCore::Atspi::State::MultiLine); 642 1128 } 643 1129 644 1130 bool AccessibilityUIElement::hasPopup() const 645 1131 { 646 return false;1132 return checkElementState(m_element.get(), WebCore::Atspi::State::HasPopup); 647 1133 } 648 1134 … … 781 1267 void AccessibilityUIElement::scrollToMakeVisible() 782 1268 { 1269 m_element->scrollToMakeVisible(WebCore::Atspi::ScrollType::Anywhere); 783 1270 } 784 1271 785 1272 void AccessibilityUIElement::scrollToGlobalPoint(int x, int y) 786 1273 { 1274 m_element->scrollToPoint({ x, y }, WebCore::Atspi::CoordinateType::WindowCoordinates); 787 1275 } 788 1276 … … 816 1304 } 817 1305 1306 static String stringAtOffset(WebCore::AccessibilityObjectAtspi* element, int offset, WebCore::AccessibilityObjectAtspi::TextGranularity granularity) 1307 { 1308 if (!element || !element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 1309 return { }; 1310 1311 element->updateBackingStore(); 1312 auto text = element->text(); 1313 if (offset < 0 || offset > static_cast<int>(text.length())) 1314 return { }; 1315 1316 auto bounds = element->boundaryOffset(offset, granularity); 1317 unsigned startOffset = std::max<int>(bounds.x(), 0); 1318 unsigned endOffset = std::min<int>(bounds.y(), text.length()); 1319 return makeString(text.substring(startOffset, endOffset - startOffset), ", ", startOffset, ", ", endOffset); 1320 } 1321 818 1322 JSRetainPtr<JSStringRef> AccessibilityUIElement::characterAtOffset(int offset) 819 1323 { 820 return JSStringCreateWithCharacters(0, 0); 1324 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Text)) 1325 return JSStringCreateWithCharacters(0, 0); 1326 1327 m_element->updateBackingStore(); 1328 auto text = m_element->text(); 1329 if (offset < 0 || offset > static_cast<int>(text.length())) 1330 return JSStringCreateWithCharacters(0, 0); 1331 1332 auto string = makeString(text.substring(offset, 1), ", ", offset, ", ", offset + 1); 1333 return OpaqueJSString::tryCreate(string).leakRef(); 821 1334 } 822 1335 823 1336 JSRetainPtr<JSStringRef> AccessibilityUIElement::wordAtOffset(int offset) 824 1337 { 825 return JSStringCreateWithCharacters(0, 0);1338 return OpaqueJSString::tryCreate(stringAtOffset(m_element.get(), offset, WebCore::AccessibilityObjectAtspi::TextGranularity::WordStart)).leakRef(); 826 1339 } 827 1340 828 1341 JSRetainPtr<JSStringRef> AccessibilityUIElement::lineAtOffset(int offset) 829 1342 { 830 return JSStringCreateWithCharacters(0, 0);1343 return OpaqueJSString::tryCreate(stringAtOffset(m_element.get(), offset, WebCore::AccessibilityObjectAtspi::TextGranularity::LineStart)).leakRef(); 831 1344 } 832 1345 833 1346 JSRetainPtr<JSStringRef> AccessibilityUIElement::sentenceAtOffset(int offset) 834 1347 { 835 return JSStringCreateWithCharacters(0, 0);1348 return OpaqueJSString::tryCreate(stringAtOffset(m_element.get(), offset, WebCore::AccessibilityObjectAtspi::TextGranularity::SentenceStart)).leakRef(); 836 1349 } 837 1350 -
trunk/Tools/WebKitTestRunner/gtk/main.cpp
r283876 r285996 34 34 { 35 35 g_setenv("WEBKIT_DISABLE_MEMORY_PRESSURE_MONITOR", "1", FALSE); 36 g_setenv("WEBKIT_A11Y_BUS_ADDRESS", "", FALSE); 36 37 37 38 gtk_init(&argc, &argv);
Note:
See TracChangeset
for help on using the changeset viewer.