Changeset 247671 in webkit


Ignore:
Timestamp:
Jul 20, 2019 3:04:10 PM (5 years ago)
Author:
commit-queue@webkit.org
Message:

Add accessibilityInsertText for text insertion in edit fields.
https://bugs.webkit.org/show_bug.cgi?id=199973

Patch by Andres Gonzalez <Andres Gonzalez> on 2019-07-20
Reviewed by Chris Fleizach.

Source/WebCore:

Tests: accessibility/insert-newline.html

accessibility/ios-simulator/insert-newline.html

Accessibility clients like VoiceOver and Voice Control were entering
text in text fields by replacing the entire content of the field
(SetValue) and then setting the insertion point to the appropriate
offset (SetSelectedTextRange). accessibilityInsertText gives a simpler
interface to clients to insert text at the insertion point location.
In addition, this provides a workaround for the issue encountered with
the previous method when inserting a linebreak.

  • accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::insertText):

  • accessibility/AccessibilityObject.h:
  • accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:

(-[WebAccessibilityObjectWrapper accessibilityInsertText:]):

  • accessibility/mac/WebAccessibilityObjectWrapperMac.mm:

(-[WebAccessibilityObjectWrapper accessibilityInsertText:]):

Tools:

Glue code to run new LayoutTests.

  • WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
  • WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
  • WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:

(WTR::AccessibilityUIElement::insertText):

  • WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:

(WTR::AccessibilityUIElement::insertText):

  • WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:

(WTR::AccessibilityUIElement::insertText):

  • WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp:

(WTR::AccessibilityUIElement::insertText):

LayoutTests:

Tests for inserting a newline in the middle of a text line and checking
that the insertion point and text ranges are correct.

  • accessibility/insert-newline-expected.txt: Added.
  • accessibility/insert-newline.html: Added.
  • accessibility/ios-simulator/insert-newline-expected.txt: Added.
  • accessibility/ios-simulator/insert-newline.html: Added.
