+2011-02-10 Chris Fleizach <cfleizach@apple.com>
+
+ Reviewed by Anders Carlsson.
+
+ AX: AX needs to stop using WebCoreViewFactory
+ https://bugs.webkit.org/show_bug.cgi?id=54153
+
+ WebKit2 no longer uses WebCoreViewFactory, which means that accessibility code needs
+ to get off of it and use WebCoreSystemInterface, like other clients.
+
+ * WebCore.exp.in:
+ * accessibility/AXObjectCache.h:
+ * accessibility/mac/AXObjectCacheMac.mm:
+ (WebCore::AXObjectCache::handleFocusedUIElementChanged):
+ * accessibility/mac/AccessibilityObjectWrapper.h:
+ * accessibility/mac/AccessibilityObjectWrapper.mm:
+ (-[AccessibilityObjectWrapper unregisterUniqueIdForUIElement]):
+ (CFAutoreleaseHelper):
+ (AXObjectIsTextMarker):
+ (AXObjectIsTextMarkerRange):
+ (AXTextMarkerRange):
+ (AXTextMarkerRangeStart):
+ (AXTextMarkerRangeEnd):
+ (textMarkerForVisiblePosition):
+ (-[AccessibilityObjectWrapper textMarkerForVisiblePosition:]):
+ (visiblePositionForTextMarker):
+ (-[AccessibilityObjectWrapper visiblePositionForTextMarker:]):
+ (visiblePositionForStartOfTextMarkerRange):
+ (visiblePositionForEndOfTextMarkerRange):
+ (textMarkerRangeFromMarkers):
+ (AXAttributeStringSetElement):
+ (-[AccessibilityObjectWrapper doAXAttributedStringForTextMarkerRange:]):
+ (textMarkerRangeFromVisiblePositions):
+ (-[AccessibilityObjectWrapper textMarkerRangeFromVisiblePositions:endPosition:]):
+ (-[AccessibilityObjectWrapper visiblePositionRangeForTextMarkerRange:]):
+ (-[AccessibilityObjectWrapper textMarkerRangeForSelection]):
+ (-[AccessibilityObjectWrapper accessibilitySetValue:forAttribute:]):
+ (-[AccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]):
+ * editing/mac/SelectionControllerMac.mm:
+ (WebCore::accessibilityConvertScreenRect):
+ (WebCore::SelectionController::notifyAccessibilityForSelectionChange):
+ * platform/mac/WebCoreSystemInterface.h:
+ * platform/mac/WebCoreSystemInterface.mm:
+
2011-02-10 Alexis Menard <alexis.menard@nokia.com>
Reviewed by Andreas Kling.
#import "TextIterator.h"
#import "WebCoreFrameView.h"
#import "WebCoreObjCExtras.h"
-#import "WebCoreViewFactory.h"
+#import "WebCoreSystemInterface.h"
#import "htmlediting.h"
#import "visible_units.h"
- (void)unregisterUniqueIdForUIElement
{
- [[WebCoreViewFactory sharedFactory] unregisterUniqueIdForUIElement:self];
+ wkUnregisterUniqueIdForElement(self);
}
- (void)detach
return NSAccessibilityUnignoredDescendant(widget->platformWidget());
}
-static WebCoreTextMarker* textMarkerForVisiblePosition(AXObjectCache* cache, const VisiblePosition& visiblePos)
+#pragma mark SystemInterface wrappers
+
+static inline id CFAutoreleaseHelper(CFTypeRef obj)
+{
+ if (obj)
+ CFMakeCollectable(obj);
+ [(id)obj autorelease];
+ return (id)obj;
+}
+
+static inline BOOL AXObjectIsTextMarker(id obj)
+{
+ return obj != nil && CFGetTypeID(obj) == wkGetAXTextMarkerTypeID();
+}
+
+static inline BOOL AXObjectIsTextMarkerRange(id obj)
+{
+ return obj != nil && CFGetTypeID(obj) == wkGetAXTextMarkerRangeTypeID();
+}
+
+static id AXTextMarkerRange(id startMarker, id endMarker)
+{
+ ASSERT(startMarker != nil);
+ ASSERT(endMarker != nil);
+ ASSERT(CFGetTypeID(startMarker) == wkGetAXTextMarkerTypeID());
+ ASSERT(CFGetTypeID(endMarker) == wkGetAXTextMarkerTypeID());
+ return CFAutoreleaseHelper(wkCreateAXTextMarkerRange((CFTypeRef)startMarker, (CFTypeRef)endMarker));
+}
+
+static id AXTextMarkerRangeStart(id range)
+{
+ ASSERT(range != nil);
+ ASSERT(CFGetTypeID(range) == wkGetAXTextMarkerRangeTypeID());
+ return CFAutoreleaseHelper(wkCopyAXTextMarkerRangeStart(range));
+}
+
+static id AXTextMarkerRangeEnd(id range)
+{
+ ASSERT(range != nil);
+ ASSERT(CFGetTypeID(range) == wkGetAXTextMarkerRangeTypeID());
+ return CFAutoreleaseHelper(wkCopyAXTextMarkerRangeEnd(range));
+}
+
+#pragma mark Text Marker helpers
+
+static id textMarkerForVisiblePosition(AXObjectCache* cache, const VisiblePosition& visiblePos)
{
ASSERT(cache);
if (!textMarkerData.axID)
return nil;
- return [[WebCoreViewFactory sharedFactory] textMarkerWithBytes:&textMarkerData length:sizeof(textMarkerData)];
+ return CFAutoreleaseHelper(wkCreateAXTextMarker(&textMarkerData, sizeof(textMarkerData)));
}
-- (WebCoreTextMarker *)textMarkerForVisiblePosition:(const VisiblePosition &)visiblePos
+- (id)textMarkerForVisiblePosition:(const VisiblePosition &)visiblePos
{
return textMarkerForVisiblePosition(m_object->axObjectCache(), visiblePos);
}
-static VisiblePosition visiblePositionForTextMarker(AXObjectCache* cache, WebCoreTextMarker* textMarker)
+static VisiblePosition visiblePositionForTextMarker(AXObjectCache* cache, CFTypeRef textMarker)
{
ASSERT(cache);
if (!textMarker)
return VisiblePosition();
TextMarkerData textMarkerData;
- if (![[WebCoreViewFactory sharedFactory] getBytes:&textMarkerData fromTextMarker:textMarker length:sizeof(textMarkerData)])
+ if (!wkGetBytesFromAXTextMarker(textMarker, &textMarkerData, sizeof(textMarkerData)))
return VisiblePosition();
return cache->visiblePositionForTextMarkerData(textMarkerData);
}
-- (VisiblePosition)visiblePositionForTextMarker:(WebCoreTextMarker *)textMarker
+- (VisiblePosition)visiblePositionForTextMarker:(id)textMarker
{
return visiblePositionForTextMarker(m_object->axObjectCache(), textMarker);
}
-static VisiblePosition visiblePositionForStartOfTextMarkerRange(AXObjectCache *cache, WebCoreTextMarkerRange* textMarkerRange)
+static VisiblePosition visiblePositionForStartOfTextMarkerRange(AXObjectCache *cache, id textMarkerRange)
{
- return visiblePositionForTextMarker(cache, [[WebCoreViewFactory sharedFactory] startOfTextMarkerRange:textMarkerRange]);
+ return visiblePositionForTextMarker(cache, AXTextMarkerRangeStart(textMarkerRange));
}
-static VisiblePosition visiblePositionForEndOfTextMarkerRange(AXObjectCache *cache, WebCoreTextMarkerRange* textMarkerRange)
+static VisiblePosition visiblePositionForEndOfTextMarkerRange(AXObjectCache *cache, id textMarkerRange)
{
- return visiblePositionForTextMarker(cache, [[WebCoreViewFactory sharedFactory] endOfTextMarkerRange:textMarkerRange]);
+ return visiblePositionForTextMarker(cache, AXTextMarkerRangeEnd(textMarkerRange));
}
-static WebCoreTextMarkerRange* textMarkerRangeFromMarkers(WebCoreTextMarker* textMarker1, WebCoreTextMarker* textMarker2)
+static id textMarkerRangeFromMarkers(id textMarker1, id textMarker2)
{
if (!textMarker1 || !textMarker2)
return nil;
- return [[WebCoreViewFactory sharedFactory] textMarkerRangeWithStart:textMarker1 end:textMarker2];
+ return AXTextMarkerRange(textMarker1, textMarker2);
}
static void AXAttributeStringSetFont(NSMutableAttributedString* attrString, NSString* attribute, NSFont* font, NSRange range)
if (!cache)
return;
- AXUIElementRef axElement = [[WebCoreViewFactory sharedFactory] AXUIElementForElement:object->wrapper()];
+ AXUIElementRef axElement = wkCreateAXUIElementRef(object->wrapper());
if (axElement) {
[attrString addAttribute:attribute value:(id)axElement range:range];
CFRelease(axElement);
return [NSString stringWithCharacters:&attachmentChar length:1];
}
-- (NSAttributedString*)doAXAttributedStringForTextMarkerRange:(WebCoreTextMarkerRange*)textMarkerRange
+- (NSAttributedString*)doAXAttributedStringForTextMarkerRange:(id)textMarkerRange
{
if (!m_object)
return nil;
return [attrString autorelease];
}
-static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(AXObjectCache *cache, VisiblePosition startPosition, VisiblePosition endPosition)
+static id textMarkerRangeFromVisiblePositions(AXObjectCache *cache, VisiblePosition startPosition, VisiblePosition endPosition)
{
- WebCoreTextMarker* startTextMarker = textMarkerForVisiblePosition(cache, startPosition);
- WebCoreTextMarker* endTextMarker = textMarkerForVisiblePosition(cache, endPosition);
+ id startTextMarker = textMarkerForVisiblePosition(cache, startPosition);
+ id endTextMarker = textMarkerForVisiblePosition(cache, endPosition);
return textMarkerRangeFromMarkers(startTextMarker, endTextMarker);
}
-- (WebCoreTextMarkerRange *)textMarkerRangeFromVisiblePositions:(VisiblePosition)startPosition endPosition:(VisiblePosition)endPosition
+- (id)textMarkerRangeFromVisiblePositions:(VisiblePosition)startPosition endPosition:(VisiblePosition)endPosition
{
return textMarkerRangeFromVisiblePositions(m_object->axObjectCache(), startPosition, endPosition);
}
return objectAttributes;
}
-- (VisiblePositionRange)visiblePositionRangeForTextMarkerRange:(WebCoreTextMarkerRange*) textMarkerRange
+- (VisiblePositionRange)visiblePositionRangeForTextMarkerRange:(id)textMarkerRange
{
if (!textMarkerRange)
return VisiblePositionRange();
return array;
}
-- (WebCoreTextMarkerRange*)textMarkerRangeForSelection
+- (id)textMarkerRangeForSelection
{
VisibleSelection selection = m_object->selection();
if (selection.isNone())
if (![self updateObjectBackingStore])
return;
- WebCoreTextMarkerRange* textMarkerRange = nil;
+ id textMarkerRange = nil;
NSNumber* number = nil;
NSString* string = nil;
NSRange range = {0, 0};
NSArray* array = nil;
// decode the parameter
- if ([[WebCoreViewFactory sharedFactory] objectIsTextMarkerRange:value])
- textMarkerRange = (WebCoreTextMarkerRange*) value;
+ if (AXObjectIsTextMarkerRange(value))
+ textMarkerRange = value;
else if ([value isKindOfClass:[NSNumber self]])
number = value;
- (id)accessibilityAttributeValue:(NSString*)attribute forParameter:(id)parameter
{
- WebCoreTextMarker* textMarker = nil;
- WebCoreTextMarkerRange* textMarkerRange = nil;
+ id textMarker = nil;
+ id textMarkerRange = nil;
NSNumber* number = nil;
NSArray* array = nil;
RefPtr<AccessibilityObject> uiElement = 0;
// common parameter type check/casting. Nil checks in handlers catch wrong type case.
// NOTE: This assumes nil is not a valid parameter, because it is indistinguishable from
// a parameter of the wrong type.
- if ([[WebCoreViewFactory sharedFactory] objectIsTextMarker:parameter])
- textMarker = (WebCoreTextMarker*) parameter;
+ if (AXObjectIsTextMarker(parameter))
+ textMarker = parameter;
- else if ([[WebCoreViewFactory sharedFactory] objectIsTextMarkerRange:parameter])
- textMarkerRange = (WebCoreTextMarkerRange*) parameter;
+ else if (AXObjectIsTextMarkerRange(parameter))
+ textMarkerRange = parameter;
else if ([parameter isKindOfClass:[AccessibilityObjectWrapper self]])
uiElement = [(AccessibilityObjectWrapper*)parameter accessibilityObject];
if ([array count] < 2)
return nil;
- WebCoreTextMarker* textMarker1 = (WebCoreTextMarker*) [array objectAtIndex:0];
- WebCoreTextMarker* textMarker2 = (WebCoreTextMarker*) [array objectAtIndex:1];
- if (![[WebCoreViewFactory sharedFactory] objectIsTextMarker:textMarker1]
- || ![[WebCoreViewFactory sharedFactory] objectIsTextMarker:textMarker2])
+ id textMarker1 = [array objectAtIndex:0];
+ id textMarker2 = [array objectAtIndex:1];
+ if (!AXObjectIsTextMarker(textMarker1) || !AXObjectIsTextMarker(textMarker2))
return nil;
VisiblePosition visiblePos1 = [self visiblePositionForTextMarker:(textMarker1)];