зеркало из https://github.com/mozilla/pjs.git
Hookup cocoa widgets to new accessibility support. r=josh, b=342146
Off by default, and cocoa-only.
This commit is contained in:
Родитель
f03a2c9249
Коммит
7a8095aba3
|
@ -82,6 +82,10 @@ REQUIRES += glitz glitzagl
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef ACCESSIBILITY
|
||||||
|
REQUIRES += accessibility
|
||||||
|
endif
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
mozView.h \
|
mozView.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
|
@ -38,7 +38,11 @@
|
||||||
#ifndef nsChildView_h__
|
#ifndef nsChildView_h__
|
||||||
#define nsChildView_h__
|
#define nsChildView_h__
|
||||||
|
|
||||||
|
// formal protocols
|
||||||
#import "mozView.h"
|
#import "mozView.h"
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
#import "mozAccessibleProtocol.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "nsAutoPtr.h"
|
#include "nsAutoPtr.h"
|
||||||
#include "nsISupports.h"
|
#include "nsISupports.h"
|
||||||
|
@ -60,6 +64,7 @@
|
||||||
#include "nsplugindefs.h"
|
#include "nsplugindefs.h"
|
||||||
#include <Quickdraw.h>
|
#include <Quickdraw.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef MOZ_CAIRO_GFX
|
#ifdef MOZ_CAIRO_GFX
|
||||||
class gfxASurface;
|
class gfxASurface;
|
||||||
#endif
|
#endif
|
||||||
|
@ -74,12 +79,18 @@ struct nsPluginPort;
|
||||||
|
|
||||||
class nsChildView;
|
class nsChildView;
|
||||||
|
|
||||||
|
// Depending on whether we're on cairo, and if accessibility is on, we support different @protocols
|
||||||
|
// and have a different superclass.
|
||||||
|
@interface ChildView :
|
||||||
#ifdef MOZ_CAIRO_GFX
|
#ifdef MOZ_CAIRO_GFX
|
||||||
@interface ChildView : NSView<mozView, NSTextInput>
|
NSView<
|
||||||
#else
|
#else
|
||||||
@interface ChildView : NSQuickDrawView<mozView, NSTextInput>
|
NSQuickDrawView<
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
mozAccessible,
|
||||||
|
#endif
|
||||||
|
mozView, NSTextInput>
|
||||||
{
|
{
|
||||||
@private
|
@private
|
||||||
NSWindow* mWindow; // shortcut to the top window, [WEAK]
|
NSWindow* mWindow; // shortcut to the top window, [WEAK]
|
||||||
|
@ -106,6 +117,7 @@ class nsChildView;
|
||||||
// hand scroll locations
|
// hand scroll locations
|
||||||
NSPoint mHandScrollStartMouseLoc;
|
NSPoint mHandScrollStartMouseLoc;
|
||||||
nscoord mHandScrollStartScrollX, mHandScrollStartScrollY;
|
nscoord mHandScrollStartScrollX, mHandScrollStartScrollY;
|
||||||
|
|
||||||
// when menuForEvent: is called, we store its event here (strong)
|
// when menuForEvent: is called, we store its event here (strong)
|
||||||
NSEvent* mLastMenuForEventEvent;
|
NSEvent* mLastMenuForEventEvent;
|
||||||
}
|
}
|
||||||
|
@ -263,6 +275,11 @@ public:
|
||||||
|
|
||||||
void LiveResizeStarted();
|
void LiveResizeStarted();
|
||||||
void LiveResizeEnded();
|
void LiveResizeEnded();
|
||||||
|
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
PRBool DispatchAccessibleEvent(nsIAccessible** aAccessible);
|
||||||
|
void GetDocumentAccessible(nsIAccessible** aAccessible);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_CAIRO_GFX
|
#ifdef MOZ_CAIRO_GFX
|
||||||
virtual gfxASurface* GetThebesSurface();
|
virtual gfxASurface* GetThebesSurface();
|
||||||
|
|
|
@ -79,6 +79,14 @@ CG_EXTERN void CGContextResetClip (CGContextRef);
|
||||||
#include "nsGfxUtils.h" // for StPortSetter
|
#include "nsGfxUtils.h" // for StPortSetter
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
#include "nsIAccessible.h"
|
||||||
|
|
||||||
|
// import the accessible protocol so we can connect the root accessible as a the
|
||||||
|
// direct accessible child of our top ChildView.
|
||||||
|
#import "mozAccessibleProtocol.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static NSView* sLastViewEntered = nil;
|
static NSView* sLastViewEntered = nil;
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3
|
||||||
|
@ -134,6 +142,10 @@ static NSView* sLastViewEntered = nil;
|
||||||
- (void)clickHoldCallback:(id)inEvent;
|
- (void)clickHoldCallback:(id)inEvent;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
- (id<mozAccessible>)accessible;
|
||||||
|
#endif
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
@ -2051,6 +2063,40 @@ nsChildView::GetThebesSurface()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
PRBool
|
||||||
|
nsChildView::DispatchAccessibleEvent(nsIAccessible** aAccessible)
|
||||||
|
{
|
||||||
|
PRBool result = PR_FALSE;
|
||||||
|
nsAccessibleEvent event(PR_TRUE, NS_GETACCESSIBLE, this);
|
||||||
|
|
||||||
|
*aAccessible = nsnull;
|
||||||
|
|
||||||
|
nsEventStatus status;
|
||||||
|
DispatchEvent(&event, status);
|
||||||
|
result = (nsEventStatus_eConsumeNoDefault == status) ? PR_TRUE : PR_FALSE;
|
||||||
|
|
||||||
|
// if the event returned an accessible get it.
|
||||||
|
if (event.accessible)
|
||||||
|
*aAccessible = event.accessible;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsChildView::GetDocumentAccessible(nsIAccessible** aAccessible)
|
||||||
|
{
|
||||||
|
*aAccessible = nsnull;
|
||||||
|
|
||||||
|
// maybe we can figure out a way to cache this?
|
||||||
|
nsIAccessible *acc = nsnull;
|
||||||
|
DispatchAccessibleEvent(&acc);
|
||||||
|
NS_IF_ADDREF(*aAccessible = acc);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
@ -3890,4 +3936,113 @@ static PRBool IsSpecialRaptorKey(UInt32 macKeyCode)
|
||||||
return [scroller floatValue];
|
return [scroller floatValue];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
|
||||||
|
/* Every ChildView has a corresponding mozDocAccessible object that is doing all
|
||||||
|
the heavy lifting. The topmost ChildView corresponds to a mozRootAccessible
|
||||||
|
object.
|
||||||
|
|
||||||
|
All ChildView needs to do is to route all accessibility calls (from the NSAccessibility APIs)
|
||||||
|
down to its object, pretending that they are the same.
|
||||||
|
*/
|
||||||
|
- (id<mozAccessible>)accessible
|
||||||
|
{
|
||||||
|
id <mozAccessible> nativeAccessible = nil;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIAccessible> accessible;
|
||||||
|
mGeckoChild->GetDocumentAccessible (getter_AddRefs (accessible));
|
||||||
|
accessible->GetNativeInterface ((void**)&nativeAccessible);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static PRBool testInit = PR_FALSE;
|
||||||
|
if (!testInit && [[nativeAccessible role] isEqualToString:@"mozRootAccessible"]) {
|
||||||
|
[nativeAccessible printHierarchy];
|
||||||
|
testInit = PR_TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return nativeAccessible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Implementation of formal mozAccessible formal protocol (enabling mozViews
|
||||||
|
to talk to mozAccessible objects in the accessibility module). */
|
||||||
|
|
||||||
|
- (NSString*)role
|
||||||
|
{
|
||||||
|
return [[self accessible] role];
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
- (void)printHierarchy
|
||||||
|
{
|
||||||
|
[[self accessible] printHierarchy];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
|
||||||
|
// general
|
||||||
|
|
||||||
|
- (BOOL)accessibilityIsIgnored
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityIsIgnored];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)accessibilityHitTest:(NSPoint)point
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityHitTest:point];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)accessibilityFocusedUIElement
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityFocusedUIElement];
|
||||||
|
}
|
||||||
|
|
||||||
|
// actions
|
||||||
|
|
||||||
|
- (NSArray*)accessibilityActionNames
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityActionNames];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString*)accessibilityActionDescription:(NSString*)action
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityActionDescription:action];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)accessibilityPerformAction:(NSString*)action
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityPerformAction:action];
|
||||||
|
}
|
||||||
|
|
||||||
|
// attributes
|
||||||
|
|
||||||
|
- (NSArray*)accessibilityAttributeNames
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityAttributeNames];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute
|
||||||
|
{
|
||||||
|
return [[self accessible] accessibilityIsAttributeSettable:attribute];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)accessibilityAttributeValue:(NSString*)attribute
|
||||||
|
{
|
||||||
|
id <mozAccessible> accessible = [self accessible];
|
||||||
|
|
||||||
|
// if we're the root (topmost) accessible, we need to return our native AXParent as we
|
||||||
|
// traverse outside to the hierarchy of whoever embeds us. thus, fall back on NSView's
|
||||||
|
// default implementation for this attribute.
|
||||||
|
if ([attribute isEqualToString:NSAccessibilityParentAttribute] &&
|
||||||
|
[[accessible role] isEqualToString:@"mozRootAccessible"]) {
|
||||||
|
id parentAccessible = [super accessibilityAttributeValue:attribute];
|
||||||
|
return parentAccessible;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [accessible accessibilityAttributeValue:attribute];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ACCESSIBILITY */
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -729,5 +729,13 @@ nsNativeScrollbar::UpdateScroller()
|
||||||
mInTracking = NO;
|
mInTracking = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ACCESSIBILITY
|
||||||
|
// XXXhakan: need to find out what needs to be done here to make these scrollbars accessible.
|
||||||
|
- (BOOL)accessibilityIsIgnored
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче