Title: [153404] trunk/Source/WebKit2
Revision
153404
Author
[email protected]
Date
2013-07-27 16:44:27 -0700 (Sat, 27 Jul 2013)

Log 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:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (153403 => 153404)


--- trunk/Source/WebKit2/ChangeLog	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/ChangeLog	2013-07-27 23:44:27 UTC (rev 153404)
@@ -1,3 +1,39 @@
+2013-07-27  Chris Fleizach  <[email protected]>
+
+        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:]):
+
 2013-07-27  Simon Fraser  <[email protected]>
 
         If entering fullscreen for a window fails, don't leave things in a bad state

Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp	2013-07-27 23:44:27 UTC (rev 153404)
@@ -42,9 +42,16 @@
         return adoptPtr(new PageOverlayClientImpl(client));
     }
 
+    virtual void setAccessibilityClient(WKBundlePageOverlayAccessibilityClient* client)
+    {
+        if (client)
+            m_accessibilityClient = *client;
+    }
+
 private:
     explicit PageOverlayClientImpl(WKBundlePageOverlayClient* client)
         : m_client()
+        , m_accessibilityClient()
     {
         if (client)
             m_client = *client;
@@ -115,7 +122,22 @@
         }
     }
     
+    virtual WKTypeRef copyAccessibilityAttributeValue(PageOverlay* pageOverlay, WKStringRef attribute, WKTypeRef parameter)
+    {
+        if (!m_accessibilityClient.copyAccessibilityAttributeValue)
+            return 0;
+        return m_accessibilityClient.copyAccessibilityAttributeValue(toAPI(pageOverlay), attribute, parameter, m_client.clientInfo);
+    }
+
+    virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay* pageOverlay, bool paramerizedNames)
+    {
+        if (!m_accessibilityClient.copyAccessibilityAttributeNames)
+            return 0;
+        return m_accessibilityClient.copyAccessibilityAttributeNames(toAPI(pageOverlay), paramerizedNames, m_client.clientInfo);
+    }
+    
     WKBundlePageOverlayClient m_client;
+    WKBundlePageOverlayAccessibilityClient m_accessibilityClient;
 };
 
 WKTypeID WKBundlePageOverlayGetTypeID()
@@ -133,6 +155,13 @@
     return toAPI(PageOverlay::create(clientImpl.leakPtr()).leakRef());
 }
 
+void WKBundlePageOverlaySetAccessibilityClient(WKBundlePageOverlayRef bundlePageOverlayRef, WKBundlePageOverlayAccessibilityClient* client)
+{
+    if (client && client->version)
+        return;
+    static_cast<PageOverlayClientImpl*>(toImpl(bundlePageOverlayRef)->client())->setAccessibilityClient(client);
+}
+
 void WKBundlePageOverlaySetNeedsDisplay(WKBundlePageOverlayRef bundlePageOverlayRef, WKRect rect)
 {
     toImpl(bundlePageOverlayRef)->setNeedsDisplay(enclosingIntRect(toFloatRect(rect)));

Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.h (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.h	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.h	2013-07-27 23:44:27 UTC (rev 153404)
@@ -62,13 +62,27 @@
 };
 typedef struct WKBundlePageOverlayClient WKBundlePageOverlayClient;
 
-enum { kWKBundlePageOverlayClientCurrentVersion = 0 };
+enum { kWKBundlePageOverlayClientCurrentVersion = 0 };    
     
+typedef WKTypeRef (*WKAccessibilityAttributeValueCallback)(WKBundlePageOverlayRef pageOverlay, WKStringRef attribute, WKTypeRef parameter, const void* clientInfo);
+typedef WKArrayRef (*WKAccessibilityAttributeNamesCallback)(WKBundlePageOverlayRef pageOverlay, bool parameterizedNames, const void* clientInfo);
+    
+struct WKBundlePageOverlayAccessibilityClient {
+    int                                                                 version;
+    const void *                                                        clientInfo;
+    WKAccessibilityAttributeValueCallback                               copyAccessibilityAttributeValue;
+    WKAccessibilityAttributeNamesCallback                               copyAccessibilityAttributeNames;
+};
+typedef struct WKBundlePageOverlayAccessibilityClient WKBundlePageOverlayAccessibilityClient;
+    
+enum { kWKBundlePageOverlayAccessibilityClientCurrentVersion = 0 };
+    
 WK_EXPORT WKTypeID WKBundlePageOverlayGetTypeID();
 
 WK_EXPORT WKBundlePageOverlayRef WKBundlePageOverlayCreate(WKBundlePageOverlayClient* client);
 WK_EXPORT void WKBundlePageOverlaySetNeedsDisplay(WKBundlePageOverlayRef bundlePageOverlay, WKRect rect);
 WK_EXPORT float WKBundlePageOverlayFractionFadedIn(WKBundlePageOverlayRef bundlePageOverlay);
+WK_EXPORT void WKBundlePageOverlaySetAccessibilityClient(WKBundlePageOverlayRef bundlePageOverlay, WKBundlePageOverlayAccessibilityClient* client);
 
 #ifdef __cplusplus
 }

