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;