⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 252417 in webkit


Ignore:
Timestamp:
Nov 13, 2019, 11:00:20 AM (7 years ago)
Author:
Andres Gonzalez
Message:

AXObjectCache::rootObject should generate the isolated tree.
https://bugs.webkit.org/show_bug.cgi?id=204131

Reviewed by Chris Fleizach.

Source/WebCore:

No new tests, no change in functionality.

AXObjectCache::rootObject now returns an AccessibilityObject or an
IsolatedObject. This makes it possible for client code to use the
isolated tree seamlessly, as long as the client call happens on a
secondary thread. This allows WKTR AccessibilityController to use the
isolated tree in LayoutTests.

  • accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::clientSupportsIsolatedTree):
(WebCore::AXObjectCache::rootObject):
(WebCore::AXObjectCache::createIsolatedTreeHierarchy):
(WebCore::AXObjectCache::generateIsolatedTree):
(WebCore::AXObjectCache::rootWebArea):
(WebCore::AXObjectCache::createIsolatedAccessibilityTreeHierarchy): Renamed.
(WebCore::AXObjectCache::generateIsolatedAccessibilityTree): renamed.

  • accessibility/AXObjectCache.h:

Source/WebKit:

  • WebProcess/WebPage/mac/WKAccessibilityWebPageObjectBase.h:
  • WebProcess/WebPage/mac/WKAccessibilityWebPageObjectBase.mm:

(-[WKAccessibilityWebPageObjectBase accessibilityRootObjectWrapper]):
(-[WKAccessibilityWebPageObjectBase clientSupportsIsolatedTree]): Became a member of AXObjectCache.
(-[WKAccessibilityWebPageObjectBase isolatedTreeRootObject]): Deleted.

  • WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:

(-[WKAccessibilityWebPageObject accessibilityHitTest:]):