Modified: trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp	2013-07-27 23:44:27 UTC (rev 153404)
@@ -130,6 +130,16 @@
     return m_client->mouseEvent(this, mouseEvent);
 }
 
+WKTypeRef PageOverlay::copyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter)
+{
+    return m_client->copyAccessibilityAttributeValue(this, attribute, parameter);
+}
+
+WKArrayRef PageOverlay::copyAccessibilityAttributeNames(bool parameterizedNames)
+{
+    return m_client->copyAccessibilityAttributeNames(this, parameterizedNames);
+}
+
 void PageOverlay::startFadeInAnimation()
 {
     m_fractionFadedIn = 0.0;

Modified: trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h	2013-07-27 23:44:27 UTC (rev 153404)
@@ -27,11 +27,13 @@
 #define PageOverlay_h
 
 #include "APIObject.h"
+#include "WKBase.h"
 #include <WebCore/RunLoop.h>
 #include <wtf/PassRefPtr.h>
 
 namespace WebCore {
     class GraphicsContext;
+    class IntPoint;
     class IntRect;
 }
 
@@ -52,6 +54,9 @@
         virtual void didMoveToWebPage(PageOverlay*, WebPage*) = 0;
         virtual void drawRect(PageOverlay*, WebCore::GraphicsContext&, const WebCore::IntRect& dirtyRect) = 0;
         virtual bool mouseEvent(PageOverlay*, const WebMouseEvent&) = 0;
+
+        virtual WKTypeRef copyAccessibilityAttributeValue(PageOverlay*, WKStringRef attribute, WKTypeRef parameter) { return 0; }
+        virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay*, bool parameterizedNames) { return 0; }
     };
 
     static PassRefPtr<PageOverlay> create(Client*);
@@ -64,12 +69,16 @@
     void drawRect(WebCore::GraphicsContext&, const WebCore::IntRect& dirtyRect);
     bool mouseEvent(const WebMouseEvent&);
 
+    WKTypeRef copyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter);
+    WKArrayRef copyAccessibilityAttributeNames(bool parameterizedNames);
+    
     void startFadeInAnimation();
     void startFadeOutAnimation();
     void stopFadeOutAnimation();
 
     float fractionFadedIn() const { return m_fractionFadedIn; }
-
+    Client* client() const { return m_client; }
+    
 protected:
     explicit PageOverlay(Client*);
 

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2013-07-27 23:44:27 UTC (rev 153404)
@@ -1837,7 +1837,33 @@
     send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(gestureEvent.type()), handled));
 }
 #endif
+    
+WKTypeRef WebPage::pageOverlayCopyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter)
+{
+    if (!m_pageOverlays.size())
+        return 0;
+    PageOverlayList::reverse_iterator end = m_pageOverlays.rend();
+    for (PageOverlayList::reverse_iterator it = m_pageOverlays.rbegin(); it != end; ++it) {
+        WKTypeRef value = (*it)->copyAccessibilityAttributeValue(attribute, parameter);
+        if (value)
+            return value;
+    }
+    return 0;
+}
 
