Changeset 153404 in webkit


Ignore:
Timestamp:
Jul 27, 2013 4:44:27 PM (11 years ago)
Author:
Chris Fleizach
Message:

AX: VoiceOver not working with data detection page overlays
https://bugs.webkit.org/show_bug.cgi?id=118680

Reviewed by Sam Weinig.

Expose API in BundlePageOverlay so that accessibility attributes can be retrieved through the overlay.
This requires two methods in a new callback struct. One to copy the attribute names, and the other to
copy the attribute values. I've folded both parameterized and non-parameterized attribute names into one method
with a boolean to determine which one should be used. The non-parameterized attributes are not used or passed to the
overlay at this time as there are no clients with such a need.

  • WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp:

(PageOverlayClientImpl::setAccessibilityClient):
(PageOverlayClientImpl::PageOverlayClientImpl):
(PageOverlayClientImpl::copyAccessibilityAttributeValue):
(PageOverlayClientImpl::copyAccessibilityAttributeNames):
(WKBundlePageOverlaySetAccessibilityClient):

  • WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.h:
  • WebProcess/WebPage/PageOverlay.cpp:

(WebKit::PageOverlay::copyAccessibilityAttributeValue):
(WebKit::PageOverlay::copyAccessibilityAttributeNames):

  • WebProcess/WebPage/PageOverlay.h:

(WebKit::PageOverlay::Client::copyAccessibilityAttributeValue):
(WebKit::PageOverlay::Client::copyAccessibilityAttributeNames):
(WebKit::PageOverlay::client):

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::pageOverlayCopyAccessibilityAttributeValue):
(WebKit::WebPage::pageOverlayCopyAccessibilityAttributesNames):

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

(-[WKAccessibilityWebPageObject accessibilityParameterizedAttributeNames]):
(-[WKAccessibilityWebPageObject _convertScreenPointToWindow:]):
(-[WKAccessibilityWebPageObject accessibilityAttributeValue:forParameter:]):

