Changeset 270609 in webkit
- Timestamp:
- Dec 9, 2020, 4:35:27 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 11 edited
-
ChangeLog (modified) (1 diff)
-
accessibility/AccessibilityObject.cpp (modified) (1 diff)
-
accessibility/AccessibilityObject.h (modified) (1 diff)
-
accessibility/AccessibilityRenderObject.cpp (modified) (3 diffs)
-
accessibility/AccessibilityScrollView.cpp (modified) (1 diff)
-
accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (modified) (1 diff)
-
accessibility/isolatedtree/AXIsolatedObject.cpp (modified) (3 diffs)
-
accessibility/isolatedtree/AXIsolatedTree.cpp (modified) (2 diffs)
-
accessibility/mac/WebAccessibilityObjectWrapperBase.h (modified) (1 diff)
-
accessibility/mac/WebAccessibilityObjectWrapperBase.mm (modified) (2 diffs)
-
accessibility/mac/WebAccessibilityObjectWrapperMac.mm (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r270605 r270609 1 2020-12-09 Andres Gonzalez <andresg_22@apple.com> 2 3 Fix for focus tracking in isolated tree mode. 4 https://bugs.webkit.org/show_bug.cgi?id=219662 5 6 Reviewed by Chris Fleizach. 7 8 Covered by existing tests. 9 10 - AXIsolatedTree::setFocusedNodeID and applyPendingChanges now properly 11 handle the focused node ID update when the focused object changes. 12 - AccessibilityObject::setFocused sets focus and activates the 13 corresponding view. This was done in the wrapper baseAccessibilitySetFocus 14 method, but this is a more appropriate place for this core functionality. 15 - Some code cleanup, ASSERT checks of appropriate thread, and additional 16 logging. 17 18 * accessibility/AccessibilityObject.cpp: 19 (WebCore::AccessibilityObject::setFocused): 20 * accessibility/AccessibilityObject.h: 21 * accessibility/AccessibilityRenderObject.cpp: 22 (WebCore::AccessibilityRenderObject::setFocused): 23 * accessibility/AccessibilityScrollView.cpp: 24 (WebCore::AccessibilityScrollView::setFocused): 25 * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm: 26 (-[WebAccessibilityObjectWrapper _accessibilitySetFocus:]): 27 * accessibility/isolatedtree/AXIsolatedObject.cpp: 28 (WebCore::AXIsolatedObject::page const): 29 (WebCore::AXIsolatedObject::document const): 30 (WebCore::AXIsolatedObject::documentFrameView const): 31 * accessibility/isolatedtree/AXIsolatedTree.cpp: 32 (WebCore::AXIsolatedTree::setFocusedNodeID): 33 (WebCore::AXIsolatedTree::applyPendingChanges): 34 * accessibility/mac/WebAccessibilityObjectWrapperBase.h: 35 * accessibility/mac/WebAccessibilityObjectWrapperBase.mm: 36 (-[WebAccessibilityObjectWrapperBase baseAccessibilitySetFocus:]): 37 Deleted, not needed since core functionality is now in AccessibilityObject::setFocused. 38 * accessibility/mac/WebAccessibilityObjectWrapperMac.mm: 39 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]): 40 (-[WebAccessibilityObjectWrapper _accessibilitySetValue:forAttribute:]): 41 1 42 2020-12-09 Said Abou-Hallawa <said@apple.com> 2 43 -
trunk/Source/WebCore/accessibility/AccessibilityObject.cpp
r270333 r270609 2562 2562 return page && axObjectCache ? axObjectCache->focusedObjectForPage(page) : nullptr; 2563 2563 } 2564 2564 2565 void AccessibilityObject::setFocused(bool focus) 2566 { 2567 if (focus) { 2568 // Ensure that the view is focused and active, otherwise, any attempt to set focus to an object inside it will fail. 2569 auto* document = this->document(); 2570 if (!document) 2571 return; 2572 2573 auto* frame = document->frame(); 2574 if (frame && frame->selection().isFocusedAndActive()) 2575 return; // Nothing to do, already focused and active. 2576 2577 auto* page = document->page(); 2578 if (!page) 2579 return; 2580 2581 ChromeClient& chromeClient = page->chrome().client(); 2582 chromeClient.focus(); 2583 2584 #if PLATFORM(COCOA) 2585 auto* frameView = documentFrameView(); 2586 if (!frameView) 2587 return; 2588 2589 // Legacy WebKit1 case. 2590 if (frameView->platformWidget()) 2591 chromeClient.makeFirstResponder((NSResponder *)frameView->platformWidget()); 2592 else 2593 chromeClient.assistiveTechnologyMakeFirstResponder(); 2594 #endif 2595 } 2596 } 2597 2565 2598 AccessibilitySortDirection AccessibilityObject::sortDirection() const 2566 2599 { -
trunk/Source/WebCore/accessibility/AccessibilityObject.h
r270333 r270609 458 458 bool isInlineText() const override; 459 459 460 void setFocused(bool) override { } 460 // Ensures that the view is focused and active before attempting to set focus to an AccessibilityObject. 461 // Subclasses that override setFocused should call this base implementation first. 462 void setFocused(bool) override; 463 461 464 void setSelectedText(const String&) override { } 462 465 void setSelectedTextRange(const PlainTextRange&) override { } -
trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp
r269662 r270609 1850 1850 if (!canSetFocusAttribute()) 1851 1851 return; 1852 1852 1853 1853 Document* document = this->document(); 1854 1854 Node* node = this->node(); … … 1858 1858 return; 1859 1859 } 1860 1861 // Call the base class setFocused to ensure the view is focused and active. 1862 AccessibilityObject::setFocused(on); 1860 1863 1861 1864 // When a node is told to set focus, that can cause it to be deallocated, which means that doing … … 1863 1866 // long enough for duration. 1864 1867 RefPtr<AccessibilityObject> protectedThis(this); 1865 1868 1866 1869 // If this node is already the currently focused node, then calling focus() won't do anything. 1867 1870 // That is a problem when focus is removed from the webpage to chrome, and then returns. -
trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp
r258356 r270609 105 105 return webArea && webArea->isFocused(); 106 106 } 107 107 108 108 void AccessibilityScrollView::setFocused(bool focused) 109 109 { 110 // Call the base class setFocused to ensure the view is focused and active. 111 AccessibilityObject::setFocused(focused); 112 110 113 if (AccessibilityObject* webArea = webAreaObject()) 111 114 webArea->setFocused(focused); -
trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
r270333 r270609 2082 2082 - (void)_accessibilitySetFocus:(BOOL)focus 2083 2083 { 2084 [self baseAccessibilitySetFocus:focus]; 2084 if (auto* backingObject = self.axBackingObject) 2085 backingObject->setFocused(focus); 2085 2086 } 2086 2087 -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
r270393 r270609 1906 1906 Page* AXIsolatedObject::page() const 1907 1907 { 1908 if (auto* object = associatedAXObject()) 1909 return object->page(); 1908 ASSERT(isMainThread()); 1909 1910 if (auto* axObject = associatedAXObject()) 1911 return axObject->page(); 1912 1910 1913 ASSERT_NOT_REACHED(); 1911 1914 return nullptr; … … 1914 1917 Document* AXIsolatedObject::document() const 1915 1918 { 1916 if (auto* object = associatedAXObject()) 1917 return object->document(); 1919 ASSERT(isMainThread()); 1920 1921 if (auto* axObject = associatedAXObject()) 1922 return axObject->document(); 1923 1918 1924 ASSERT_NOT_REACHED(); 1919 1925 return nullptr; … … 1922 1928 FrameView* AXIsolatedObject::documentFrameView() const 1923 1929 { 1924 if (auto* object = associatedAXObject()) 1925 return object->documentFrameView(); 1930 ASSERT(isMainThread()); 1931 1932 if (auto* axObject = associatedAXObject()) 1933 return axObject->documentFrameView(); 1934 1935 ASSERT_NOT_REACHED(); 1926 1936 return nullptr; 1927 1937 } -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
r270238 r270609 389 389 AXLOG(makeString("axID ", axID)); 390 390 ASSERT(isMainThread()); 391 391 392 LockHolder locker { m_changeLogLock }; 392 393 m_pendingFocusedNodeID = axID; 394 395 AXPropertyMap propertyMap; 396 propertyMap.set(AXPropertyName::IsFocused, true); 397 m_pendingPropertyChanges.append({ axID, propertyMap }); 393 398 } 394 399 … … 437 442 LockHolder locker { m_changeLogLock }; 438 443 439 AXLOG(makeString("focusedNodeID ", m_focusedNodeID, " pendingFocusedNodeID ", m_pendingFocusedNodeID)); 440 m_focusedNodeID = m_pendingFocusedNodeID; 444 if (m_pendingFocusedNodeID != m_focusedNodeID) { 445 AXLOG(makeString("focusedNodeID ", m_focusedNodeID, " pendingFocusedNodeID ", m_pendingFocusedNodeID)); 446 447 if (m_focusedNodeID != InvalidAXID) { 448 // Set the old focused object's IsFocused property to false. 449 AXPropertyMap propertyMap; 450 propertyMap.set(AXPropertyName::IsFocused, false); 451 m_pendingPropertyChanges.append({ m_focusedNodeID, propertyMap }); 452 } 453 m_focusedNodeID = m_pendingFocusedNodeID; 454 } 441 455 442 456 while (m_pendingNodeRemovals.size()) { -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h
r265311 r270609 75 75 - (NSArray<NSString *> *)baseAccessibilitySpeechHint; 76 76 77 - (void)baseAccessibilitySetFocus:(BOOL)focus;78 77 - (NSString *)ariaLandmarkRoleDescription; 79 78 -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm
r270069 r270609 44 44 #import "AccessibilityTableColumn.h" 45 45 #import "AccessibilityTableRow.h" 46 #import "Chrome.h"47 #import "ChromeClient.h"48 46 #import "ColorMac.h" 49 47 #import "ContextMenuController.h" … … 468 466 { 469 467 return self.axBackingObject->ariaLandmarkRoleDescription(); 470 }471 472 - (void)baseAccessibilitySetFocus:(BOOL)focus473 {474 // If focus is just set without making the view the first responder, then keyboard focus won't move to the right place.475 if (focus && !self.axBackingObject->document()->frame()->selection().isFocusedAndActive()) {476 FrameView* frameView = self.axBackingObject->documentFrameView();477 Page* page = self.axBackingObject->page();478 if (page && frameView) {479 ChromeClient& chromeClient = page->chrome().client();480 chromeClient.focus();481 482 // Legacy WebKit1 case.483 if (frameView->platformWidget())484 chromeClient.makeFirstResponder(frameView->platformWidget());485 else486 chromeClient.assistiveTechnologyMakeFirstResponder();487 }488 }489 490 self.axBackingObject->setFocused(focus);491 468 } 492 469 -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
r270476 r270609 2140 2140 { 2141 2141 AXTRACE(makeString("WebAccessibilityObjectWrapper accessibilityAttributeValue:", String(attributeName))); 2142 2142 2143 auto* backingObject = self.updateObjectBackingStore; 2143 if (!backingObject) 2144 if (!backingObject) { 2145 AXLOG("No backingObject!!!"); 2144 2146 return nil; 2147 } 2145 2148 2146 2149 if (backingObject->isDetachedFromParent()) { … … 3361 3364 } 3362 3365 3363 - (void)_accessibilitySetValue:(id)value forAttribute:(NSString*)attributeName 3364 { 3366 - (void)_accessibilitySetValue:(id)value forAttribute:(NSString *)attributeName 3367 { 3368 AXTRACE(makeString("WebAccessibilityObjectWrapper _accessibilitySetValue: forAttribute:", String(attributeName))); 3369 3365 3370 auto* backingObject = self.updateObjectBackingStore; 3366 if (!backingObject) 3371 if (!backingObject) { 3372 AXLOG("No backingObject!!!"); 3367 3373 return; 3374 } 3368 3375 3369 3376 AXTextMarkerRangeRef textMarkerRange = nil; … … 3393 3400 }); 3394 3401 } else if ([attributeName isEqualToString: NSAccessibilityFocusedAttribute]) { 3395 [self baseAccessibilitySetFocus:[number boolValue]];3402 backingObject->setFocused([number boolValue]); 3396 3403 } else if ([attributeName isEqualToString: NSAccessibilityValueAttribute]) { 3397 3404 if (number && backingObject->canSetNumericValue())
Note:
See TracChangeset
for help on using the changeset viewer.