Location:
trunk/Source
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r252415 r252417  
     12019-11-13  Andres Gonzalez  <andresg_22@apple.com>
     2
     3        AXObjectCache::rootObject should generate the isolated tree.
     4        https://bugs.webkit.org/show_bug.cgi?id=204131
     5
     6        Reviewed by Chris Fleizach.
     7
     8        No new tests, no change in functionality.
     9
     10        AXObjectCache::rootObject now returns an AccessibilityObject or an
     11        IsolatedObject. This makes it possible for client code to use the
     12        isolated tree seamlessly, as long as the client call happens on a
     13        secondary thread. This allows WKTR AccessibilityController to use the
     14        isolated tree in LayoutTests.
     15       
     16        * accessibility/AXObjectCache.cpp:
     17        (WebCore::AXObjectCache::clientSupportsIsolatedTree):
     18        (WebCore::AXObjectCache::rootObject):
     19        (WebCore::AXObjectCache::createIsolatedTreeHierarchy):
     20        (WebCore::AXObjectCache::generateIsolatedTree):
     21        (WebCore::AXObjectCache::rootWebArea):
     22        (WebCore::AXObjectCache::createIsolatedAccessibilityTreeHierarchy): Renamed.
     23        (WebCore::AXObjectCache::generateIsolatedAccessibilityTree): renamed.
     24        * accessibility/AXObjectCache.h:
     25
    1262019-11-13  Zalan Bujtas  <zalan@apple.com>
    227
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r252182 r252417  
    102102#include "TextControlInnerElements.h"
    103103#include "TextIterator.h"
     104
     105#if ENABLE(ACCESSIBILITY_ISOLATED_TREE) && PLATFORM(MAC)
     106#include <pal/spi/mac/HIServicesSPI.h>
     107#endif
     108
    104109#include <wtf/DataLog.h>
    105110#include <wtf/SetForScope.h>
     
    124129static const Seconds accessibilityLiveRegionChangedNotificationInterval { 20_ms };
    125130static const Seconds accessibilityFocusModalNodeNotificationInterval { 50_ms };
    126    
     131
    127132static bool rendererNeedsDeferredUpdate(const RenderObject& renderer)
    128133{
     
    649654    return newObj.get();
    650655}
    651    
    652 AccessibilityObject* AXObjectCache::rootObject()
     656
     657#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
     658bool AXObjectCache::clientSupportsIsolatedTree()
     659{
     660    AXClientType type = _AXGetClientForCurrentRequestUntrusted();
     661    // FIXME: Remove unknown client before enabling ACCESSIBILITY_ISOLATED_TREE.
     662    return type == kAXClientTypeVoiceOver
     663        || type == kAXClientTypeUnknown
     664        || type == kAXClientTypeNoActiveRequestFound; // For LayoutTests.
     665}
     666#endif
     667
     668AXCoreObject* AXObjectCache::rootObject()
    653669{
    654670    if (!gAccessibilityEnabled)
    655671        return nullptr;
    656672
     673#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
     674    if (clientSupportsIsolatedTree())
     675        return isolatedTreeRootObject();
     676#endif
     677
    657678    return getOrCreate(m_document.view());
    658679}
     680
     681#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
     682AXCoreObject* AXObjectCache::isolatedTreeRootObject()
     683{
     684    auto pageID = m_document.pageID();
     685    if (!pageID)
     686        return nullptr;
     687
     688    auto tree = AXIsolatedTree::treeForPageID(*pageID);
     689    if (!tree && isMainThread()) {
     690        tree = generateIsolatedTree(*pageID);
     691        // Now that we have created our tree, initialize the secondary thread,
     692        // so future requests come in on the other thread.
     693        _AXUIElementUseSecondaryAXThread(true);
     694        return tree->rootNode().get();
     695    }
     696
     697    if (tree && !isMainThread()) {
     698        tree->applyPendingChanges();
     699        return tree->rootNode().get();
     700    }
     701
     702    // Should not get here, couldn't create or update the IsolatedTree.
     703    ASSERT(false);
     704    return nullptr;
     705}
     706#endif
    659707
    660708AccessibilityObject* AXObjectCache::rootObjectForFrame(Frame* frame)
     
    29442992   
    29452993#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
    2946 Ref<AXIsolatedObject> AXObjectCache::createIsolatedAccessibilityTreeHierarchy(AXCoreObject& object, AXID parentID, AXIsolatedTree& tree, Vector<Ref<AXIsolatedObject>>& nodeChanges)
     2994Ref<AXIsolatedObject> AXObjectCache::createIsolatedTreeHierarchy(AXCoreObject& object, AXID parentID, AXIsolatedTree& tree, Vector<Ref<AXIsolatedObject>>& nodeChanges)
    29472995{
    29482996    auto isolatedTreeNode = AXIsolatedObject::create(object);
     
    29543002
    29553003    for (const auto& child : object.children()) {
    2956         auto staticChild = createIsolatedAccessibilityTreeHierarchy(*child, isolatedTreeNode->objectID(), tree, nodeChanges);
     3004        auto staticChild = createIsolatedTreeHierarchy(*child, isolatedTreeNode->objectID(), tree, nodeChanges);
    29573005        isolatedTreeNode->appendChild(staticChild->objectID());
    29583006    }
     
    29613009}
    29623010   
    2963 Ref<AXIsolatedTree> AXObjectCache::generateIsolatedAccessibilityTree()
     3011Ref<AXIsolatedTree> AXObjectCache::generateIsolatedTree(PageIdentifier pageID)
    29643012{
    29653013    RELEASE_ASSERT(isMainThread());
    29663014
    2967     auto tree = AXIsolatedTree::treeForPageID(*m_document.pageID());
     3015    auto tree = AXIsolatedTree::treeForPageID(pageID);
    29683016    if (!tree)
    2969         tree = AXIsolatedTree::createTreeForPageID(*m_document.pageID());
     3017        tree = AXIsolatedTree::createTreeForPageID(pageID);
    29703018   
    29713019    Vector<Ref<AXIsolatedObject>> nodeChanges;
    2972     auto root = createIsolatedAccessibilityTreeHierarchy(*rootObject(), InvalidAXID, *tree, nodeChanges);
    2973     tree->setRoot(root);
     3020    AccessibilityObject* axRoot = getOrCreate(m_document.view());
     3021    auto isolatedRoot = createIsolatedTreeHierarchy(*axRoot, InvalidAXID, *tree, nodeChanges);
     3022    tree->setRoot(isolatedRoot);
    29743023    tree->appendNodeChanges(nodeChanges);
    29753024
     
    30653114AccessibilityObject* AXObjectCache::rootWebArea()
    30663115{
    3067     AccessibilityObject* rootObject = this->rootObject();
     3116    AXCoreObject* rootObject = this->rootObject();
    30683117    if (!rootObject || !rootObject->isAccessibilityScrollView())
    30693118        return nullptr;
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r252399 r252417  
    152152
    153153    // Returns the root object for the entire document.
    154     WEBCORE_EXPORT AccessibilityObject* rootObject();
     154    WEBCORE_EXPORT AXCoreObject* rootObject();
    155155    // Returns the root object for a specific frame.
    156156    WEBCORE_EXPORT AccessibilityObject* rootObjectForFrame(Frame*);
     
    193193
    194194#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
    195     WEBCORE_EXPORT Ref<AXIsolatedTree> generateIsolatedAccessibilityTree();
    196 
    197     Ref<AXIsolatedObject> createIsolatedAccessibilityTreeHierarchy(AXCoreObject&, AXID, AXIsolatedTree&, Vector<Ref<AXIsolatedObject>>&);
    198 #endif
    199    
     195    WEBCORE_EXPORT static bool clientSupportsIsolatedTree();
     196private:
     197    AXCoreObject* isolatedTreeRootObject();
     198    Ref<AXIsolatedTree> generateIsolatedTree(PageIdentifier);
     199    Ref<AXIsolatedObject> createIsolatedTreeHierarchy(AXCoreObject&, AXID, AXIsolatedTree&, Vector<Ref<AXIsolatedObject>>&);
     200#endif
     201
     202public:
    200203#if ENABLE(ACCESSIBILITY)
    201204    WEBCORE_EXPORT static void enableAccessibility();
  • trunk/Source/WebKit/ChangeLog

    r252412 r252417  
     12019-11-13  Andres Gonzalez  <andresg_22@apple.com>
     2
     3        AXObjectCache::rootObject should generate the isolated tree.
     4        https://bugs.webkit.org/show_bug.cgi?id=204131
     5
     6        Reviewed by Chris Fleizach.
     7
     8        * WebProcess/WebPage/mac/WKAccessibilityWebPageObjectBase.h:
     9        * WebProcess/WebPage/mac/WKAccessibilityWebPageObjectBase.mm:
     10        (-[WKAccessibilityWebPageObjectBase accessibilityRootObjectWrapper]):
     11        (-[WKAccessibilityWebPageObjectBase clientSupportsIsolatedTree]): Became a member of AXObjectCache.
     12        (-[WKAccessibilityWebPageObjectBase isolatedTreeRootObject]): Deleted.
     13        * WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:
     14        (-[WKAccessibilityWebPageObject accessibilityHitTest:]):
     15
    1162019-11-13  Youenn Fablet  <youenn@apple.com>
    217
  • trunk/Source/WebKit/WebProcess/WebPage/atk/WebKitWebPageAccessibilityObject.cpp

    r247367 r252417  
    5454}
    5555
    56 static AccessibilityObjectWrapper* rootWebAreaWrapper(AccessibilityObject& rootObject)
     56static AccessibilityObjectWrapper* rootWebAreaWrapper(AXCoreObject& rootObject)
    5757{
    5858    if (!rootObject.isAccessibilityScrollView())
     
    8686        return nullptr;
    8787
    88     AccessibilityObject* coreRootObject = cache->rootObject();
     88    AXCoreObject* coreRootObject = cache->rootObject();
    8989    if (!coreRootObject)
    9090        return nullptr;
  • trunk/Source/WebKit/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectBase.h

    r245796 r252417  
    4747- (id)accessibilityFocusedUIElement;
    4848
    49 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
    50 - (BOOL)clientSupportsIsolatedTree;
    51 #endif
    52 
    5349@end
    5450
  • trunk/Source/WebKit/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectBase.mm

    r251179 r252417  
    2727#import "WKAccessibilityWebPageObjectBase.h"
    2828
    29 #import "ApplicationServicesSPI.h"
    3029#import "WebFrame.h"
    3130#import "WebPage.h"
     
    3635#import "WKString.h"
    3736#import "WKStringCF.h"
    38 #import <WebCore/AXIsolatedTree.h>
    3937#import <WebCore/AXObjectCache.h>
    4038#import <WebCore/Document.h>
     
    8684}
    8785
    88 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
    89 - (BOOL)clientSupportsIsolatedTree
    90 {
    91     AXClientType type = _AXGetClientForCurrentRequestUntrusted();
    92     // FIXME: Remove unknown client before enabling ACCESSIBILITY_ISOLATED_TREE.
    93     return type == kAXClientTypeVoiceOver || type == kAXClientTypeUnknown;
    94 }
    95 
    96 - (id)isolatedTreeRootObject
    97 {
    98     if (isMainThread()) {
    99         if (auto cache = [self axObjectCache]) {
    100             auto tree = cache->generateIsolatedAccessibilityTree();
    101 
    102             // Now that we have created our tree, initialize the secondary thread,
    103             // so future requests come in on the other thread.
    104             _AXUIElementUseSecondaryAXThread(true);
    105             if (auto rootNode = tree->rootNode())
    106                 return rootNode->wrapper();
    107         }
    108     } else {
    109         auto tree = WebCore::AXIsolatedTree::treeForPageID(m_pageID);
    110         tree->applyPendingChanges();
    111         if (auto rootNode = tree->rootNode())
    112             return rootNode->wrapper();
    113     }
    114 
    115     return nil;
    116 }
    117 #endif
    118 
    11986- (id)accessibilityRootObjectWrapper
    12087{
     
    12592        return self.accessibilityPluginObject;
    12693
    127 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
    128     // If VoiceOver is on, ensure subsequent requests are now handled on the secondary AX thread.
    129     bool clientSupportsIsolatedTree = [self clientSupportsIsolatedTree];
    130     if (clientSupportsIsolatedTree)
    131         return [self isolatedTreeRootObject];
    132 #endif
    133 
    13494    if (auto cache = [self axObjectCache]) {
    135         if (WebCore::AccessibilityObject* root = cache->rootObject())
     95        if (WebCore::AXCoreObject* root = cache->rootObject())
    13696            return root->wrapper();
    13797    }
  • trunk/Source/WebKit/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm

    r252175 r252417  
    2929#if PLATFORM(MAC)
    3030
     31#import "ApplicationServicesSPI.h"
    3132#import "PluginView.h"
    3233#import "WebFrame.h"
     
    254255        // Isolated tree frames have the offset encoded into them so we don't need to undo here.
    255256#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
    256         bool queryingIsolatedTree = [self clientSupportsIsolatedTree] && _AXUIElementRequestServicedBySecondaryAXThread();
     257        bool queryingIsolatedTree = WebCore::AXObjectCache::clientSupportsIsolatedTree() && _AXUIElementRequestServicedBySecondaryAXThread();
    257258        applyContentOffset = !queryingIsolatedTree;
    258259#endif
  • trunk/Source/WebKitLegacy/win/AccessibleDocument.cpp

    r176892 r252417  
    3535// AccessibleDocument
    3636AccessibleDocument::AccessibleDocument(Document* doc, HWND window)
    37     : AccessibleBase(doc->axObjectCache()->rootObject(), window)
     37    : AccessibleBase(static_cast<AccessibilityObject*>(doc->axObjectCache()->rootObject()), window)
    3838{
    3939}
Note: See TracChangeset for help on using the changeset viewer.