Location:
trunk/Source/WebKit2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r153402 r153404  
     12013-07-27  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: VoiceOver not working with data detection page overlays
     4        https://bugs.webkit.org/show_bug.cgi?id=118680
     5
     6        Reviewed by Sam Weinig.
     7
     8        Expose API in BundlePageOverlay so that accessibility attributes can be retrieved through the overlay.
     9        This requires two methods in a new callback struct. One to copy the attribute names, and the other to
     10        copy the attribute values. I've folded both parameterized and non-parameterized attribute names into one method
     11        with a boolean to determine which one should be used. The non-parameterized attributes are not used or passed to the
     12        overlay at this time as there are no clients with such a need.
     13
     14        * WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp:
     15        (PageOverlayClientImpl::setAccessibilityClient):
     16        (PageOverlayClientImpl::PageOverlayClientImpl):
     17        (PageOverlayClientImpl::copyAccessibilityAttributeValue):
     18        (PageOverlayClientImpl::copyAccessibilityAttributeNames):
     19        (WKBundlePageOverlaySetAccessibilityClient):
     20        * WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.h:
     21        * WebProcess/WebPage/PageOverlay.cpp:
     22        (WebKit::PageOverlay::copyAccessibilityAttributeValue):
     23        (WebKit::PageOverlay::copyAccessibilityAttributeNames):
     24        * WebProcess/WebPage/PageOverlay.h:
     25        (WebKit::PageOverlay::Client::copyAccessibilityAttributeValue):
     26        (WebKit::PageOverlay::Client::copyAccessibilityAttributeNames):
     27        (WebKit::PageOverlay::client):
     28        * WebProcess/WebPage/WebPage.cpp:
     29        (WebKit::WebPage::pageOverlayCopyAccessibilityAttributeValue):
     30        (WebKit::WebPage::pageOverlayCopyAccessibilityAttributesNames):
     31        * WebProcess/WebPage/WebPage.h:
     32        * WebProcess/WebPage/mac/WKAccessibilityWebPageObject.mm:
     33        (-[WKAccessibilityWebPageObject accessibilityParameterizedAttributeNames]):
     34        (-[WKAccessibilityWebPageObject _convertScreenPointToWindow:]):
     35        (-[WKAccessibilityWebPageObject accessibilityAttributeValue:forParameter:]):
     36
    1372013-07-27  Simon Fraser  <simon.fraser@apple.com>
    238
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp

    r152795 r153404  
    4343    }
    4444
     45    virtual void setAccessibilityClient(WKBundlePageOverlayAccessibilityClient* client)
     46    {
     47        if (client)
     48            m_accessibilityClient = *client;
     49    }
     50
    4551private:
    4652    explicit PageOverlayClientImpl(WKBundlePageOverlayClient* client)
    4753        : m_client()
     54        , m_accessibilityClient()
    4855    {
    4956        if (client)
     
    116123    }
    117124   
     125    virtual WKTypeRef copyAccessibilityAttributeValue(PageOverlay* pageOverlay, WKStringRef attribute, WKTypeRef parameter)
     126    {
     127        if (!m_accessibilityClient.copyAccessibilityAttributeValue)
     128            return 0;
     129        return m_accessibilityClient.copyAccessibilityAttributeValue(toAPI(pageOverlay), attribute, parameter, m_client.clientInfo);
     130    }
     131
     132    virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay* pageOverlay, bool paramerizedNames)
     133    {
     134        if (!m_accessibilityClient.copyAccessibilityAttributeNames)
     135            return 0;
     136        return m_accessibilityClient.copyAccessibilityAttributeNames(toAPI(pageOverlay), paramerizedNames, m_client.clientInfo);
     137    }
     138   
    118139    WKBundlePageOverlayClient m_client;
     140    WKBundlePageOverlayAccessibilityClient m_accessibilityClient;
    119141};
    120142
     
    134156}
    135157
     158void WKBundlePageOverlaySetAccessibilityClient(WKBundlePageOverlayRef bundlePageOverlayRef, WKBundlePageOverlayAccessibilityClient* client)
     159{
     160    if (client && client->version)
     161        return;
     162    static_cast<PageOverlayClientImpl*>(toImpl(bundlePageOverlayRef)->client())->setAccessibilityClient(client);
     163}
     164
    136165void WKBundlePageOverlaySetNeedsDisplay(WKBundlePageOverlayRef bundlePageOverlayRef, WKRect rect)
    137166{
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.h

    r152795 r153404  
    6363typedef struct WKBundlePageOverlayClient WKBundlePageOverlayClient;
    6464
    65 enum { kWKBundlePageOverlayClientCurrentVersion = 0 };
     65enum { kWKBundlePageOverlayClientCurrentVersion = 0 };   
     66   
     67typedef WKTypeRef (*WKAccessibilityAttributeValueCallback)(WKBundlePageOverlayRef pageOverlay, WKStringRef attribute, WKTypeRef parameter, const void* clientInfo);
     68typedef WKArrayRef (*WKAccessibilityAttributeNamesCallback)(WKBundlePageOverlayRef pageOverlay, bool parameterizedNames, const void* clientInfo);
     69   
     70struct WKBundlePageOverlayAccessibilityClient {
     71    int                                                                 version;
     72    const void *                                                        clientInfo;
     73    WKAccessibilityAttributeValueCallback                               copyAccessibilityAttributeValue;
     74    WKAccessibilityAttributeNamesCallback                               copyAccessibilityAttributeNames;
     75};
     76typedef struct WKBundlePageOverlayAccessibilityClient WKBundlePageOverlayAccessibilityClient;
     77   
     78enum { kWKBundlePageOverlayAccessibilityClientCurrentVersion = 0 };
    6679   
    6780WK_EXPORT WKTypeID WKBundlePageOverlayGetTypeID();
     
    7083WK_EXPORT void WKBundlePageOverlaySetNeedsDisplay(WKBundlePageOverlayRef bundlePageOverlay, WKRect rect);
    7184WK_EXPORT float WKBundlePageOverlayFractionFadedIn(WKBundlePageOverlayRef bundlePageOverlay);
     85WK_EXPORT void WKBundlePageOverlaySetAccessibilityClient(WKBundlePageOverlayRef bundlePageOverlay, WKBundlePageOverlayAccessibilityClient* client);
    7286
    7387#ifdef __cplusplus
  • trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp

    r152795 r153404  
    131131}
    132132
     133WKTypeRef PageOverlay::copyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter)
     134{
     135    return m_client->copyAccessibilityAttributeValue(this, attribute, parameter);
     136}
     137
     138WKArrayRef PageOverlay::copyAccessibilityAttributeNames(bool parameterizedNames)
     139{
     140    return m_client->copyAccessibilityAttributeNames(this, parameterizedNames);
     141}
     142
    133143void PageOverlay::startFadeInAnimation()
    134144{
  • trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h

    r152795 r153404  
    2828
    2929#include "APIObject.h"
     30#include "WKBase.h"
    3031#include <WebCore/RunLoop.h>
    3132#include <wtf/PassRefPtr.h>
     
    3334namespace WebCore {
    3435    class GraphicsContext;
     36    class IntPoint;
    3537    class IntRect;
    3638}
     
    5355        virtual void drawRect(PageOverlay*, WebCore::GraphicsContext&, const WebCore::IntRect& dirtyRect) = 0;
    5456        virtual bool mouseEvent(PageOverlay*, const WebMouseEvent&) = 0;
     57
     58        virtual WKTypeRef copyAccessibilityAttributeValue(PageOverlay*, WKStringRef attribute, WKTypeRef parameter) { return 0; }
     59        virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay*, bool parameterizedNames) { return 0; }
    5560    };
    5661
     
    6570    bool mouseEvent(const WebMouseEvent&);
    6671
     72    WKTypeRef copyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter);
     73    WKArrayRef copyAccessibilityAttributeNames(bool parameterizedNames);
     74   
    6775    void startFadeInAnimation();
    6876    void startFadeOutAnimation();
     
    7078
    7179    float fractionFadedIn() const { return m_fractionFadedIn; }
    72 
     80    Client* client() const { return m_client; }
     81   
    7382protected:
    7483    explicit PageOverlay(Client*);
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r153378 r153404  
    18381838}
    18391839#endif
     1840   
     1841WKTypeRef WebPage::pageOverlayCopyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter)
     1842{
     1843    if (!m_pageOverlays.size())
     1844        return 0;
     1845    PageOverlayList::reverse_iterator end = m_pageOverlays.rend();
     1846    for (PageOverlayList::reverse_iterator it = m_pageOverlays.rbegin(); it != end; ++it) {
     1847        WKTypeRef value = (*it)->copyAccessibilityAttributeValue(attribute, parameter);
     1848        if (value)
     1849            return value;
     1850    }
     1851    return 0;
     1852}
     1853
     1854WKArrayRef WebPage::pageOverlayCopyAccessibilityAttributesNames(bool parameterizedNames)
     1855{
     1856    if (!m_pageOverlays.size())
     1857        return 0;
     1858    PageOverlayList::reverse_iterator end = m_pageOverlays.rend();
     1859    for (PageOverlayList::reverse_iterator it = m_pageOverlays.rbegin(); it != end; ++it) {
     1860        WKArrayRef value = (*it)->copyAccessibilityAttributeNames(parameterizedNames);
     1861        if (value)
     1862            return value;
     1863    }
     1864    return 0;
     1865}
    18401866
    18411867void WebPage::validateCommand(const String& commandName, uint64_t callbackID)
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r153378 r153404  
    663663    void setScrollPinningBehavior(uint32_t /* WebCore::ScrollPinningBehavior */ pinning);
    664664
     665    WKTypeRef pageOverlayCopyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter);
     666    WKArrayRef pageOverlayCopyAccessibilityAttributesNames(bool parameterizedNames);
     667   
    665668private:
    666669    WebPage(uint64_t pageID, const WebPageCreationParameters&);
  • trunk/Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObject.mm

    r152795 r153404  
    2929#import "WebFrame.h"
    3030#import "WebPage.h"
     31#import "WKArray.h"
     32#import "WKNumber.h"
     33#import "WKRetainPtr.h"
     34#import "WKSharedAPICast.h"
     35#import "WKString.h"
     36#import "WKStringCF.h"
    3137#import <WebCore/AXObjectCache.h>
    3238#import <WebCore/Frame.h>
     
    102108
    103109    return m_attributeNames;
     110}
     111
     112- (NSArray *)accessibilityParameterizedAttributeNames
     113{
     114    WKRetainPtr<WKArrayRef> result = adoptWK(m_page->pageOverlayCopyAccessibilityAttributesNames(true));
     115    if (!result)
     116        return nil;
     117   
     118    NSMutableArray *names = [NSMutableArray array];
     119    size_t count = WKArrayGetSize(result.get());
     120    for (size_t k = 0; k < count; k++) {
     121        WKTypeRef item = WKArrayGetItemAtIndex(result.get(), k);
     122        if (toImpl(item)->type() == WKStringGetTypeID()) {
     123            RetainPtr<CFStringRef> name = adoptCF(WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)item));
     124            [names addObject:(NSString *)name.get()];
     125        }
     126    }
     127   
     128    return names;
    104129}
    105130
     
    163188}
    164189
     190- (NSPoint)_convertScreenPointToWindow:(NSPoint)point
     191{
     192    return m_page->screenToWindow(IntPoint(point.x, point.y));
     193}
     194
     195- (id)accessibilityAttributeValue:(NSString *)attribute forParameter:(id)parameter
     196{
     197    WKRetainPtr<WKTypeRef> pageOverlayParameter = 0;
     198   
     199    if ([parameter isKindOfClass:[NSValue class]] && strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) == 0) {
     200        NSPoint point = [self _convertScreenPointToWindow:[(NSValue *)parameter pointValue]];
     201        pageOverlayParameter = WKPointCreate(WKPointMake(point.x, point.y));
     202    }
     203   
     204    WKRetainPtr<WKStringRef> attributeRef = adoptWK(WKStringCreateWithCFString((CFStringRef)attribute));
     205    WKRetainPtr<WKTypeRef> result = adoptWK(m_page->pageOverlayCopyAccessibilityAttributeValue(attributeRef.get(), pageOverlayParameter.get()));
     206    if (!result)
     207        return nil;
     208   
     209    if (toImpl(result.get())->type() == WKStringGetTypeID())
     210        return [(NSString *)WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)result.get()) autorelease];
     211    else if (toImpl(result.get())->type() == WKBooleanGetTypeID())
     212        return [NSNumber numberWithBool:WKBooleanGetValue(static_cast<WKBooleanRef>(result.get()))];
     213
     214    return nil;
     215}
     216
    165217- (BOOL)accessibilityShouldUseUniqueId
    166218{
Note: See TracChangeset for help on using the changeset viewer.