+WKArrayRef WebPage::pageOverlayCopyAccessibilityAttributesNames(bool parameterizedNames)
+{
+    if (!m_pageOverlays.size())
+        return 0;
+    PageOverlayList::reverse_iterator end = m_pageOverlays.rend();
+    for (PageOverlayList::reverse_iterator it = m_pageOverlays.rbegin(); it != end; ++it) {
+        WKArrayRef value = (*it)->copyAccessibilityAttributeNames(parameterizedNames);
+        if (value)
+            return value;
+    }
+    return 0;
+}
+
 void WebPage::validateCommand(const String& commandName, uint64_t callbackID)
 {
     bool isEnabled = false;

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2013-07-27 23:44:27 UTC (rev 153404)
@@ -662,6 +662,9 @@
     WebCore::ScrollPinningBehavior scrollPinningBehavior() { return m_scrollPinningBehavior; }
     void setScrollPinningBehavior(uint32_t /* WebCore::ScrollPinningBehavior */ pinning);
 
+    WKTypeRef pageOverlayCopyAccessibilityAttributeValue(WKStringRef attribute, WKTypeRef parameter);
+    WKArrayRef pageOverlayCopyAccessibilityAttributesNames(bool parameterizedNames);
+    
 private:
     WebPage(uint64_t pageID, const WebPageCreationParameters&);
 

Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObject.mm (153403 => 153404)


--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObject.mm	2013-07-27 23:20:15 UTC (rev 153403)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObject.mm	2013-07-27 23:44:27 UTC (rev 153404)
@@ -28,6 +28,12 @@
 
 #import "WebFrame.h"
 #import "WebPage.h"
+#import "WKArray.h"
+#import "WKNumber.h"
+#import "WKRetainPtr.h"
+#import "WKSharedAPICast.h"
+#import "WKString.h"
+#import "WKStringCF.h"
 #import <WebCore/AXObjectCache.h>
 #import <WebCore/Frame.h>
 #import <WebCore/FrameView.h>
@@ -103,6 +109,25 @@
     return m_attributeNames;
 }
 
+- (NSArray *)accessibilityParameterizedAttributeNames
+{
+    WKRetainPtr<WKArrayRef> result = adoptWK(m_page->pageOverlayCopyAccessibilityAttributesNames(true));
+    if (!result)
+        return nil;
+    
+    NSMutableArray *names = [NSMutableArray array];
+    size_t count = WKArrayGetSize(result.get());
+    for (size_t k = 0; k < count; k++) {
+        WKTypeRef item = WKArrayGetItemAtIndex(result.get(), k);
+        if (toImpl(item)->type() == WKStringGetTypeID()) {
+            RetainPtr<CFStringRef> name = adoptCF(WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)item));
+            [names addObject:(NSString *)name.get()];
+        }
+    }
+    
+    return names;
+}
+
 - (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute
 {
     return NO;
@@ -162,6 +187,33 @@
     return nil;
 }
 
+- (NSPoint)_convertScreenPointToWindow:(NSPoint)point
+{
+    return m_page->screenToWindow(IntPoint(point.x, point.y));
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute forParameter:(id)parameter
+{
+    WKRetainPtr<WKTypeRef> pageOverlayParameter = 0;
+    
+    if ([parameter isKindOfClass:[NSValue class]] && strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) == 0) {
+        NSPoint point = [self _convertScreenPointToWindow:[(NSValue *)parameter pointValue]];
+        pageOverlayParameter = WKPointCreate(WKPointMake(point.x, point.y));
+    }
+    
+    WKRetainPtr<WKStringRef> attributeRef = adoptWK(WKStringCreateWithCFString((CFStringRef)attribute));
+    WKRetainPtr<WKTypeRef> result = adoptWK(m_page->pageOverlayCopyAccessibilityAttributeValue(attributeRef.get(), pageOverlayParameter.get()));
+    if (!result)
+        return nil;
+    
+    if (toImpl(result.get())->type() == WKStringGetTypeID())
+        return [(NSString *)WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)result.get()) autorelease];
+    else if (toImpl(result.get())->type() == WKBooleanGetTypeID())
+        return [NSNumber numberWithBool:WKBooleanGetValue(static_cast<WKBooleanRef>(result.get()))];
+
+    return nil;
+}
+
 - (BOOL)accessibilityShouldUseUniqueId
 {
     return YES;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to