Location:
trunk
Files:
2 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r247666 r247671  
     12019-07-20  Andres Gonzalez  <andresg_22@apple.com>
     2
     3        Add accessibilityInsertText for text insertion in edit fields.
     4        https://bugs.webkit.org/show_bug.cgi?id=199973
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Tests for inserting a newline in the middle of a text line and checking
     9        that the insertion point and text ranges are correct.
     10        * accessibility/insert-newline-expected.txt: Added.
     11        * accessibility/insert-newline.html: Added.
     12        * accessibility/ios-simulator/insert-newline-expected.txt: Added.
     13        * accessibility/ios-simulator/insert-newline.html: Added.
     14
    1152019-07-20  Saam Barati  <sbarati@apple.com>
    216
  • trunk/LayoutTests/platform/ios-simulator/TestExpectations

    r247457 r247671  
    44#
    55
     6accessibility/insert-newline.html [ Pass ]
    67css3/font-variant-small-caps-synthesis-coverage.html [ ImageOnlyFailure ]
    78fast/frames/sandboxed-iframe-close-top-noclose.html [ Failure ]
  • trunk/LayoutTests/platform/win/TestExpectations

    r247509 r247671  
    16981698
    16991699webkit.org/b/184676 accessibility/ARIA-reflection.html [ Skip ]
     1700
     1701# Not implemented on Win
     1702accessibility/insert-newline.html [ Skip ]
    17001703
    17011704################################################################################
  • trunk/Source/WebCore/ChangeLog

    r247670 r247671  
     12019-07-20  Andres Gonzalez  <andresg_22@apple.com>
     2
     3        Add accessibilityInsertText for text insertion in edit fields.
     4        https://bugs.webkit.org/show_bug.cgi?id=199973
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Tests: accessibility/insert-newline.html
     9               accessibility/ios-simulator/insert-newline.html
     10
     11        Accessibility clients like VoiceOver and Voice Control were entering
     12        text in text fields by replacing the entire content of the field
     13        (SetValue) and then setting the insertion point to the appropriate
     14        offset (SetSelectedTextRange). accessibilityInsertText gives a simpler
     15        interface to clients to insert text at the insertion point location.
     16        In addition, this provides a workaround for the issue encountered with
     17        the previous method when inserting a linebreak.
     18
     19        * accessibility/AccessibilityObject.cpp:
     20        (WebCore::AccessibilityObject::insertText):
     21        * accessibility/AccessibilityObject.h:
     22        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
     23        (-[WebAccessibilityObjectWrapper accessibilityInsertText:]):
     24        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
     25        (-[WebAccessibilityObjectWrapper accessibilityInsertText:]):
     26
    1272019-07-20  Alexander Mikhaylenko  <exalm7659@gmail.com>
    228
  • trunk/Source/WebCore/accessibility/AccessibilityObject.cpp

    r247367 r247671  
    22762276
    22772277    return false;
     2278}
     2279
     2280bool AccessibilityObject::insertText(const String& text)
     2281{
     2282    if (!renderer() || !is<Element>(node()))
     2283        return false;
     2284
     2285    auto& element = downcast<Element>(*renderer()->node());
     2286
     2287    // Only try to insert text if the field is in editing mode.
     2288    if (!element.shouldUseInputMethod())
     2289        return false;
     2290
     2291    // Use Editor::insertText to mimic typing into the field.
     2292    auto& editor = renderer()->frame().editor();
     2293    return editor.insertText(text, nullptr);
    22782294}
    22792295
  • trunk/Source/WebCore/accessibility/AccessibilityObject.h

    r247367 r247671  
    715715    virtual void setValue(const String&) { }
    716716    bool replaceTextInRange(const String&, const PlainTextRange&);
     717    bool insertText(const String&);
    717718
    718719    virtual void setValue(float) { }
  • trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm

    r247367 r247671  
    25622562}
    25632563
     2564- (BOOL)accessibilityInsertText:(NSString *)text
     2565{
     2566    if (![self _prepareAccessibilityCall])
     2567        return NO;
     2568
     2569    return m_object->insertText(text);
     2570}
     2571
    25642572// A convenience method for getting the accessibility objects of a NSRange. Currently used only by DRT.
    25652573- (NSArray *)elementsForRange:(NSRange)range
  • trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

    r247519 r247671  
    38313831}
    38323832
     3833- (BOOL)accessibilityInsertText:(NSString *)text
     3834{
     3835    if (![self updateObjectBackingStore])
     3836        return NO;
     3837
     3838    return m_object->insertText(text);
     3839}
     3840
    38333841IGNORE_WARNINGS_BEGIN("deprecated-implementations")
    38343842- (void)accessibilitySetValue:(id)value forAttribute:(NSString*)attributeName
  • trunk/Tools/ChangeLog

    r247665 r247671  
     12019-07-20  Andres Gonzalez  <andresg_22@apple.com>
     2
     3        Add accessibilityInsertText for text insertion in edit fields.
     4        https://bugs.webkit.org/show_bug.cgi?id=199973
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Glue code to run new LayoutTests.
     9        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
     10        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
     11        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
     12        (WTR::AccessibilityUIElement::insertText):
     13        * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
     14        (WTR::AccessibilityUIElement::insertText):
     15        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
     16        (WTR::AccessibilityUIElement::insertText):
     17        * WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp:
     18        (WTR::AccessibilityUIElement::insertText):
     19
    1202019-07-19  Zhifei Fang  <zhifei_fang@apple.com>
    221
  • trunk/Tools/DumpRenderTree/AccessibilityUIElement.cpp

    r247071 r247671  
    837837}
    838838
     839static JSValueRef insertTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     840{
     841    if (!argumentCount)
     842        return JSValueMakeUndefined(context);
     843
     844    auto text = adopt(JSValueToStringCopy(context, arguments[0], exception));
     845    return JSValueMakeBoolean(context, toAXElement(thisObject)->insertText(text.get()));
     846}
     847
    839848static JSValueRef attributedStringForTextMarkerRangeContainsAttributeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    840849{
     
    16461655
    16471656bool AccessibilityUIElement::replaceTextInRange(JSStringRef, int, int)
     1657{
     1658    return false;
     1659}
     1660
     1661bool AccessibilityUIElement::insertText(JSStringRef)
    16481662{
    16491663    return false;
     
    19771991        { "resetSelectedTextMarkerRange", resetSelectedTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    19781992        { "replaceTextInRange", replaceTextInRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     1993        { "insertText", insertTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    19791994        { "attributedStringForTextMarkerRangeContainsAttribute", attributedStringForTextMarkerRangeContainsAttributeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    19801995        { "indexForTextMarker", indexForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
  • trunk/Tools/DumpRenderTree/AccessibilityUIElement.h

    r247071 r247671  
    284284    bool setSelectedVisibleTextRange(AccessibilityTextMarkerRange*);
    285285    bool replaceTextInRange(JSStringRef, int position, int length);
     286    bool insertText(JSStringRef);
    286287
    287288    JSRetainPtr<JSStringRef> stringForTextMarkerRange(AccessibilityTextMarkerRange*);
  • trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm

    r247071 r247671  
    7676- (NSArray *)elementsForRange:(NSRange)range;
    7777- (NSString *)selectionRangeString;
     78- (BOOL)accessibilityInsertText:(NSString *)text;
    7879- (CGPoint)accessibilityClickPoint;
    7980- (void)accessibilityModifySelection:(WebCore::TextGranularity)granularity increase:(BOOL)increase;
     
    485486}
    486487
     488bool AccessibilityUIElement::insertText(JSStringRef text)
     489{
     490    return [m_element accessibilityInsertText:[NSString stringWithJSStringRef:text]];
     491}
     492
    487493void AccessibilityUIElement::resetSelectedTextMarkerRange()
    488494{
  • trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm

    r247071 r247671  
    7272@interface NSObject (WebKitAccessibilityAdditions)
    7373- (BOOL)accessibilityReplaceRange:(NSRange)range withText:(NSString *)string;
     74- (BOOL)accessibilityInsertText:(NSString *)text;
    7475- (NSArray *)accessibilityArrayAttributeValues:(NSString *)attribute index:(NSUInteger)index maxCount:(NSUInteger)maxCount;
    7576- (NSUInteger)accessibilityIndexOfChild:(id)child;
     
    17171718}
    17181719
     1720bool AccessibilityUIElement::insertText(JSStringRef text)
     1721{
     1722    BEGIN_AX_OBJC_EXCEPTIONS
     1723    return [m_element accessibilityInsertText:[NSString stringWithJSStringRef:text]];
     1724    END_AX_OBJC_EXCEPTIONS
     1725    return false;
     1726}
     1727
    17191728int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange* range)
    17201729{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h

    r247071 r247671  
    283283    void resetSelectedTextMarkerRange();
    284284    bool replaceTextInRange(JSStringRef, int position, int length);
     285    bool insertText(JSStringRef);
    285286    RefPtr<AccessibilityTextMarker> startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*);
    286287    RefPtr<AccessibilityTextMarker> endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*);
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl

    r247367 r247671  
    211211    void resetSelectedTextMarkerRange();
    212212    boolean replaceTextInRange(DOMString string, long position, long length);
     213    boolean insertText(DOMString text);
    213214    AccessibilityTextMarker startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange range);
    214215    AccessibilityTextMarker endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange range);
  • trunk/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp

    r247349 r247671  
    23332333}
    23342334
     2335bool AccessibilityUIElement::insertText(JSStringRef)
     2336{
     2337    notImplemented();
     2338    return false;
     2339}
     2340
    23352341JSRetainPtr<JSStringRef> AccessibilityUIElement::popupValue() const
    23362342{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm

    r247071 r247671  
    5959- (void)_accessibilitySetSelectedTextRange:(NSRange)range;
    6060- (BOOL)accessibilityReplaceRange:(NSRange)range withText:(NSString *)string;
     61- (BOOL)accessibilityInsertText:(NSString *)text;
    6162- (void)accessibilitySetPostedNotificationCallback:(AXPostedNotificationCallback)function withContext:(void*)context;
    6263- (CGFloat)_accessibilityMinValue;
     
    11641165}
    11651166
     1167bool AccessibilityUIElement::insertText(JSStringRef text)
     1168{
     1169    return [m_element accessibilityInsertText:[NSString stringWithJSStringRef:text]];
     1170}
     1171
    11661172RefPtr<AccessibilityTextMarker> AccessibilityUIElement::textMarkerForPoint(int x, int y)
    11671173{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm

    r247071 r247671  
    7676@interface NSObject (WebKitAccessibilityAdditions)
    7777- (BOOL)accessibilityReplaceRange:(NSRange)range withText:(NSString *)string;
     78- (BOOL)accessibilityInsertText:(NSString *)text;
    7879- (NSArray *)accessibilityArrayAttributeValues:(NSString *)attribute index:(NSUInteger)index maxCount:(NSUInteger)maxCount;
    7980- (NSUInteger)accessibilityIndexOfChild:(id)child;
     
    18771878    return false;
    18781879}
    1879    
     1880
     1881bool AccessibilityUIElement::insertText(JSStringRef text)
     1882{
     1883    BEGIN_AX_OBJC_EXCEPTIONS
     1884    return [m_element accessibilityInsertText:[NSString stringWithJSStringRef:text]];
     1885    END_AX_OBJC_EXCEPTIONS
     1886    return false;
     1887}
     1888
    18801889RefPtr<AccessibilityTextMarker> AccessibilityUIElement::startTextMarkerForBounds(int x, int y, int width, int height)
    18811890{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp

    r247071 r247671  
    992992}
    993993
     994bool AccessibilityUIElement::insertText(JSStringRef)
     995{
     996    notImplemented();
     997    return false;
     998}
     999
    9941000} // namespace  WTF
    9951001
Note: See TracChangeset for help on using the changeset viewer.