Changeset 210265 in webkit
- Timestamp:
- Jan 3, 2017 7:07:03 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r210261 r210265 1 2017-01-03 Nan Wang <n_wang@apple.com> 2 3 AX: Focus should jump into modal dialogs when one appears 4 https://bugs.webkit.org/show_bug.cgi?id=166670 5 6 Reviewed by Chris Fleizach. 7 8 * accessibility/mac/aria-modal-auto-focus-expected.txt: Added. 9 * accessibility/mac/aria-modal-auto-focus.html: Added. 10 1 11 2017-01-03 Brian Burg <bburg@apple.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r210258 r210265 1 2017-01-03 Nan Wang <n_wang@apple.com> 2 3 AX: Focus should jump into modal dialogs when one appears 4 https://bugs.webkit.org/show_bug.cgi?id=166670 5 6 Reviewed by Chris Fleizach. 7 8 Added a timer to let focus jump into a modal dialog if the web 9 author didn't handle the focus movement. 10 11 Test: accessibility/mac/aria-modal-auto-focus.html 12 13 * accessibility/AXObjectCache.cpp: 14 (WebCore::AXObjectCache::AXObjectCache): 15 (WebCore::AXObjectCache::~AXObjectCache): 16 (WebCore::firstFocusableChild): 17 (WebCore::AXObjectCache::focusAriaModalNode): 18 (WebCore::AXObjectCache::focusAriaModalNodeTimerFired): 19 (WebCore::AXObjectCache::handleAriaModalChange): 20 * accessibility/AXObjectCache.h: 21 (WebCore::AXObjectCache::focusAriaModalNode): 22 1 23 2017-01-03 Andy Estes <aestes@apple.com> 2 24 -
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r209926 r210265 113 113 static double AccessibilityPasswordValueChangeNotificationInterval = 0.025; 114 114 static double AccessibilityLiveRegionChangedNotificationInterval = 0.020; 115 static double AccessibilityFocusAriaModalNodeNotificationInterval = 0.050; 115 116 116 117 AccessibilityObjectInclusion AXComputedObjectAttributeCache::getIgnored(AXID id) const … … 188 189 , m_passwordNotificationPostTimer(*this, &AXObjectCache::passwordNotificationPostTimerFired) 189 190 , m_liveRegionChangedPostTimer(*this, &AXObjectCache::liveRegionChangedNotificationPostTimerFired) 191 , m_focusAriaModalNodeTimer(*this, &AXObjectCache::focusAriaModalNodeTimerFired) 190 192 , m_currentAriaModalNode(nullptr) 191 193 { … … 197 199 m_notificationPostTimer.stop(); 198 200 m_liveRegionChangedPostTimer.stop(); 201 m_focusAriaModalNodeTimer.stop(); 199 202 200 203 for (const auto& object : m_objects.values()) { … … 1351 1354 } 1352 1355 1356 static AccessibilityObject* firstFocusableChild(AccessibilityObject* obj) 1357 { 1358 if (!obj) 1359 return nullptr; 1360 1361 for (auto* child = obj->firstChild(); child; child = child->nextSibling()) { 1362 if (child->canSetFocusAttribute()) 1363 return child; 1364 if (AccessibilityObject* focusable = firstFocusableChild(child)) 1365 return focusable; 1366 } 1367 return nullptr; 1368 } 1369 1370 void AXObjectCache::focusAriaModalNode() 1371 { 1372 if (m_focusAriaModalNodeTimer.isActive()) 1373 m_focusAriaModalNodeTimer.stop(); 1374 1375 m_focusAriaModalNodeTimer.startOneShot(AccessibilityFocusAriaModalNodeNotificationInterval); 1376 } 1377 1378 void AXObjectCache::focusAriaModalNodeTimerFired() 1379 { 1380 if (!m_currentAriaModalNode) 1381 return; 1382 1383 // Don't set focus if we are already focusing onto some element within 1384 // the dialog. 1385 if (m_currentAriaModalNode->contains(document().focusedElement())) 1386 return; 1387 1388 if (AccessibilityObject* currentAriaModalNodeObject = getOrCreate(m_currentAriaModalNode)) { 1389 if (AccessibilityObject* focusable = firstFocusableChild(currentAriaModalNodeObject)) 1390 focusable->setFocused(true); 1391 } 1392 } 1393 1353 1394 void AXObjectCache::handleScrollbarUpdate(ScrollView* view) 1354 1395 { … … 1440 1481 updateCurrentAriaModalNode(); 1441 1482 } 1483 if (m_currentAriaModalNode) 1484 focusAriaModalNode(); 1485 1442 1486 startCachingComputedObjectAttributesUntilTreeMutates(); 1443 1487 } -
trunk/Source/WebCore/accessibility/AXObjectCache.h
r209926 r210265 303 303 void postTextStateChangeNotification(const Position&, const AXTextStateChangeIntent&, const VisibleSelection&); 304 304 void postLiveRegionChangeNotification(AccessibilityObject*); 305 void focusAriaModalNode(); 305 306 306 307 enum AXLoadingEvent { … … 383 384 384 385 void liveRegionChangedNotificationPostTimerFired(); 386 387 void focusAriaModalNodeTimerFired(); 385 388 386 389 void postTextStateChangeNotification(AccessibilityObject*, const AXTextStateChangeIntent&, const VisibleSelection&); … … 420 423 ListHashSet<RefPtr<AccessibilityObject>> m_liveRegionObjectsSet; 421 424 425 Timer m_focusAriaModalNodeTimer; 422 426 Node* m_currentAriaModalNode; 423 427 ListHashSet<Node*> m_ariaModalNodesSet; … … 496 500 inline void AXObjectCache::postPlatformNotification(AccessibilityObject*, AXNotification) { } 497 501 inline void AXObjectCache::postLiveRegionChangeNotification(AccessibilityObject*) { } 502 inline void AXObjectCache::focusAriaModalNode() { } 498 503 inline RefPtr<Range> AXObjectCache::rangeForNodeContents(Node*) { return nullptr; } 499 504 inline void AXObjectCache::remove(AXID) { }
Note: See TracChangeset
for help on using the changeset viewer.